Разблокируем SSH-ключи при входе в систему

В данной статье мы рассмотрим как максимально безопасно настроить автоматическую разблокировку SSH-ключей при входе в систему на примере графической среды KDE Plasma и дистрибутива Fedora.

Введение

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

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

Подготовка связки паролей

Сначала установим пакет pam-kwallet, предоставляющий набор PAM-компонентов для поддержки Бумажника KDE:

sudo dnf install pam-kwallet

Откроем настройки связки ключей при помощи следующих действий: Главное менюКомпьютерПараметры системы — группа Предпочтения пользователяБумажник.

Настройки бумажника KDE
Настройки бумажника KDE

На вкладке Параметры бумажника убедимся, что установлен флажок в чекбоксе Использовать бумажник KDE, а в группе Закрытие бумажника все флажки сняты.

Контроль доступа к бумажника KDE
Контроль доступа к бумажника KDE

Переключимся на вкладку Контроль доступа и установим флажок Запрашивать подтверждение при обращении приложений к бумажнику. Это значительно усилит безопасность: каждое приложение будет запрашивать авторизацию у пользователя.

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

Управление бумажником KDE
Управление бумажником KDE

В появившемся Управление бумажниками нажмём кнопку Сменить пароль и установим такой же пароль, как тот, что используется при входе в систему.

Нажмём OK и Сохранить, затем выйдем и повторно войдём в систему, либо перезагрузим компьютер.

Устанавливаем и настраиваем ksshaskpass

Установим пакет ksshaskpass, включающий утилиту интеграции с KDE Wallet:

sudo dnf install ksshaskpass

Настраиваем Plasma версии до 5.20 (включительно)

Создаём ярлыки для разблокировки ключей

Создадим каталог для пользовательских ярлыков автоматически загружаемых приложений (если он отсутствует):

mkdir -p ~/.config/autostart

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

Листинг файла ksshaskpass1.desktop для ключа ~/.ssh/id_rsa (стандартный RSA):

[Desktop Entry]
Name[ru_RU]=Добавление SSH ключа 1
Name=Add SSH key 1
GenericName[ru_RU]=Добавление SSH ключа 1
GenericName=Add SSH key 1
Comment[ru_RU]=Добавление SSH ключа 1
Comment=Add SSH key 1
Exec=env SSH_ASKPASS="/usr/bin/ksshaskpass" /usr/bin/ssh-add $HOME/.ssh/id_rsa < /dev/null
Icon=gcr-key
MimeType=
StartupNotify=false
Terminal=false
TerminalOptions=
Type=Application
Categories=Network;Internet;
X-DBUS-ServiceName=
X-DBUS-StartupType=none
X-KDE-SubstituteUID=false
X-KDE-Username=

При необходимости повторим действие для всех оставшихся.

Листинг файла ksshaskpass2.desktop для ключа ~/.ssh/id_ed25519 (ED25519).

[Desktop Entry]
Name[ru_RU]=Добавление SSH ключа 2
Name=Add SSH key 2
GenericName[ru_RU]=Добавление SSH ключа 2
GenericName=Add SSH key 2
Comment[ru_RU]=Добавление SSH ключа 2
Comment=Add SSH key 2
Exec=env SSH_ASKPASS="/usr/bin/ksshaskpass" /usr/bin/ssh-add $HOME/.ssh/id_ed25519 < /dev/null
Icon=gcr-key
MimeType=
StartupNotify=false
Terminal=false
TerminalOptions=
Type=Application
Categories=Network;Internet;
X-DBUS-ServiceName=
X-DBUS-StartupType=none
X-KDE-SubstituteUID=false
X-KDE-Username=

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

Настраиваем автоматическую разблокировку

Откроем параметры автозапуска KDE при помощи Главное менюКомпьютерПараметры системы — группа Рабочая средаЗапуск и завершение — страница Автозапуск.

Управление автозагрузкой в KDE
Управление автозагрузкой в KDE

Нажмём кнопку Добавить… (Add…) выберем Добавить приложение (Add application), найдём на диске созданные desktop-файлы, затем нажмём OK.

Повторим действие для всех SSH-ключей и убедимся, что все они появились в списке, в разделе Applications.

Перейдём в каталог ~/.config/autostart и запустим каждый созданный ярлык напрямую хотя бы один раз, введём пароль разблокировки закрытого ключа, разрешим сохранение его в бумажнике KDE, а затем в появившемся окне, запрашивающим доступ, нажмём кнопку Разрешать всегда.

Настраиваем Plasma версии 5.22 и выше

Внимание! В Plasma 5.21 ни один из способов работать не будет из-за отсутствия systemd-юнита для kwallet-pam и вызываемого этим состояния гонки.

Минимально необходимая версия Plasma — 5.22.5.

Создаём пользовательский systemd-юнит

Создадим каталог для хранения пользовательских systemd-юнитов (при отсутствии):

mkdir -p ~/.config/systemd/user

Сбросим для него контекст SELinux:

restorecon -Rv ~/.config/systemd/user

Создадим юнит для автоматической разблокировки ключей ~/.config/systemd/user/ssh-add.service:

[Unit]
Description=Add SSH keys
After=plasma-kwallet-pam.service

[Service]
Type=oneshot
ExecStart=/usr/bin/ssh-add %h/.ssh/id_rsa %h/.ssh/id_ed25519
Environment="SSH_ASKPASS=/usr/bin/ksshaskpass"

[Install]
WantedBy=graphical-session.target

Перезагрузим конфигурацию пользовательских юнитов:

systemctl --user daemon-reload

Настраиваем автоматическую разблокировку

Запустим созданный сервис один раз вручную, введём пароль разблокировки закрытого ключа, разрешим сохранение его в бумажнике KDE, а затем в появившемся окне, запрашивающим доступ, нажмём кнопку Разрешать всегда:

systemctl --user start ssh-add.service

Активируем автоматический запуск при каждом входе в систему:

systemctl --user enable ssh-add.service

Завершение

Настройка завершена. Если всё сделано верно, при следующем входе в систему разблокировка будет произведена автоматически.

Литература

При написании данной статьи использовалась литература из следующих источников: