Работа с ssh-ключами

SSH (Secure Shell) – сетевой протокол, используемый для безопасного обмена информацией между двумя компьютерами по зашифрованному каналу.

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

Использовались материалы:
SSH: RSA-ключи и ssh-agent — управление SSH-ключами и их паролями (rtfm.co.ua)
Как создать ключ для авторизации по SSH и добавить его на сервер? (firstvds.ru)


Связка ключей

Связка SSH-ключей (приватный и публичный) используются в паре и не имеют значения по отдельности.

Приватный (закрытый) ключ хранится на устройстве пользователя. Его нельзя никому показывать и отправлять.

Публичный (открытый) ключ хранится на сервере. Его можно свободно показывать и распространять. Он выглядит как строка случайных символов, которые начинаются с ssh-rsa:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ3GIJ.....KZbF2OP2NQACUkwfwh+iSTP username@hostname

Также, дополнительной (но не обязательной) мерой безопасности является установка пароля (passphrase) для доступа к приватному ключу. Если установить пароль, по-умолчанию его потребуется вводить каждый раз при использовании приватного ключа.


Генерация ключей

На Linux:

$ ssh-keygen

Параметры:

-t – тип RSA
-b – длина ключа в битах (по-умолчанию 3072 для RSA)
-f – путь к файлу ключа (по-умолчанию ~/.ssh/id_rsa)
-C – комментарий к ключу (по-умолчанию username@hostname)
-P – пароль для доступа к ключу

Пример:

$ ssh-keygen -t rsa -b 2048 -f ~/.ssh/key -C "Testing key" -P pass
При использовании без параметров:
1) сначала указать расположение каталога для сохранения ключей (по-умолчанию .ssh/id_rsa)
2) затем дважды указать пароль для шифрования (passphrase), что не обязательно
Будут созданы файлы id_rsa и id_rsa.pub.

На Windows ключи можно создать в программе BitVise-SSH или PuTTYgen.


Сервер SSH

Установить пакет OpenSSH:

$ apt install openssh

Запуск:

$ sshd

После чего на порту 8022 открывается порт для подключения.

Проверить работу ssh-сервера на нужном порту можно командой netstat:

$ 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  на сервере:

$ cat ~/.ssh/key.pub | ssh username@hostname 'cat >> ~/.ssh/authorized_keys

Вариант 2:

Использовать утилиту ssh-copy-id, которая выполнит то же самое, но при этом еще проверит права доступа на каталоги и файлы (самая частая проблема при использовании SSH-ключей для аутентификации):

Пример:

$ 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-ключами и их паролями, чтобы не вводить пароль каждый раз при использовании ключа.

Запуск:

$ 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

Запуск:

$ eval $(ssh-agent -s)
, где:
-s – для создания переменных, т.к. не все будут запускать из bash
eval – выполнить экспорт переменных (export SSH_AUTH_SOCK) из output самого ssh-agent

Запуск агента без вывода информации:

$ eval $(ssh-agent) > /dev/null

Проверить, что агент запущен:

$ 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.

Пример:

$ ssh-add ~/.ssh/key
Параметры:
-l – список добавленных ключей
-d – удалить ранее добавленный ключ
-D – удалить ВСЕ добавленные ключи

Чтобы sshgit, например) всегда добавлял ключ в запущенный ssh-agent без явного ручного вызова ssh-add, нужно добавить параметр AddKeysToAgent в ~/.ssh/config со значениме yes, confirm или ask:

$ echo "AddKeysToAgent yes" > ~/.ssh/config

Проверка:

$ 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 не запущен или запущен в другом терминале.

Решение:

Для «чистоты эксперимента» нужно сначала завершить запущеные инстансы агента:

$ killall ssh-agent

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

$ eval $(ssh-agent -s)
Agent pid 4523

2 thoughts on “Работа с ssh-ключами

Добавить комментарий

Ваш адрес email не будет опубликован.