Это старая версия документа!
Содержание
SSH аутентификация по ключу
Аутентификация по ключу в SSH (Secure Shell) — это безопасный и удобный способ подключения к удалённому серверу без ввода пароля. При этом вместо пароля используется пара криптографических ключей.
Каждая пара ключей состоит из открытого и закрытого ключа.
Закрытый (приватный) ключ хранится на стороне клиента и не должен быть доступен кому-либо еще. Утечка ключа позволит злоумышленнику войти на сервер.
Открытый (публичный), который размещается на удаленном сервере, к которому необходимо получить доступ. Его нужно добавить в специальный файл ~/.ssh/authorized_keys. Открытый ключ используется для шифрования сообщений, которые можно расшифровать только закрытым ключом. Это свойство и используется для аутентификации с помощью пары ключей.
Настройка
Генерация ключа RSA:
$ ssh-keygen -t rsa
можно так же создавать ключ, используя технологию DSA (Digital Signing Algorithm):
$ ssh-keygen -t dsa
Для обывателя особенной разницы между этими технологиями нет, обе достаточно надежны.
Далее будет предложено определиться с папкой хранения ключа (по умолчанию это ~/.ssh)
После этого попросят ввести идентификационную фразу.
(!)Note: Это не фраза для соединения с удаленным хостом. Она нужна для разблокирования закрытого ключа.
Это необязательное дополнение, которое служит для дополнительной защиты - пока не ввести идентификационную фразу, доступа к закрытому ключу у злоумышленника не будет, даже если у него будет физический доступ к компьютеру.
Если не хотите, то вы можете просто нажать Enter. Тогда доступ по ключу ssh будет выполняться автоматически и вам не нужно будет что-либо вводить.
После этого начинается генерация ключа, результатом которой будут два файла id_rsa и id_rsa.pub (это открытый ключ) в папке ~/.ssh (если была указана эта папка).
Затем отправляем открытый ключ на сервер:
$ ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
утилита подключится к удаленному хосту и загрузит содержимое ключа id.rsa.pub на сервер, в файл ~/.ssh/authorized_keys.
Дальше вы можете выполнять аутентификацию с помощью этого ключа.
Если по какой-то причине этот способ не работает, то можно воспользоваться командой:
$ cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
здесь создаём каталог ~/.ssh, а затем поместим наш ключ в файл authorized_keys с помощью символа », это позволит не перезаписывать существующие ключи.
Далее на обоих соединяющихся устройствах необходимо в файле конфигурации /etc/ssh/sshd_config раскомментировать (убрать #) и привести к представленному ниже виду следующий параметр:
# файл настроек /etc/ssh/sshd_config ... PubkeyAuthentication yes
После сохранения сделанных изменений необходимо перезапустить SSH-сервис:
sudo systemctl restart sshd
После этого аутентификация по ключу при SSH-подключении к удаленному серверу должна заработать.
Возникавшие проблемы
SSH: ssh-copy-id: ERROR: No identities found
При копировании ключа на удалённый сервер – ssh-copy-id сообщает указанную ошибку.
Вызвана тем, что ssh-copy-id не может найти файл ключа, но он есть.
В данном случае ошибка была вызвана незапущенным ssh-agent.
Запустить его можно выполнив:
$ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-FYoSA22677/agent.22677; export SSH_AUTH_SOCK; SSH_AGENT_PID=22678; export SSH_AGENT_PID; echo Agent pid 22678;
После этого ключ добавился без проблем.
При соединении удаленный хост продолжал запрашивать пароль, хотя публичный ключ был на него установлен.
Проблема заключалась в том, что ключ не был добавлен в ssh-агент на локальной машине.
Добавляем ключи в агент на локальной машине:
ssh-add ~/.ssh/*
Проверяем что было добавлено:
ssh-add -l
Посмотреть как ssh клиент пытается установить соединение можно так:
ssh -v user@example.com
ssh
