Авторизация SSH по ключу
В этой небольшой статье я покажу как подключаться по ssh используя связку ключей. В статье подразумевается что подключение к серверу осуществляется из операционной системы linux (например linux mint).
Связка ключей состоит из открытого и закрытого ключа. Закрытый ключ сохраняется на стороне клиента, а открытый загружается на сервер в специальный файл ~/.ssh/authorized_keys.
Алгоритм авторизации по ключу следующий.
Клиент инициирует соединение с сервером;
Сервер отправляет случайное сообщение клиенту;
Клиент зашифровывает закрытым ключом это сообщение, и посылает серверу;
Сервер расшифровывает это сообщение открытым ключом и если это сообщение верное, то клиент считается аутентифицированным.
Для начала нужно создать связку ключей, делается это с помощью утилиты ssh-keygen.
alex@pc-alex:~$ ssh-keygen

В самом начале у вас система спросит, в какой файл записать ключ (Enter file in which to save the key), если ничего не менять, то система поместит ключ в файл ~/.ssh/id_rsa
Дальше система просит придумать пароль закрытому ключу (Enter passphrase (empty for no passphrase)), его можно оставить пустым, тогда при авторизации на сервере вам не нужно будет вообще вводить пароль.
Но если придумать пароль, то это повысит безопасность:
Пароль будет использоваться только на локальной машине, при расшифровке ключа, это означает, что пароль не передается по сети и не может быть перехвачен злоумышленником.
При утечки закрытого ключа, использовать его можно только узнав еще и пароль.
Закрытый ключ сохраняется в файле ~/.ssh/id_rsa
Открытый в файле ~/.ssh/id_rsa.pub
Дальше нам нужно открытый ключ загрузить на сервер. Например сервер с операционной системой Debian 9.6.
Я хочу подключаться с помощью ключа к серверу под пользователем root. Но для загрузки на сервер нужно хотя бы раз подключится используя пароль.
Debian запрещает по ssh подключаться к себе пользователем root по паролю. Поэтому для начала нужно разрешить подключение по паролю для пользователя root.
Для этого вначале подключимся обычным пользователем:
alex@pc-alex: ssh [email protected]
Зайдем под пользователем root:
user@debian9:~$ su -
Отредактируем конфигурационный файл сервера SSH.
root@debian9:~# nano /etc/ssh/sshd_config
Поправим следующую опцию:
PermitRootLogin yes
Сохраним конфигурационный файл и перезагрузим службу ssh:
root@debian9:~# systemctl restart ssh
Попробую отключиться от сервера и подключится как root пользователь:
root@debian9:~# exit
user@debian9:~$ exit
alex@pc-alex:~$ ssh [email protected]
[email protected]'s password:
root@debian9:~# exit
Как видим используя пароль пользователем root к серверу мы можем подключиться, что на самом деле не безопасно.
Далее нужно передать открытый ключ на сервер, делается это командой ssh-copy-id. Вот так:
alex@pc-alex:~$ ssh-copy-id [email protected]

При этом открытый ключ записывается на сервер в файл ~/.ssh/authorized_keys. Как вариант можно было все выполнить вручную. Подобной командой:
$ cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys»
Можете себя поздравить. После проделанного вы можете подключаться к серверу с помощью ключа. Но нам еще нужно не забыть запретить вход по паролю на сервер:
alex@pc-alex:~$ ssh [email protected]
Enter passphrase for key '/home/alex/.ssh/id_rsa':
root@debian9:~# nano /etc/ssh/sshd_config
Редактируем опции:
PermitRootLogin prohibit-password
PasswordAuthentication no
Сохраняем конфигурационный файл, и перезагружаем службу сервера ssh:
root@debian9:~# systemctl restart ssh
Если удаленный сервер с операционной системой Centos 7, то под пользователем root вы сразу сможете подключиться с помощью пароля. Вам остается только загрузить на сервер открытый ключ:
alex@pc-alex:~$ ssh-copy-id [email protected]
И настроить конфигурационный файл сервера ssh, так как nano нет в Centos сразу после установки, то можно воспользоваться редактором vi:
[root@centos7 ~]# vi /etc/ssh/sshd_config
Редактируем уже знакомые опции:
PermitRootLogin prohibit-password
PasswordAuthentication no
И перезагружаем службу сервера ssh, в centos она называется sshd:
[root@centos7 ~]# systemctl restart sshd
Кстати, если мы теперь попробуем подключиться к серверам с помощью другой учетной записи, для которой у нас нет ключа то не сможем:
alex@pc-alex:~$ ssh [email protected] # centos
[email protected]: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
alex@pc-alex:~$ ssh [email protected] # debian
[email protected]: Permission denied (publickey).
Кстати, мы можем поделиться с кем нибудь нашим приватным ключом (и паролем от него), тогда этот пользователь также сможет подключиться к серверу. Достаточно только создать у этого пользователя файл в домашнем каталоге /root/.ssh/id_rsa с таким же содержимым что и у вас и с правами rw только для владельца, больше никаких прав не должно быть. И этот пользователь также сможет подключаться к серверу со своего компьютера.
Но лучше не передавать таким образом свой ключ, лучше создать у второго пользователя свою связку ключей и передать открытый ключ на сервер. При этом он дозапишется в уже знакомый файл ~/.ssh/authorized_keys на сервере и второй пользователь со своего компьютера сможет подключаться к серверу с помощью своих ключей.
На этом все, спасибо за внимание!
Больше моих статей на IT темы можете найти тут.
