Skip to main content

Авторизация в OpenSSH с использованием публичного ключа

OpenSSHd имеет очень немалое количество механизмов аутентификации, которые в принципе базируются на двух парадигмах - симметричного ключа (пароль) и несимметричного (сертификат). Разница в этих парадигмах довольно незамысловата: в случае использования симметричного ключа копию этого ключа надо хранить на сервере, чтобы при авторизации сравнить хранимое значение со значением, отправленным пользователем. В случае, если значения одинаковы - пароль считается верным и пользователя авторизуют, если значения разные - то нет. Минус пароля в том, что его можно перехватить, после чего пользоваться им без ограничений. Идея сертификата (несимметричного ключа) - более свежая. Она создавалась позже системы на базе пароля и учитывает вышеуказанную уязвимость. Работает эта система на базе двух связанных между собой ключей - открытого и закрытого. Используя открытый ключ, можно зашифровать сообщение, но расшифровать его - нельзя. Расшифровать сообщение можно только закрытым ключом. При этом имея закрытый ключ - можно создать открытый, однако имея открытый - нельзя восстановить закрытый. Кроме того, закрытым ключом можно не только зашифровать, но подписать сообщение - добавить к нему некоторое значение, которое однозначно идентифицирует сообщение. Подписаное сообщение нельзя изменить, при изменении подпись нарушается. При этом, имея открытый ключ можно совершенно однозначно идентифицировать, что подписано сообщение было совершенно определенным закрытым ключом. Но восстановить закрытый ключ или подписать открытым ключом сообщение - снова нельзя. Надеюсь, я не слишком сильно усложнил статью этим кратким экскурсом в практическую криптографию :) Итак, поехали, только практика и ничего кроме практики

Сервер и клиент

Для нормально авторизации по ключу нужно: создать пару закрытый-открытый ключ на клиенте скопировать открытый ключ на сервер Авторизация сработает только в том случае, если она разрешена на сервере, по умолчанию она разрешена. Для начала надо создать папку для ключей на клиенте и поставить там нормальные права:

client$ mkdir ~/.ssh
client$ chmod 700 ~/.ssh

Теперь создадим ключи:

client$ ssh-keygen -q -f ~/.ssh/id_rsa -t rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Passphrase - пароль, которым будет зашифровано содержимое ключа. Можно пароль не вводить, тогда для авторизации вообще не нужно будет ничего вводить, что удобно для роботов-скриптов. На всякий случай - поправим права доступа на ключи:

client$ chmod go-w ~/
client$ chmod 700 ~/.ssh
client$ chmod go-rwx ~/.ssh/*

Теперь отправим ключ на сервер:

client$ scp ~/.ssh/id_rsa.pub [email protected]:~

и там его положим в правильное место:

server$ mkdir ~/.ssh
server$ chmod 700 ~/.ssh
server$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
server$ chmod 600 ~/.ssh/authorized_keys
server$ rm ~/id_rsa.pub

И проверим, что получилось:

client$ ssh -o PreferredAuthentications=publickey server.local.dom
Enter passphrase for key '~/.ssh/id_rsa':
server$

Если что-то пошло не так

Основное место, где отображаются ошибки SSH-сервера - /var/log/auth.log. Основная проблема - неправильные права доступа к ключу SSH (сервер не даст авторизации на ключ со слишком низким уровнем безопасности).