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

Автор: | 12/03/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

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

[setevoy@setevoy-arch-work ~]  $ sudo killall ssh-agent

Запускаем 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

Проверяем работу системы.

Запускаем агента вручную:

eval «$(ssh-agent -s)»
Agent pid 365774

Проверяем переменные:

env | grep SSH
SSH_AUTH_SOCK=/tmp/ssh-mR9l9Xdx9C8k/agent.1327013
SSH_AGENT_PID=1327014

Из той же консоли, что бы использовать сокет из переменной $SSH_AUTH_SOCK, которую задал ssh-agent, перезапускаем KeePass:

keepassxc &

П проверяем ключи через ssh-add:

ssh-add -l
4096 SHA256:WRTfqnw0TPf26r1Zx8eie2fbgxdq7fYdOKjCOtQbjbg This is comment for the Test Key (RSA)

Обновляем свой ~/.ssh/confg, добавляем аутентификацию через ключ, что бы не вводить каждый раз ssh -i /path/to/key:

Host rtfm
  Hostname rtfm.co.ua
  User setevoy
  IdentityFile /home/setevoy/.ssh/test-key

Пробуем логин:

ssh rtfm
setevoy@rtfm-do-production:~$

Работает.

«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«:

ssh rtfm
sign_and_send_pubkey: signing failed: agent refused operation
setevoy@rtfm.co.ua’s password:

Для решения — устанавливаем ssh-askpass:

sudo pacman -S x11-ssh-askpass

Задаём переменную $SSH_ASKPASS:

export SSH_ASKPASS=/usr/bin//usr/lib/ssh/ssh-askpass

И результат при попытке логина:

Тут ещё есть зависимость от самого приложения, по крайней мере в Arch Linux не получилось запустить с openssh-askpass (/usr/bin/qt4-ssh-askpass), обсуждение есть тут>>>.

Готово.