- Поддерживаемые версии
- Отсутствует
Вступление
Недавно я писал небольшую статью о важности открытого исходного кода, если вы начинающий разработчик - рекомендую ознакомиться.Сегодня же хочу поговорить о не менее важной вещи, которая может значительно повысить безопасность вашего сервера - SSH ключах. Дело в том, что даже сейчас далеко не каждый задумывается об этом и держит SSH с входом по паролю (зачастую ещё и на стандартном 22 порту с паролем от хостера). И как бы не казалось что это безопасно, это далеко не всегда так.
Теория
Для начала быстро рассмотрим что вообще такое ключи. Если кратко, ключи это набор символов для шифрования и расшифровки каких-либо данных. Ключи могут быть публичными и приватными. А в чём разница?Всё очень просто:
- Публичный ключ используется только для шифрования данных, и его можно распространять без опасений - даже если публичный ключ попадёт "не в те руки", он бесполезен без приватного ключа.
- Приватный ключ уже используется для расшифровки, и в отличие от публичного этим ключом делиться не стоит, и хранить его стоит в безопасности.
Итак, с ключами разобрались. А как же они относятся к SSH? Дело в том, что SSH это зашифрованный протокол и для работы он как раз и использует ключи. Если интересно почитать подробнее, можете загуглить.
Практика
С теорией разобрались, теперь приступим к практике: для начала нам нужно сгенерировать эти самые ключи. Сразу скажу, что в данном примере мы не будем использовать сторонние программы, такие как Putty, а воспользуемся внутренними средствами ОС.Примечание: чтобы подключиться по SSH указать порт используйте команду вида:
Bash:
ssh user@123.123.123.123 -p 19253
user
- имя пользователя123.123.123.123
- IP адрес сервера19253
- порт, на котором открыт SSH, по умолчанию 22. Если не меняли, аргумент-p порт
можно не указывать
SSH ключи могут быть для разных алгоритмов шифрования. Из популярных: RSA, ECDSA и ED25519. Самый старый из них RSA будет поддерживаться везде. Сейчас рекомендуется использовать ED25519, но он может не поддерживаться на старых ОС, и тогда остаётся использовать ECDSA, но он уязвим к квантовым атакам. Мы же будем использовать как раз ED25519, так как это один из самых используемых алгоритмов шифрования на данный момент.
Открываем командную строку и пишем:
ssh-keygen -t формат
. Например, для ED25519 это будет выглядеть как ssh-keygen -t ed25519
. Также по желанию можно добавить комментарий аргументом -c "комментарий"
, он используется для идентификации ключей если их много.Приступим: при вводе команды у нас запрашивает путь для сохранения ключа, оставим стандартный
/home/username/.ssh/id_ed25519
, для этого нажмём ENTER. Далее у нас запрашивает кодовую фразу (пароль), придумываем и пишем (при вводе символы не показываются) и вводим её второй раз.Готово! После использования нам выведет куда сохранён ключ и визуализация этого ключа:
Код:
Your identification has been saved in /home/username/.ssh/id_ed25519
Your public key has been saved in /home/username/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:y0yvOrfcxrGSSddUkAlZ0MjbGiraLw8sbpOVzYjnRs4 username@hostname
The key's randomart image is:
+--[ED25519 256]--+
| .oBo+ |
| + + . |
| o . |
| o o |
| . =S. = |
| ..B+=o+ . |
| .@oo+=.o |
| .=.Eo=o+ |
| ..o.B*+. |
+----[SHA256]-----+
Примечание:
~
это путь к домашней папке пользователя (например, /home/username
или C:\Users\username
для пользователя username).У нас создались 2 файла в папке
~/.ssh
:id_ed25519
- приватный ключid_ed25519.pub
- публичный ключ
Публичный ключ
Приватный ключ
БУДЬТЕ ОСТОРОЖНЫ И НЕ РАСПРОСТРАНЯЙТЕ РЕАЛЬНЫЙ ПРИВАТНЫЙ КЛЮЧ
id_ed25519.pub
Код:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKYC8jCyHhhR/z8t2fElyqInj/0kJDjAEoHfe0wOGJQR username@hostname
Приватный ключ
id_ed25519
Код:
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACCmAvIwsh4YUf8/LdnxJcqiJ4/9JCQ4wBKB33tMDhiUEQAAAJgeZngnHmZ4
JwAAAAtzc2gtZWQyNTUxOQAAACCmAvIwsh4YUf8/LdnxJcqiJ4/9JCQ4wBKB33tMDhiUEQ
AAAEB9Ldi0kJt8UbvEHwBDF63PuybGrBXBQw27/+KY0rAVYaYC8jCyHhhR/z8t2fElyqIn
j/0kJDjAEoHfe0wOGJQRAAAAEmRyYWtvc2hhc2x2QHVidW50dQECAw==
-----END OPENSSH PRIVATE KEY-----
БУДЬТЕ ОСТОРОЖНЫ И НЕ РАСПРОСТРАНЯЙТЕ РЕАЛЬНЫЙ ПРИВАТНЫЙ КЛЮЧ
ВНИМАНИЕ: Не перепутайте приватный и публичный ключи!!!
Следующий шаг: добавить этот ключ на сервер. Просто подключаемся по SSH к нашему серверу как обычно и открываем файл
/root/.ssh/authorized_keys
через любой текстовый редактор, например nano, который мы и будем использовать в этом примере.Итоговая команда будет выглядеть как:
Bash:
nano /root/.ssh/authorized_keys
Открываем файл и вставляем наш публичный ключ через
CTRL + SHIFT + V
, сохраняем через CTRL + S
и закрываем документ через CTRL + X
. Теперь перезагрузим SSH на сервере:Если у вас Debian/Ubuntu используем команду:
Bash:
sudo service ssh restart
Если у вас CentOS/Fedora/Rocky используем команду:
Bash:
sudo service sshd restart
Теперь проверяем: отключимся и заново подключимся через встроенный SSH клиент в системе:
Bash:
ssh user@123.123.123.123
Продолжаем, теперь нужно сделать ещё 2 вещи: отключить вход по обычному паролю и изменить порт SSH. Для этого открываем файл
/etc/ssh/sshd_config
через текстовый редактор как и выше:
Bash:
sudo nano /etc/ssh/sshd_config
Нас в них интересуют такие строки как
PasswordAuthentication
и Port
. В строке PasswordAuthentication
ставим no
:
Код:
PasswordAuthentication no
А в
Port
ставим любое число от 0 до 65535. Например, можно сгенерировать случайное число тут. В примере импользуем 19253:
Код:
Port 19253
Теперь точно также как и выше сохраняем через
CTRL + S
и закрываем через CTRL + X
.Оставлять стандартный 22 порт крайне нежелательно, поскольку ваш сервер могут начать брутить (brute force - метод "грубой силы", полный перебор значений).
Итак, теперь важно открыть этот порт (в нашем примере - 19253) чтобы вы могли подключиться к серверу.
Если у вас Ubuntu/Debian используем команду:
Bash:
sudo ufw allow 19253/tcp
sudo ufw reload
Если у вас CentOS/Fedora/Rocky используем команду:
Bash:
sudo firewall-cmd --zone=public --add-port=19253/tcp --permanent
sudo firewall-cmd --reload
Теперь перезагрузим службу SSH
Если у вас Ubuntu/Debian используем команду:
Bash:
sudo service ssh restart
Если у вас CentOS/Fedora/Rocky используем команду:
Bash:
sudo service sshd restart
Готово! Теперь вы используете для авторизации по SSH связку ключей. Если вы считаете что есть чем дополнить статью, пишите в обсуждение