SSH (Secure Shell) – сетевой протокол, используемый для безопасного обмена информацией между двумя компьютерами по зашифрованному каналу.
Аутентификация происходит либо с использованием пароля, либо с помощью SSH-ключей. Доступ по паролю считается небезопасным методом из-за возможности автоматического подбора, поэтому рекомендуется использование SSH-ключей.
Как создать ключ для авторизации по SSH и добавить его на сервер? (firstvds.ru)
Связка ключей
Связка SSH-ключей (приватный и публичный) используются в паре и не имеют значения по отдельности.
Приватный (закрытый) ключ хранится на устройстве пользователя. Его нельзя никому показывать и отправлять.
Публичный (открытый) ключ хранится на сервере. Его можно свободно показывать и распространять. Он выглядит как строка случайных символов, которые начинаются с ssh-rsa:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ3GIJ.....KZbF2OP2NQACUkwfwh+iSTP username@hostname
Также, дополнительной (но не обязательной) мерой безопасности является установка пароля (passphrase) для доступа к приватному ключу. Если установить пароль, по-умолчанию его потребуется вводить каждый раз при использовании приватного ключа.
Генерация ключей
На Linux:
1 |
$ ssh-keygen |
Параметры:
Пример:
1 |
$ ssh-keygen -t rsa -b 2048 -f ~/.ssh/key -C "Testing key" -P pass |
На Windows ключи можно создать в программе BitVise-SSH или PuTTYgen.
Сервер SSH
Установить пакет OpenSSH:
1 |
$ apt install openssh |
Запуск:
1 |
$ sshd |
После чего на порту 8022 открывается порт для подключения.
Проверить работу ssh-сервера на нужном порту можно командой netstat:
1 2 3 |
$ netstat -tunlp | grep 8022 tcp 0 0 0.0.0.0:8022 0.0.0.0:* LISTEN 21140/sshd tcp6 0 0 :::8022 :::* LISTEN 21140/sshd |
Должны быть выведены 2 строки с надписью LISTEN.
Добавить ключ на сервер
Вариант 1:
Вручную скопировать публичную часть ключа в файл ~/.ssh/authorized_keys на сервере:
1 |
$ cat ~/.ssh/key.pub | ssh username@hostname 'cat >> ~/.ssh/authorized_keys |
Вариант 2:
Использовать утилиту ssh-copy-id, которая выполнит то же самое, но при этом еще проверит права доступа на каталоги и файлы (самая частая проблема при использовании SSH-ключей для аутентификации):
Пример:
1 |
$ ssh-copy-id -i ~/.ssh/key username@hostname |
В любом случае сначала будет запрошен пароль для подключения к серверу hostname с логином username.
Подключение к серверу
На Linux можно просто использовать пакет OpenSSH.
Пример:
$ ssh username@hostname -i ~/.ssh/keyПри этом потребуется ввести passphrase к ключу, если он указан.
На Windows – использовать BitVise-SSH или PuTTY.
ssh-agent
Команда ssh-agent предназначена для управления SSH-ключами и их паролями, чтобы не вводить пароль каждый раз при использовании ключа.
Запуск:
1 2 3 4 |
$ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-dMDE5mED77tM/agent.436347; export SSH_AUTH_SOCK; SSH_AGENT_PID=436348; export SSH_AGENT_PID; echo Agent pid 436348; |
Переменные, создаваемые агентом:
SSH_AGENT_PID – PID процесса ssh-agent, которая будет использоваться при, например, ssh-agent -k для остановки агента SSH_AUTH_SOCK – указывает на путь к unix-сокету, который будут использовать другие процессы для коммуникации с ssh-agentЗапуск:
1 |
$ eval $(ssh-agent -s) |
Запуск агента без вывода информации:
1 |
$ eval $(ssh-agent) > /dev/null |
Проверить, что агент запущен:
1 2 3 |
$ ps aux | grep ssh-agent user 1322 0.0 0.0 5796 456 ? Ss Nov30 0:00 ssh-agent -s user 1324 0.0 0.0 5796 2160 ? Ss Nov30 0:00 ssh-agent -s |
ssh-add
Команда ssh-add добавляет ключ в ssh-agent.
Пример:
1 |
$ ssh-add ~/.ssh/key |
Чтобы ssh (и git, например) всегда добавлял ключ в запущенный ssh-agent без явного ручного вызова ssh-add, нужно добавить параметр AddKeysToAgent в ~/.ssh/config со значениме yes, confirm или ask:
1 |
$ echo "AddKeysToAgent yes" > ~/.ssh/config |
Проверка:
1 2 |
$ head -1 ~/.ssh/config AddKeysToAgent yes |
Запуск ssh-agent в разных терминалах
Ошибка:
Could not open a connection to your authentication agent
Причина:
ssh-agent не запущен или запущен в другом терминале.
При запуске новой вкладки в терминале и инициализации новой bash-сесии там не будет переменной $SSH_AUTH_SOCK, и ssh-клиент не сможет получить доступ к ключу.
Проверяем $SSH_AGENT_PID (или $SSH_AUTH_SOCK, т.к. запросы от ssh-add выполняются через сокет, заданный в этой переменной):
$ test -z $SSH_AGENT_PID; echo $?Если переменная пустая, значит ssh-agent не запущен или запущен в другом терминале.
Решение:
Для «чистоты эксперимента» нужно сначала завершить запущеные инстансы агента:
1 |
$ killall ssh-agent |
И запустить агент заново:
1 2 |
$ eval $(ssh-agent -s) Agent pid 4523 |
2 thoughts on “Работа с ssh-ключами”