UPD 2021.11.19: подготавливая сервера под сертификацию для банковских проверяющих был рождён sshd_config проходящий аудит ssh-audit.com, найти его можно тут, обещаю переодически актуализировать.
генерируем ключ и задаём ему пароль (для параноиков можно сменить путь хранения файла на какой нибудь безопасный носитель)
ssh-keygen
добавляем содержимое файла ПУБЛИЧНОЙ части ключа (по умолчанию приватная часть ключа это ~/.ssh/id_rsa а публичная это ~/.ssh/id_rsa.pub) в список разрешённых для авторизации
для определённого пользователя это /home/USERNAME/.ssh/authorized_keys, для рута это /root/.ssh/authorized_keys
просто копируем содержимое файла с клиента внутрь файла на сервере
если всё ещё доступен доступ по паролю то можно так:
ssh-copy-id USERNAME@ADDRESS
после чего убеждаемся что при попытке подключиться спрашивается пароль ключа (если есть) а не пользователя на сервере и с ним пускает
правим конфиг ssh сервера (файл /etc/ssh/sshd_config)
в данном случае нас интересуют всего две директивы
PasswordAuthentication no
PubkeyAuthentication yes
после чего перезапускаем демона
systemctl restart sshd.service
создаём конфиг для облегчения жизни (конфиг пользователя находится в папке пользователя /home/USERNAME/.ssh/config, так же есть конфиг для всех пользователей системы /etc/ssh/ssh_config)
содержимое примерно такое:
Host blablabla
User admin
HostName 192.168.XXX.YYY
Host superhost
User root
HostName 192.168.NNN.MMM
IdentityFile /mnt/supersecretpath/oversecurekey
Host *
ForwardAgent yes
IdentityFile /home/USERNAME/.ssh/id_rsa
ForwardX11 yes
ForwardX11Trusted yes
Port 22
Protocol 2
ControlMaster auto
ControlPath /run/user/USERID/ssh-%r@%h:%p
AddKeysToAgent yes
Compression yes
StrictHostKeyChecking accept-new
таким образом команды ssh blablabla и ssh superhost приведут меня на нужный мне сервер под нужной мне учёткой не спрашивая пароля (ключ в память добавляется при первом использовании ssh или руками через ssh-add) и имя нужной мне учётки
конфиг считывается по приницпу первого совпадения поэтому Host * должен идти последним и являть собой совпадение для любых хостов неописанных выше
так же параметры Host * так же добавляются для всех вышестоящих хостов если не были переопределены выше
пояснение параметров:
Host
- краткое имя для хоста по которому в дальнейшем подключаться
User
- имя пользователя под которым подключаться
HostName
- ip или доменное имя по которому подключаться
ForwardAgent
- разрешать использовать ключ с клиента для дальнейшего подключение сквозь этот хост на следующий (ключ не остаётся на машине после отключения)
IdentityFile
- путь до ключа
ForwardX11
- разрешает использовать X over ssh
ControlMaster
и ControlPath
- нужны для того чтобы при необходимости использовать несколько терминалов все они ездили через одну ssh сессию и не поднимали каждый свою (экономит трафик и ресурсы)
AddKeysToAgent
- разрешает добавлять ключ в агент автоматически при первом подключении
Compression
- сжатие
StrictHostKeyChecking accept-new
- при первом подключении разрешает не справшивать у пользователя доверяет ли он хосту