Работа с 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:

Параметры:

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

Пример:

При использовании без параметров:
1) сначала указать расположение каталога для сохранения ключей (по-умолчанию .ssh/id_rsa)
2) затем дважды указать пароль для шифрования (passphrase), что не обязательно
Будут созданы файлы id_rsa и id_rsa.pub.

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


Сервер SSH

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

Запуск:

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

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

Должны быть выведены 2 строки с надписью LISTEN.


Добавить ключ на сервер

Вариант 1:

Вручную скопировать публичную часть ключа в файл ~/.ssh/authorized_keys  на сервере:

Вариант 2:

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

Пример:

В любом случае сначала будет запрошен пароль для подключения к серверу hostname с логином username.


Подключение к серверу

На Linux можно просто использовать пакет OpenSSH.

Пример:

$ ssh username@hostname -i ~/.ssh/key 

При этом потребуется ввести passphrase к ключу, если он указан.

На Windows – использовать BitVise-SSH или PuTTY.


ssh-agent

Команда ssh-agent предназначена для управления SSH-ключами и их паролями, чтобы не вводить пароль каждый раз при использовании ключа.

Запуск:

Переменные, создаваемые агентом:

SSH_AGENT_PID – PID процесса ssh-agent, которая будет использоваться при, например, ssh-agent -k для остановки агента

SSH_AUTH_SOCK – указывает на путь к unix-сокету, который будут использовать другие процессы для коммуникации с ssh-agent

Запуск:

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

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

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


ssh-add

Команда ssh-add добавляет ключ в ssh-agent.

Пример:

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

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

Проверка:


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

Решение:

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

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

0

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *