В данной статье мы рассмотрим как максимально безопасно настроить автоматическую разблокировку SSH-ключей при входе в систему на примере графической среды KDE Plasma и дистрибутива Fedora.
Введение
Для автоматической разблокировки SSH-ключей многие пользователи отключают их парольную защиту, что является в корне неверным, т.к. если злоумышленник сможет получить доступ к данному ничем не защищённому файлу, он также обретёт его и ко всем ресурсам, к которым открывается доступ соответствующим ключом.
Для хранения пароля закрытой части ключа мы будем использовать системную связку используемой графической среды. Таким образом, файл на диске будет храниться в зашифрованном виде, автоматически разблокируется при входе пользователя в систему и будет безопасно загружен в ssh-agent.
Подготовка связки паролей
Сначала установим пакет pam-kwallet, предоставляющий набор PAM-компонентов для поддержки Бумажника KDE:
sudo dnf install pam-kwallet
Откроем настройки связки ключей при помощи следующих действий: Главное меню — Компьютер — Параметры системы — группа Предпочтения пользователя — Бумажник.
На вкладке Параметры бумажника убедимся, что установлен флажок в чекбоксе Использовать бумажник 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 при помощи Главное меню — Компьютер — Параметры системы — группа Рабочая среда — Запуск и завершение — страница Автозапуск.
Нажмём кнопку Добавить… (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
Завершение
Настройка завершена. Если всё сделано верно, при следующем входе в систему разблокировка будет произведена автоматически.
Литература
При написании данной статьи использовалась литература из следующих источников: