img-bg
Как настроить SSH-ключи
VPS/VDS

SSH, или secure shell, - это зашифрованный протокол, используемый для безопасного администрирования и связи с серверами. При работе с сервером на базе ОС Linux, скорее всего, вы будете проводить большую часть своего времени в терминале, подключенном к вашему серверу через SSH.

В этом руководстве мы сосредоточимся на настройке SSH-ключей для установки в Ubuntu 20.04. SSH-ключи обеспечивают безопасный способ входа на ваш сервер и рекомендуются всем пользователям.

Краткое руководство

В кратком руководстве только команды и минимальное количество информации.

Шаг 1 - создание ключей

Команда для создания ключей:
ssh-keygen
Затем будет уточнение куда сохранить ключи:
Enter file in which to save the key (/your_home/.ssh/id_rsa):
Нажмите Enter, ключ будет загружен в домашнюю директорию пользователя сразу.
Enter passphrase (empty for no passphrase):
Введите любой дополнительный пароль, это необходимо если ключ попадёт в не авторизованному пользователю, он не сможет воспользоваться ключём не введя данный пароль. Но не спешите, главный недостаток - ввод данного пароля каждый раз при входе в систему. Поэтому если вы хотите быстро авторизовываться без лишних моментов, лучше оставить поле пустым.

Шаг 2 — скопировать публичный ключ на сервер

Рекомендуем использовать один из двух методов:
ssh-copy-id username@remote_host 
Альтернативный способ:
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod -R go= ~/.ssh && cat >> ~/.ssh/authorized_keys"
Ключи были скопированы и переходим к последнему шагу.

Шаг 3 - Отключение аутентификации по паролю на вашем сервере

Откройте файл конфигурации SSH сервера:
sudo nano /etc/ssh/sshd_config
Найдите строку PasswordAuthentication и раскоментируйте её:
PasswordAuthentication no
Сохраните и закройте файл, Когда вы закончите, нажав CTRL+X, затем Y, чтобы подтвердить сохранение файла, и, наконец, ENTER, чтобы выйти из nano.
Чтобы действительно активировать эти изменения, нам нужно перезапустить службу sshd:
sudo systemctl restart ssh
Готово

Полное руководство

Шаг 1 - Создание ключей

Первым шагом является создание пары ключей на клиентской машине (обычно это ваш компьютер):
ssh-keygen 
По умолчанию последние версии ssh-keygen создают 3072-битную пару ключей RSA, которая достаточно безопасна для большинства случаев использования (вы можете дополнительно передать флаг -b 4096 для создания наиболее безопасного 4096-битного ключа).

После ввода команды вы должны увидеть следующий вывод:
Generating public/private rsa key pair.
Enter file in which to save the key (/your_home/.ssh/id_rsa):
Нажмите Enter, чтобы сохранить ключи в директории .ssh в вашем домашнем каталоге, или укажите альтернативный путь.

Если вы ранее сгенерировали ключи, будет выведен следующий результат:
/home/your_home/.ssh/id_rsa already exists.
Overwrite (y/n)?
Если вы решите перезаписать ключ на диске, вы больше не сможете войти с помощью предыдущего ключа. Будьте очень осторожны при выборе "yes", так как этот процесс нельзя отменить.

После этого появится следующий шаг:
Enter passphrase (empty for no passphrase):
Здесь вы по желанию можете ввести безопасную парольную фразу, что настоятельно рекомендуется. Парольная фраза добавляет дополнительный уровень безопасности для предотвращения входа в систему неавторизованных пользователей.

Затем вы должны увидеть результат, похожий на следующий:
Your identification has been saved in /your_home/.ssh/id_rsa
Your public key has been saved in /your_home/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:/hk7MJ5n5aiqdfTVUZr+2Qt+qCiS7BIm5Iv0dxrc3ks user@host
The key's randomart image is:
+---[RSA 3072]----+
|                .|
|               + |
|              +  |
| .           o . |
|o       S   . o  |
| + o. .oo. ..  .o|
|o = oooooEo+ ...o|
|.. o *o+=.*+o....|
|    =+=ooB=o.... |
+----[SHA256]-----+
Теперь у вас есть открытый и закрытый ключи, которые вы можете использовать для авторизации. Следующий шаг - разместить открытый ключ на вашем сервере, чтобы вы могли использовать ключ для входа в систему.

Шаг 2 — скопировать публичный ключ на сервер

Самый быстрый способ скопировать открытый ключ на сервер - это использовать утилиту ssh-copy-id. Из-за своей простоты этот метод настоятельно рекомендуется, если он доступен. Если у вас нет ssh-copy-id, доступного на вашем компьютере, вы можете использовать один из двух альтернативных методов, описанных в этом разделе (копирование через SSH на основе пароля или ручное копирование ключа).

Копирование открытого ключа с помощью ssh-copy-id

Инструмент ssh-copy-id по умолчанию включен во многие Linux системы, поэтому он может быть доступен в вашей локальной системе. Чтобы этот метод работал, у вас уже должен быть SSH-доступ на основе пароля к вашему серверу.

Чтобы использовать утилиту, вы указываете удаленный хост, к которому хотите подключиться, и учетную запись пользователя, к которой у вас есть SSH-доступ на основе пароля. Это будет учетная запись, в которую будет скопирован ваш открытый SSH-ключ.

Синтаксис таков:
ssh-copy-id username@remote_host 
Вы можете увидеть следующее сообщение:
The authenticity of host '10.0.0.5 (10.0.0.5)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
Это означает, что ваш локальный компьютер не распознает удаленный хост. Это произойдет при первом подключении к новому хосту. Введите “yes" и нажмите клавишу ENTER, чтобы продолжить.

Затем утилита просканирует вашу локальную учетную запись на наличие ключа id_rsa.pub, который мы создали ранее. Когда найдет ключ, он запросит у вас пароль учетной записи удаленного пользователя:
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:
Введите пароль и нажмите клавишу ENTER. Утилита подключится к учетной записи на удаленном хосте с помощью предоставленного Вами пароля. Затем он скопирует содержимое вашего ключа ~/.ssh/id_rsa.pub в файл в домашнем каталоге удаленной учетной записи ~/.ssh под названием authorized_keys.

Вы должны увидеть следующий вывод:
Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
На данный момент ваш ключ id_rsa.pubбыл загружен в удаленную учетную запись. Вы можете перейти к шагу 3.

Копирование открытого ключа с помощью SSH

Если у вас нет ssh-copy-id, но у вас есть SSH-доступ на основе пароля к учетной записи на вашем сервере, вы можете загрузить свои ключи обычным методом SSH.

Мы можем сделать это с помощью команды cat, чтобы прочитать содержимое открытого SSH-ключа на нашем локальном компьютере и передать его через SSH-соединение на удаленный сервер.

С другой стороны, мы можем убедиться, что каталог ~/.ssh существует и имеет правильные разрешения под учетной записью, которую мы используем.

Затем мы можем вывести содержимое, которое мы передали, в файл с именем authorized_keys в этом каталоге. Мы будем использовать символ >> redirect для добавления содержимого вместо его перезаписи. Это позволит нам добавлять ключи, не разрушая ранее добавленные ключи.

Полная команда выглядит следующим образом:
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod -R go= ~/.ssh && cat >> ~/.ssh/authorized_keys"
Вы можете увидеть следующее сообщение:
The authenticity of host '10.0.0.5 (10.0.0.5')' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
Это означает, что ваш локальный компьютер не распознает удаленный хост. Это произойдет при первом подключении к новому хосту. Введите yes и нажмите ENTER, чтобы продолжить.

После этого вам будет предложено ввести пароль учетной записи удаленного пользователя:
[email protected]'s password:
После ввода пароля содержимое вашего ключа id_rsa.pub будет скопировано в конец файла authorized_keys учетной записи удаленного пользователя. Если это удалось, перейдите к шагу 3.

Шаг 3 - аутентификация на вашем сервере Ubuntu с помощью SSH-ключей

Если вы успешно выполнили одну из описанных выше процедур, вы сможете войти на удаленный хост без предоставления пароля удаленной учетной записи.

Основной процесс тот же:
ssh username@remote_host 
Если вы впервые подключаетесь к этому хосту (если вы использовали последний метод выше), вы можете увидеть что-то вроде этого:
The authenticity of host '10.0.0.5 (10.0.0.5)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
Это означает, что ваш локальный компьютер не распознает удаленный хост. Введите “yes" и нажмите клавишу ENTER, чтобы продолжить.

Если вы не указали кодовую фразу для своего закрытого ключа, вы немедленно войдете в систему. Если вы указали кодовую фразу для закрытого ключа при его создании, вам будет предложено ввести ее сейчас (обратите внимание, что ваши нажатия клавиш не будут отображаться в сеансе терминала для обеспечения безопасности). После проверки подлинности для вас должен открыться новый сеанс оболочки с настроенной учетной записью на сервере.

Если аутентификация на основе ключа прошла успешно, продолжайте изучать, как еще больше обезопасить вашу систему, отключив аутентификацию по паролю.

Шаг 4 - Отключение аутентификации по паролю на вашем сервере

Если вы смогли войти в свою учетную запись с помощью SSH без пароля, вы успешно настроили аутентификацию на основе SSH-ключа для своей учетной записи. Однако ваш механизм аутентификации на основе пароля все еще активен, а это означает, что ваш сервер все еще подвержен атакам грубой силы.

Перед выполнением действий, описанных в этом разделе, убедитесь, что у вас либо настроена аутентификация на основе SSH-ключа для учетной записи root на этом сервере, либо предпочтительно настроена аутентификация на основе SSH-ключа для учетной записи, не являющейся корневой, на этом сервере с привилегиями sudo. Этот шаг заблокирует логины на основе паролей, поэтому крайне важно убедиться, что вы все еще сможете получить административный доступ.

Как только вы подтвердите, что ваша удаленная учетная запись имеет административные привилегии, войдите на свой удаленный сервер с помощью SSH-ключей, либо как root, либо с учетной записью с привилегиями sudo. Затем откройте конфигурационный файл SSH-демона:
sudo nano /etc/ssh/sshd_config
Внутри файла, поиск по директиве под названием PasswordAuthentication. Эта строка может быть закомментирована символом # в начале строки. Раскомментируйте строку, удалив #, и установите значение no. Это отключит вашу возможность входа в систему через SSH с использованием паролей учетной записи:
...
PasswordAuthentication no
...
Сохраните и закройте файл, Когда вы закончите, нажав CTRL+X, затем Y, чтобы подтвердить сохранение файла, и, наконец, ENTER, чтобы выйти из nano. Чтобы действительно активировать эти изменения, нам нужно перезапустить службу sshd:
sudo systemctl restart ssh
В качестве меры предосторожности откройте новое окно терминала и проверьте правильность работы службы SSH перед закрытием текущего сеанса.

Как только вы убедитесь, что ваш SSH-сервис работает правильно, вы можете безопасно закрыть все текущие сеансы сервера.

Демон SSH на вашем сервере теперь реагирует только на аутентификацию на основе SSH-ключа. Логины на основе паролей были отключены.

Заключение

Теперь на вашем сервере должна быть настроена аутентификация на основе SSH-ключа, позволяющая вам входить в систему без предоставления пароля учетной записи.