суббота, 12 ноября 2016 г.

SSH авторизация и доступ по ключу без пароля

Как мы обычно проходим SSH авторизацию?

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