В продолжение поста об SSH-ключах и их менеджменте на Linux (см. SSH: RSA-ключи и ssh-agent — управление SSH-ключами и их паролями).
Задача заключается в том, что бы упростить работу с ключами, которые требуют ввода пароля для их использования – когда ключей много, то вводить каждый раз пароль может быть реальной головной болью.
Одним из вариантов решения этой задачи может быть KeePass, который будет хранить ключи и их пароли в себе, и будет сам расшифровывать ключ перед использованием.
Для этого используется три компонента – ssh-клиент (ssh
, ssh-add
, git
, etc), сам KeePass с плагином KeeAgent, и ssh-agent
, который будет держать уже расшифрованные ключи в памяти, и отдавать их клиентам.
В примерах ниже используется KeePassXC, но особой разницы в настройке и использовании нет.
В целом схема их взаимодействия получается следующая:
- запускается
ssh-agent
, который создаёт сокет, через который все компоненты системы будут общаться друг с другом - запускается KeePass, который хранит в своей базе ключи и их пароли, и загружает их в
ssh-agent
, используя созданный агентом сокет - запускается любой ssh-клиент, который сокет обращается к агенту, и получает уже расшифрованный ключ
Содержание
Настройка KeePass
Для “чистоты эксперимента” – останавливаем всех запущенных агентов:
[simterm]
[setevoy@setevoy-arch-work ~] $ sudo killall ssh-agent
[/simterm]
Запускаем KeePass, переходим в Tools > Settings > SSH Agent, включаем его:
Перезапускаем KeePass, и видим ошибку “No agent running, cannot add identity“:
Сейчас это ОК, потому что у меня запуск агента ещё не настроен, и вообще мы его выгрузили. Варианты запуска описаны в посте SSH: RSA-ключи и ssh-agent — управление SSH-ключами и их паролями, но сейчас, для примеров, агент остановлен.
Добавление RSA ключа в KeePass
Создаём новый элемент:
В поле Password указываем пароль ключа.
Слева переходим в SSH Agent, через External File выбираем файл:
ssh-agent
Проверяем работу системы.
Запускаем агента вручную:
[simterm]
$ eval “$(ssh-agent -s)”
Agent pid 365774
[/simterm]
Проверяем переменные:
[simterm]
$ env | grep SSH
SSH_AUTH_SOCK=/tmp/ssh-mR9l9Xdx9C8k/agent.1327013
SSH_AGENT_PID=1327014
[/simterm]
Из той же консоли, что бы использовать сокет из переменной $SSH_AUTH_SOCK
, которую задал ssh-agent
, перезапускаем KeePass:
[simterm]
$ keepassxc &
[/simterm]
П проверяем ключи через ssh-add
:
[simterm]
$ ssh-add -l
4096 SHA256:WRTfqnw0TPf26r1Zx8eie2fbgxdq7fYdOKjCOtQbjbg This is comment for the Test Key (RSA)
[/simterm]
Обновляем свой ~/.ssh/confg
, добавляем аутентификацию через ключ, что бы не вводить каждый раз ssh -i /path/to/key
:
Host rtfm Hostname rtfm.co.ua User setevoy IdentityFile /home/setevoy/.ssh/test-key
Пробуем логин:
[simterm]
$ ssh rtfm
…
setevoy@rtfm-do-production:~$
[/simterm]
Работает.
“Require user confirmation when this key is used” и “sign_and_send_pubkey: signing failed: agent refused operation“
Если сейчас в KeePass в настройках ключа включить опцию “Require user confirmation when this key is used“, то при попытке подключения получим ошибку “sign_and_send_pubkey: signing failed: agent refused operation“:
[simterm]
$ ssh rtfm
sign_and_send_pubkey: signing failed: agent refused operation
[email protected]’s password:
[/simterm]
Для решения – устанавливаем ssh-askpass
:
[simterm]
$ sudo pacman -S x11-ssh-askpass
[/simterm]
Задаём переменную $SSH_ASKPASS
:
[simterm]
$ export SSH_ASKPASS=/usr/bin//usr/lib/ssh/ssh-askpass
[/simterm]
И результат при попытке логина:
Тут ещё есть зависимость от самого приложения, по крайней мере в Arch Linux не получилось запустить с openssh-askpass
(/usr/bin/qt4-ssh-askpass
), обсуждение есть тут>>>.
Готово.