Linux: KeePass, SSH и хранение паролей RSA-ключей

Автор: | 03/12/2019

В продолжение поста об SSH-ключах и их менеджменте на Linux (см. SSH: RSA-ключи и ssh-agent — управление SSH-ключами и их паролями).

Задача заключается в том, что бы упростить работу с ключами, которые требуют ввода пароля для их использования – когда ключей много, то вводить каждый раз пароль может быть реальной головной болью.

Одним из вариантов решения этой задачи может быть KeePass, который будет хранить ключи и их пароли в себе, и будет сам расшифровывать ключ перед использованием.

Для этого используется три компонента – ssh-клиент (ssh, ssh-add, git, etc), сам KeePass с плагином KeeAgent, и ssh-agent, который будет держать уже расшифрованные ключи в памяти, и отдавать их клиентам.

В примерах ниже используется KeePassXC, но особой разницы в настройке и использовании нет.

В целом схема их взаимодействия получается следующая:

  1. запускается ssh-agent, который создаёт сокет, через который все компоненты системы будут общаться друг с другом
  2. запускается KeePass, который хранит в своей базе ключи и их пароли, и загружает их в ssh-agent, используя созданный агентом сокет
  3. запускается любой 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), обсуждение есть тут>>>.

Готово.