Настройка аутентификации на основе SSH-ключей

Для удаленного управления системами Linux необходимо настроить доступ по SSH (secure shell). SSH – это криптографический протокол для управления и взаимодействия с серверами. Существует несколько различных способов подключения к SSH-серверу. В этой статье мы рассмотрим настройку аутентификации на основе ключей SSH.

Многие администраторы по-прежнему используют пароли вместо ключей, хотя ключи не только повышают безопасность, но и облегчают управление системами. Вместо того, чтобы вводить пароль для каждого сервера, достаточно сделать это один раз за сессию. Это особенно удобно, если приходится управлять несколькими системами. После прочтения данной статьи вы удивитесь, почему не отказались раньше от аутентификации на основе паролей.

Статья основана на англоязычной статье. В тексте использованы изображения из оригинальной статьи.

Создание ключа

На локальном компьютере необходимо создать пару ключей, состоящую из открытого и закрытого ключа.

Закрытый ключ должен храниться в секрете. Разумно защитить его паролем, хотя это не обязательно, если вы обеспечиваете безопасность локальной системы.

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

Генерация с помощью PuTTY

Для создания пары ключей пользователи Windows могут использовать утилиту PuTTYgen. Этот инструмент является частью полной установки PuTTY, также его можно скачать отдельно.

Создание пары ключей PuTTYgen

Генерация с помощью ssh-keygen

Пользователи, которые используют Linux (или другую Unix-систему), могут генерировать ключи с помощью команды ssh-keygen, которая входит в стандартный набор инструментов OpenSSH.

Для большей безопасности и скорости работы рекомендуется использовать более новый формат ключей Ed25519. Открытый ключ Ed25519 компактен. Он содержит только 68 символов по сравнению с RSA 3072, который имеет 544 символа. Генерирование ключа также почти так же быстро, как и процесс подписания. Также, при использовании Ed25519, возможно быстро выполнить проверку подписи. Для генерации ключа Ed25519 используйте следующую команду:

ssh-keygen -o -a 100 -t ed25519 -C "john@example.com"

Если удаленный хост не поддерживает такой тип ключей, сгенерируйте классический ключ в формате RSA:

ssh-keygen -o -t rsa -b 4096 -C "john@example.com"

Ответ будет выглядеть подобным образом:

Команда ssh-keygen создает 4096-битный ключ RSA

На сегодняшний день RSA является наиболее широко используемым алгоритмом открытого ключа для SSH. Но по сравнению с Ed25519, он медленнее и даже считается небезопасным, если он генерируется с ключом длиной менее 2048 бит.

Теперь проверьте созданный ключ — его тип и размер.

[root@arch ~]# ssh-keygen -l -f .ssh/id_rsa
 4096 98:eb:9a:f7:94:bf:a0:a1:4b:55:ca:82:c3:24:46:b8 .ssh/id_rsa.pub (RSA)

Копирование ключа на удаленный сервер

Следующий шаг — копирование ключа в удаленную систему. Самый простой путь — использовать утилиту ssh-copy-id. Укажите в команде удаленный хост, к которому нужно подключиться, и аккаунт пользователя сервера. В этот аккаунт утилита скопирует открытый ключ.

ssh-copy-id john@192.168.1.251
...

ssh john@192.168.1.251
...

Другой вариант — сделать это вручную, добавив ключ через копирование и вставку прямо в в текстовом редакторе при редактировании ~/.ssh/authorized_keys. Теперь попробуйте войти в систему и посмотрите, работает ли аутентификация по ключу.

Использование агента

SSH-агент полезен в том случае, если вы используете приватные ключи, защищенные паролем. Без использования SSH-агента вам придется каждый раз вводить вручную пароль ключа при соединении. С точки зрения повышения продуктивности это ничем не лучше ввода пароля для входа, хотя и безопаснее.

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

Использование агента PuTTY (pageant)

В пакете PuTTY доступна служебная программа pageant — это агент аутентификации PuTTY. Запустите утилиту и кликните на иконку в панели задач, чтобы добавить ключ. Введите пароль и все.

При подключении через агента появится подобное сообщение: «Authenticating with public key “rsa-key-20150316″ from agent».

Если подключение без пароля на срабатывает, на это может быть ряд причин:

  • ключ не принят сервером (см. журнал активности PuTTY);
  • файл authorized_keys или каталог ~/.ssh, хранящийся на сервере имеет неверно настроенные права доступа (chmod -R u+rwX,go-rwx ~/.ssh).
  • PuTTY не настроен для использования агента SSH.

Использование утилиты ssh-agent из пакета OpenSSH

Если вы используете Linux или Unix-подобные системы, наиболее вероятно, что в вашей системе используется OpenSSH. В рамках OpenSSH есть утилита ssh-agent, которая предназначена для кэширования расшифрованных ключей.

Для начала работы запустите ssh-agent:

[root@arch .ssh]# ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-zo47izH0ZcYM/agent.1133; export SSH_AUTH_SOCK;
SSH_AGENT_PID=1134; export SSH_AGENT_PID;
echo Agent pid 1134;

Если необходимо, чтобы агент стартовал самостоятельно, необходимо обеспечить его запуск. Самый простой вариант — добавить строку запуска в .bash_profile.

echo 'eval $(ssh-agent)' >> ~/.bash_profile

После этого, вы с помощью ssh-add можете единоразово добавить в кэш агента ключ, защищенный паролем.

ssh-add ~/.ssh/id_rsa

В ответ должно прийти сообщение «identity added». Теперь можно использовать ssh и подключиться к настроенной системе (системам) без ввода не только пароля от удаленной учетной записи, но и от локального приватного ключа.

Загруженный ключ будет доступен в течение всего времени активности вашей пользовательской сессии. Как только вы выйдете из системы, агент перестанет работать и вам буде необходимо добавить ключ заново.

Использование Systemd для запуска ssh-agent

Если вы хотите использовании systemd для запуска агента, необходимо создать файл описания сервиса ~/.config/systemd/user/ssh-agent.service:

[Unit]
Description=SSH key agent

[Service]
Type=forking
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -a $SSH_AUTH_SOCK

[Install]
WantedBy=default.target

Добавьте приведенную ниже строку в shell-файл .profile (например, .bash_profile):

echo 'export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"' >> ~/.bash_profile

Теперь можно активировать и запустить сервис, который будет обслуживать агента SSH:

systemctl --user enable ssh-agent.service
systemctl --user start ssh-agent.service

Настройки на стороне сервера SSH

Чтобы использовать только аутентификацию по ключам, аутентификацию с использованием паролей необходимо отключить. Перед тем, как это сделать, убедитесь, что вход по ключам работает корректно.

Укажите значения параметров в файле /etc/ssh/sshd_config, как показано ниже:

PasswordAuthentication no
ChallengeResponseAuthentication no

Перезапустите демон SSH:

# Ubuntu, Debian
systemctl restart ssh

# CentOS
systemctl restart sshd