# SSH аутентификация по ключу Аутентификация по ключу в SSH (Secure Shell) — это безопасный и удобный способ подключения к удалённому серверу без ввода пароля. При этом вместо пароля используется пара криптографических ключей. Каждая пара ключей состоит из __открытого__ и __закрытого__ ключа. **Закрытый (приватный)** ключ хранится на стороне клиента и не должен быть доступен кому-либо еще. Утечка ключа позволит злоумышленнику войти на сервер. **Открытый (публичный)**, который размещается на удаленном сервере, к которому необходимо получить доступ. Его нужно добавить в специальный файл `~/.ssh/authorized_keys.` Открытый ключ используется для шифрования сообщений, которые можно расшифровать только закрытым ключом. Это свойство и используется для аутентификации с помощью пары ключей. ## Настройка Генерация ключа RSA: ```bash $ ssh-keygen -t rsa ``` можно так же создавать ключ, используя технологию DSA (Digital Signing Algorithm): ```bash $ ssh-keygen -t dsa ``` Для обывателя особенной разницы между этими технологиями нет, обе достаточно надежны. Далее будет предложено определиться с папкой хранения ключа (по умолчанию это `~/.ssh`) После этого попросят ввести _идентификационную фразу_. > (**!**)**Note**: Это не фраза для соединения с удаленным хостом. Она нужна для разблокирования закрытого ключа. > Это необязательное дополнение, которое служит для дополнительной защиты - пока не ввести идентификационную фразу, доступа к закрытому ключу у злоумышленника не будет, даже если у него будет физический доступ к компьютеру. > Если не хотите, то вы можете просто нажать Enter. Тогда доступ по ключу ssh будет выполняться автоматически и вам не нужно будет что-либо вводить. После этого начинается генерация ключа, результатом которой будут два файла **id_rsa** и **id_rsa.pub** (это открытый ключ) в папке ~/.ssh (если была указана эта папка). Затем отправляем открытый ключ на сервер: ```bash $ ssh-copy-id -i ~/.ssh/id_rsa.pub user@host ``` утилита подключится к удаленному хосту и загрузит содержимое ключа id.rsa.pub на сервер, в файл ~/.ssh/authorized_keys. Дальше вы можете выполнять аутентификацию с помощью этого ключа. Если по какой-то причине этот способ не работает, то можно воспользоваться командой: ```bash $ 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-сервис: ```bash 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 ``` {{tag>ssh}}