Для удаленного управления системами Linux необходимо настроить доступ по SSH (secure shell). SSH – это криптографический протокол для управления и взаимодействия с серверами. Существует несколько различных способов подключения к SSH-серверу. В этой статье мы рассмотрим настройку аутентификации на основе ключей SSH.
Многие администраторы по-прежнему используют пароли вместо ключей, хотя ключи не только повышают безопасность, но и облегчают управление системами. Вместо того, чтобы вводить пароль для каждого сервера, достаточно сделать это один раз за сессию. Это особенно удобно, если приходится управлять несколькими системами. После прочтения данной статьи вы удивитесь, почему не отказались раньше от аутентификации на основе паролей.
Статья основана на англоязычной статье. В тексте использованы изображения из оригинальной статьи.
Создание ключа
На локальном компьютере необходимо создать пару ключей, состоящую из открытого и закрытого ключа.
Закрытый ключ должен храниться в секрете. Разумно защитить его паролем, хотя это не обязательно, если вы обеспечиваете безопасность локальной системы.
Открытый ключ загружается на удаленную систему, где необходимо настроить аутентификацию по ключам SSH. Этот ключ публичный, он может безопасно храниться на где угодно и раскрываться по требованию.
Генерация с помощью PuTTY
Для создания пары ключей пользователи Windows могут использовать утилиту PuTTYgen. Этот инструмент является частью полной установки PuTTY, также его можно скачать отдельно.
Генерация с помощью 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"
Ответ будет выглядеть подобным образом:
На сегодняшний день 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