ssh

Про fingerprint

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

При подключении к серверу по SSH, клиент проверяет fingerprint открытого ключа сервера с сохраненным в локальном кэше. Если fingerprint не совпадает, это может свидетельствовать о возможной атаке MITM.

Fingerprint SSH-ключа защищает от атак MITM и позволяет проверить подлинность ключа сервера. Важно хранить fingerprint ключа в безопасном месте и не доверять подключениям с неизвестными fingerprint-ами.

Посмотреть известные отпечатки можно в файле ~/.ssh/known_hosts


Подключение по ssh ключам

Если нет ключа - создай

ssh-keygen

Закинуть публичный ключ на сервер можно специальной командой:

ssh-copy-id -i /path/to/ssh-key.pub -p <port> username@server-address
# ssh
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 2594 test@192.168.1.14

Публичный ключ сохранится на сервере в файле ~/.ssh/authorized_keys.
Можно и самому содержимое id_rsa.pub вставить в ~/.ssh/authorized_keys - та же самая операция, по сути.

Теперь надо отключить авторизацию по паролю. На сервере выполняем:

sudo vim /etc/ssh/sshd_config

И в vim-е надо:

  • Раскомментировать строку PasswordAuthentication и выставить значение no.
  • Проверить, чтобы директива ChallengeResponseAuthentication выставлена no.
  • Выставить UsePAM на no
    PAM (Pluggable Authentication Modules) является модульной системой аутентификации, которая позволяет использовать различные методы аутентификации. Если параметр UsePAM установлен в “yes”, OpenSSH сервер будет использовать PAM для проверки учетных данных пользователей. Если параметр UsePAM установлен в “no”, OpenSSH сервер будет использовать встроенную систему аутентификации.
    Параметр UsePAM может быть полезен, если необходимо настроить дополнительные функции аутентификации, которые не поддерживаются встроенной системой аутентификации OpenSSH, например, двухфакторную аутентификацию, проверку наличия пользователя в определенной группе и т.д. Однако, использование PAM может увеличить нагрузку на сервер и ухудшить производительность, поэтому рекомендуется использовать этот параметр.
  • И убрать возможность логиниться в root (ради безопасности (я обычно и порт меняю с дефолтного на 2594, к примеру)), то есть выставить PermitRootLogin значение no

В итоге должно получиться так:

Port 2594
PubkeyAuthentication yes
PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no

Чтобы изменения вступили в силу, надо рестартнуть sshd:

sudo systemctl restart sshd

После этого может вылезти предупреждение о том, что fingerprint SSH ключа сервера не соответствует fingerprint-у, который был сохранен в файле known_hosts на нашем пк. Там же ssh предложит выполнить команду, которая всё исправит, удалив старый отпечаток:

# по типу такого
ssh-keygen -f "/home/${USER}/.ssh/known_hosts" -R "[192.168.1.14]:2594"

И под конец можно еще добавить приватный ключ в ssh-agent, чтобы он не спрашивал каждый раз passphrase, и если у тебя ssh ключей много для разных целей, то это как раз и поможет ssh-agent-у понять - какой ключ использовать для подключения к серверу, и не будет просить указать нужный ключ:

ssh-add /path/to/private_key
# В моем случае:
ssh-add ~/.ssh/id_rsa
# Посмотреть добавленные ключи можно так:
ssh-add -l

Но ssh-agent работает только во время сессии - если ребутнуть пк, то придется заново вводить всё.

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

Запуск локальных скриптов по ssh

ssh myserver bash < ./some_script.sh

При чем, вывод скрипта возвращается в локальную систему (которую можно перенаправить).


sshtoolnetwork