Как мы обычно проходим SSH авторизацию?
Затем ищем где-то пароль, копируем его, и, если всё успешно, попадаем на сервер. Какие проблемы есть с таким подходом?
Во-первых, конечно, под
Теперь зайти по SSH под пользователем
Вторая проблема - использование пароля при каждом SSH соединении. Это а) неудобно (хороший пароль очень длинный и запомнить его почти невозможно, поэтому надо где-то хранить и постоянно копировать); б) небезопасно, так как пароль может быть украден, если сервер взломан. Выход из этих проблем есть - SSH авторизация и аутентификация по специальному ключу без пароля.
SSH ключ состоит из двух частей (файлов) - открытой и закрытой, открытая хранится в домашнем каталоге удалённого пользователя (
Генерируем ключи и переносим их в ~/.ssh/:
Команда спрашивает пароль на ключ, вводим произвольный пароль. Создастся два файла:
Запрашиваемый пароль - это пароль доступа пользователя
Теперь можно заходить на сервер без ввода пароля:
Если сервер не имеет домена (доступ только по IP), то, чтобы не копировать каждый раз IP, можно упросить авторизацию, создав команду логина и выполняя её:
Перезапустим терминал, появится команда
ssh root@server.ru
Затем ищем где-то пароль, копируем его, и, если всё успешно, попадаем на сервер. Какие проблемы есть с таким подходом?
Во-первых, конечно, под
root
заходить на сервер сразу по SSH затея плохая и такую возможность надо сразу отключить, это опасно. Поэтому: а) создаём пользователя, например, www
; б) даём ему возможность логиниться на сервер по SSH; в) логиниться root
пользователю по SSH запрещаем:# создаём юзера www
adduser www
# позволяем ему выполнять sudo команды с root правами
adduser www sudo
# позволяем ему заходить по SSH, а root пользователю запрещаем
vi /etc/ssh/sshd_config
AllowUsers www
PermitRootLogin no
# выходим из vi, перезагружаем SSH сервер
sudo /etc/init.d/ssh start
Теперь зайти по SSH под пользователем
root
на сервер мы не сможем, но можем зайти под пользователем www
, который сможет выполнять команды с правами root
, используя sudo
, например, sudo vim /etc/hosts
.Вторая проблема - использование пароля при каждом SSH соединении. Это а) неудобно (хороший пароль очень длинный и запомнить его почти невозможно, поэтому надо где-то хранить и постоянно копировать); б) небезопасно, так как пароль может быть украден, если сервер взломан. Выход из этих проблем есть - SSH авторизация и аутентификация по специальному ключу без пароля.
SSH ключ состоит из двух частей (файлов) - открытой и закрытой, открытая хранится в домашнем каталоге удалённого пользователя (
www
в нашем случае) на удалённом сервере, закрытая в домашнем каталоге локального пользователя (то есть нашего компьютера). При таком подходе украсть открытую часть будет недостаточно для проведения аутентификации, нужна ещё закрытая часть, которая хранится у нас на локальном компьютере. Плюс - можно настроить SSH подключение к серверу без ввода пароля.Генерируем ключи и переносим их в ~/.ssh/:
mkdir keys; cd keys;
ssh-keygen -t rsa -f www
mv www* ~/.ssh/
Команда спрашивает пароль на ключ, вводим произвольный пароль. Создастся два файла:
~/.ssh/id_rsa.pub
- публичный ключ, который копируется на сервер;~/.ssh/id_rsa
- закрытый ключ, который остаётся у нас.
ssh-copy-id -i ~/.ssh/www www@server.ru
Запрашиваемый пароль - это пароль доступа пользователя
www
на сервер, то есть заданный при создании пользователя www. Если SSH на сервере на нестандартном порту, то нужно передать порт следующим образом:ssh-copy-id '-p 443 www@server.ru'
Теперь можно заходить на сервер без ввода пароля:
ssh www@server.ru
Если сервер не имеет домена (доступ только по IP), то, чтобы не копировать каждый раз IP, можно упросить авторизацию, создав команду логина и выполняя её:
vim ~/.bashrc
alias ssh_www_server='ssh www@server'
Перезапустим терминал, появится команда
ssh_www_server
, которая быстро и безопасно пустит нас на сервер - без копипаста IP сервера и пароля на SSH:ssh_www_server