Создание и настройка ssh ключей
Содержание
Вскользь я уже упоминал об этом https://lexusalex.ru/11-ssh-authentication-by-key
Сегодня расширим информацию.
SSH клиент - это программа для подключения к SSH серверу.
Подключится на сервер можно используя:
- пароль
- ключ
Про вход по ключу сегодня и поговорим.
! Важно понимать кто в данным момент является сервером, а кто клиентом!
Клиент всегда подключается к серверу, но сервер тоже в определенным момент может являться клиентом.
Немного про ключи
На клиенте нужно сгенерировать пару зашифрованных ключей:
- публичный (public)
- приватный (private)
Приватный или закрытый ключ используется клиентом и должен быть надежно защищен. Открытый или публичный ключ можно свободно передавать на сервер, он используется для шифрования сообщений, которые можно расшифровать только приватным ключом.
Открытый ключ клиента выгружается на сервер в файл ~/.ssh/authorized_keys
в директории пользователя, под которым
осуществляется вход. Задача любым способом передать открытый ключ на сервер.
Когда клиент пытается пройти аутентификацию с использованием ключей, сервер может протестировать клиент на наличие у него закрытого ключа. Если клиент может доказать, что у него есть закрытый ключ, сервер выполняет запрошенную команду или открывает сеанс соединения. В противном случае доступ не предоставляется.
Клиент
Для генерации ключа используется программа ssh-keygen
.
В самом примитивном случае сгенерировать пару ключей очень просто таким образом
ssh-keygen -t rsa
ssh-keygen # что тоже самое
Типы и генерация ключей
Команда поддерживает создание ключей по следующим алгоритмам:
- dsa - небезопасен к использованию
- ecdsa
- ecdsa-sk
- ed25519 - самый рекомендуемый алгоритм доступный сегодня. Открытый ключ такого алгоритма компактен и быстро работает
- ed25519-sk
- rsa - только если его длина 4096 бит, тогда все хорошо, по умолчанию это 2048, что вполне допустимо
Флаг -t
как раз отвечает за алгоритм шифрования.
Создадим еще несколько ключей, но с другими именами, так как с этим именем у нас уже есть. Один без парольной фразы, другой с ней.
ssh-keygen -t ed25519 -f ~/.ssh/my_key_1_ed25519 -C "alexsey_89@bk.ru" # Без passphrase
ssh-keygen -t ed25519 -f ~/.ssh/my_key_2_ed25519 -C "alexsey_89@bk.ru" # C passphrase
Флаг -f
место куда сохранить пару ключей.
Флаг -C
комментарий в теле публичного ключа.
Просмотреть отпечаток ключа можно командой ssh-keygen -l -v -f ~/.ssh/my_key_1_ed25519.pub
.
Вывести публичный ключ указав в нем путь до приватного ssh-keygen -y -f ~/.ssh/my_key_1_ed25519
.
Если у приватного ключа не будет установлены права 600
, программа ssh-keygen
будет выводить ошибку.
Если нужно настроить более точно к каким хостам можно подключаться нужно создать конфигурационный файл ~/.ssh/config
.
Ключи привязываются к пользователю, для каждого из них нужно генерировать свои ключи, отдельно.
Фаил known_hosts
В файле known_hosts
хранится список публичных ключей хостов к которым мы подключаемся с данного клиента.
Этот файл аутентифицируем клиента на сервере к которому он подключается.
При первом подключении к серверу видим приблизительно такое сообщение:
The authenticity of host 'github.com (140.82.121.4)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?
The authenticity of host '[192.168.88.155] ([192.168.88.155])' can't be established.
ED25519 key fingerprint is SHA256:f7Ahp2Y7EmWX5Rxl/JJl26+Rb1Q6jMWeZKnaHJPAhVI.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Публичный ключ в этом файле должен совпадать с публичным ключом на сервере в каталоге /etc/ssh/
Как передать ключ на сервер
Теперь нужно безопасным способом передать ключ на сервер и сохранить в файле ~/.ssh/authorized_keys
Каждая строка файла содержит один ключ (пустые строки, и строки начинающиеся с ‘#’ игнорируются как комментарии).
Публичные ключи состоят из следующих разделённых пробелами полей: опции, тип ключа, ключ в кодировке base64, комментарий.
Тип ключа может быть указан так
- ecdsa-sha2-nistp256
- ecdsa-sha2-nistp384
- ecdsa-sha2-nistp521
- ssh-ed25519
- ssh-dsa
- ssh-rsa
Теперь перейдем к способам передачи ключа на сервер:
ssh-copy-id -i ~/.ssh/my_key_1_ed25519.pub alex@192.168.88.155
ssh-copy-id -i ~/.ssh/my_key_2_ed25519.pub alex@192.168.88.155 # Это ключ с парольной фразой, при входе она будет запрашиваться
# либо такие команды
cat ~/.ssh/my_key_1_ed25519.pub | ssh alex@192.168.88.155 'cat >> ~/.ssh/authorized_keys'
cat ~/.ssh/my_key_1_ed25519.pub | ssh alex@192.168.88.155 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" # Немного видоизменили команду, теперь она еще и проверяет наличие папки ./ssh
xclip -selection clipboard < ~/.ssh/my_key_1_ed25519.pub # Скопировать в буфер обмена
scp ~/.ssh/my_key_1_ed25519.pub | ssh alex@192.168.88.155 'cat >> ~/.ssh/authorized_keys' # Но здесь не идет проверка на существование ключа
И после этого мы без труда сможет зайти на сервер, без каких-либо проблем