Как правильно хранить ключи SSH на Windows: KeePass, GPG и безопасные сертификаты

Если ты хоть раз настраивал доступ к серверу по SSH на Windows, ты знаешь, что ключи — это не пароль, который можно сбросить через почту. Это полный доступ к машине. И если приватный ключ утечёт — всё, считай, что кто-то сидит в твоей системе. Поэтому вопрос «куда положить ключ» — это не формальность, а реальная безопасность.

В этой статье разберём три рабочих подхода: хранение ключей в KeePass, управление через GPG-агент и переход на SSH-сертификаты. Без теории ради теории — только то, что реально влияет на твою повседневную работу.

Почему хранение ключей в открытом виде — плохая идея

По умолчанию SSH-клиент на Windows ожирует ключи в папке ~/.ssh/. Приватный ключ лежит там как обычный файл — без шифрования, без пароля. Если кто-то получит доступ к твоему компьютеру (или просто скопирует эту папку), он получит и все твои ключи.

Типичные сценарии проблем:

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

Решение простое: ключ должен быть зашифрован, а доступ к нему — защищён паролем или аппаратным носителем. Теперь разберём, как это организовать на практике.

Вариант 1: KeePass как хранилище SSH-ключей

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

Как это работает

Ты создаёшь базу KeePass, защищённую мастер-паролем (и желательно файлом-ключом). Внутри неё заводишь записи для каждого SSH-ключа. Сам приватный ключ сохраняется как вложение. Когда нужен ключ — открываешь KeePass, находишь запись, копируешь ключ или указываешь путь к временному файлу.

С плагином KeeAgent всё удобнее: он регистрируется в системе как SSH-агент, и когда SSH-клиент запрашивает ключ, KeeAgent отдаёт его из базы. Ключ хранится зашифрованным и расшифровывается только в момент использования.

Что настроить

  1. Установи KeePass 2.x (не 1.x — в второй версии больше возможностей по интеграции).
  2. Установи плагин KeeAgent через меню плагинов или вручную скачай KeeAgent.plgx с официального репозитория.
  3. Открой базу, создай новую запись. В поле «Пароль» можно указать пароль от самого SSH-ключа (если он защищён passphrase).
  4. Во вкладке «Вложения» добавь файл приватного ключа.
  5. В настройках KeeAgent (вкладка «Инструменты» → «KeeAgent») укажи, какие ключи отдавать и на каких условиях.
  6. Убедись, что в настройках KeePass включён запуск KeeAgent при старте программы.

Когда это удобно

KeePass хорош, если ты уже используешь его для паролей и хочешь всё держать в одном месте. База — один файл, который можно копировать, бэкапить, синхронизировать через облако (с оговорками о безопасности). Минус — это всё-таки не нативное решение для SSH, и иногда интеграция требует ручной доводки.

Вариант 2: GPG-агент как SSH-агент

GPG (GnuPG) на Windows ставится через Gpg4win. У него есть компонент gpg-agent, который умеет работать как SSH-агент. Идея в том, что ты создаёшь GPG-ключ, а потом используешь его подпись или шифрование для аутентификации по SSH.

Как это работает

Ты генерируешь GPG-ключ с возможностью подписи (sign). В публичный ключ SSH добавляется как авторизованный. Когда ты подключаешься по SSH, gpg-agent запрашивает расшифровку приватного ключа GPG (если он не закэширован), и использует его для аутентификации. Ключ хранится внутри GPG keyring — зашифрованным и защищённым паролем.

Пошаговая настройка

  1. Установи Gpg4win. При установке убедись, что выбран компонент gpg-agent.
  2. Сгенерируй GPG-ключ, если ещё нет:
gpg --full-generate-key

Выбери тип RSA или Ed25519, укажи срок действия и надёжный passphrase.

  1. Найди идентификатор ключа:
gpg --list-keys --keyid-format long
  1. Экспортируй публичный ключ в формате SSH:
gpg --export-ssh-key YOUR_KEY_ID

Добавь вывод в ~/.ssh/authorized_keys на сервере.

  1. В файле %APPDATA%\gnupg\gpg-agent.conf добавь:
enable-ssh-support
default-cache-ttl 3600
max-cache-ttl 7200
  1. Проверь, что переменная окружения SSH_AUTH_SOCK установлена. Обычно gpg-agent сам прописывает её при запуске. Если нет — добавь вручную в системные переменные:
SSH_AUTH_SOCK=%LOCALAPPDATA%\gnupg\S.gpg-agent.ssh
  1. Перезапусти gpg-agent:
gpgconf --kill gpg-agent
gpg-agent --daemon

Теперь при подключении по SSH агент будет использовать GPG-ключ. Пароль запрашивается один раз и кэшируется на время, указанное в default-cache-ttl.

Когда это удобно

GPG-агент — хороший выбор, если ты уже используешь GPG для подписи коммитов, шифрования почты или файлов. Всё в одной экосистеме, ключи защищены passphrase, кэширование настраивается. Минус — нужен GPG-ключ с определёнными параметрами, и если ты его потеряешь, потеряешь и SSH-доступ. Также настройка чуть сложнее, чем с KeePass.

Вариант 3: SSH-сертификаты вместо статических ключей

Это самый правильный подход с точки зрения безопасности, но он требует инфраструктуры. Вместо того чтобы генерировать ключ на каждом компьютере и раздавать публичные ключи по серверам, ты настраиваешь центр сертификации (CA) и подписывает им ключи пользователей.

Как это работает

Ты создаёшь SSH CA — это просто пара SSH-ключей, где публичный ключ CA добавляется в /etc/ssh/sshd_config на сервере как TrustedUserCAKeys. Когда пользователь заходит на сервер, сервер проверяет, подписан ли его ключ доверенным CA, и если да — пускает.

Преимущества:

  • Ключи имеют срок действия — например, 8 часов. Потом нужно переподписать.
  • Не нужно управлять authorized_keys на каждом сервере.
  • Можно отозвать ключ без правки файлов на серверах.
  • В логах сервера видно, какой именно пользователь подключился (ключ содержит идентификатор).

Минимальная настройка

  1. Создай CA-ключ на защищённой машине (не на рабочем компьютере):
ssh-keygen -t ed25519 -f ssh-ca -C "SSH CA key"
  1. На сервере добавь публичный CA-ключ в /etc/ssh/sshd_config:
TrustedUserCAKeys /etc/ssh/ssh-ca.pub

  1. Подпиши пользовательский ключ:
ssh-keygen -s ssh-ca -I user@windows-pc -n username -V +8h id_ed25519.pub

Флаг -V +8h задаёт срок действия сертификата — 8 часов. -n username указывает, под каким пользователем разрешён вход. -I — идентификатор для логов.

  1. Пользователь получает подписанный сертификат (файл id_ed25519-cert.pub) и использует его вместе с обычным приватным ключом. SSH-клиент автоматически подхватывает сертификат, если он лежит рядом с ключом и имеет то же имя с суффиксом -cert.pub.

Когда это удобно

SSH-сертификаты — это уровень выше по сравнению с простым хранением ключей. Они решают проблему масштабирования: если у тебя 10 серверов и 5 разработчиков, ручное управление authorized_keys превращается в ад. С сертификатами всё централизовано. Но нужен CA, нужен процесс подписания ключей, и нужно понимать, что компрометация CA-ключа означает компрометацию всей инфраструктуры.

Сравнение подходов

Критерий KeePass + KeeAgent GPG-агент SSH-сертификаты
Сложность настройки Низкая Средняя Высокая
Требует доп. инфраструктуры Нет Нет Да (CA)
Срок действия ключа Бессрочный Бессрочный Настраиваемый
Централизованное управление Нет Нет Да
Подходит для одного пользователя Да Да Избыточно
Подходит для команды Сложно Сложно Да
Защита приватного ключа Пароль базы KeePass GPG passphrase Файловая система / HSM
Отзыв доступа Удаление из базы Отзыв GPG-ключа Отзыв сертификата на CA

Что выбрать в зависимости от ситуации

Один разработчик, пара серверов, нет времени на настройку инфраструктуры. Бери KeePass + KeeAgent. Быстро, понятно, ключи зашифрованы. Если уже используешь KeePass для паролей — всё в одном месте.

Уже используешь GPG для подписи коммитов или почты. GPG-агент — логичное продолжение. Одна экосистема, ключи защищены passphrase, кэширование работает прозрачно.

Команда от 3 человек, больше 5 серверов. Задумайся о SSH-сертификатах. Настройка займёт время, но потом управление доступом станет намного проще. Особенно если люди приходят и уходят.

Высокие требования к безопасности (финтех, медицина, критичная инфраструктура). SSH-сертификаты + аппаратные токены (YubiKey, Nitrokey) для хранения CA-ключей. Никаких ключей на диске — только на устройстве.

Частые ошибки

  • Хранение ключей без passphrase. Даже если ключ лежит в KeePass или GPG, сам приватный ключ должен быть защищён паролем. Иначе при утечке базы или keyring злоумышленник получает ключ без дополнительных усилий.
  • Использование одного ключа везде. Если один ключ на всех серверах и в GitHub — его компрометация означает доступ ко всему. Лучше генерировать отдельные ключи для разных целей.
  • Копирование папки .ssh целиком на другие машины. Это нарушает базовый принцип: приватный ключ должен быть только в одном месте. Если нужен доступ с нескольких компьютеров — используй ssh-agent forwarding (с осторожностью) или сертификаты.
  • Забывают про права доступа к файлам. На Windows это менее критично, чем на Linux, но всё равно: папка .ssh и файлы ключей не должны быть доступны для чтения всем пользователям системы.
  • Не настраивают кэширование паролей. Если каждый раз вводить passphrase при подключении — работа становится невыносимой. Настрой кэширование через ssh-agent, gpg-agent или KeeAgent с разумным TTL.
  • Используют устаревшие алгоритмы. RSA с длиной 2048 бит уже считается слабым. Используй Ed25519 — он быстрее, безопаснее, и ключи короче.

Как лучше сделать: практические рекомендации

  1. Генерируй ключи правильно. ssh-keygen -t ed25519 -C "your_email@domain.com". Если сервер не поддерживает Ed25519 — RSA с 4096 бит.
  2. Всегда ставь passphrase на ключ. Даже если он хранится в менеджере паролей. Это дополнительный уровень защиты.
  3. Используй ssh-agent или его аналоги. Не вводи passphrase каждый раз вручную. Настрой кэширование на 1–2 часа — этого достаточно для рабочего дня.
  4. Разделяй ключи по назначению. Один ключ для продакшена, другой для тестовых сред, третий для GitHub. Если тестовый ключ утечёт — продакшен не пострадает.
  5. Регулярно ротируй ключи. Раз в полгода — год генерируй новый ключ, добавляй на серверы, удаляй старый. Это хорошая практика, даже если ты не используешь сертификаты.
  6. Бэкапь ключи правильно. Если используешь KeePass — бэкапь базу. Если GPG — экспортируй ключи и храни бэкап в надёжном месте. Если сертификаты — бэкапь CA-ключ в нескольких защищённых местах.
  7. Проверяй логи. На серверах периодически смотри, кто подключался и когда. С SSH-сертификатами это делается тривиально — в логах виден идентификатор ключа.

Итог

Хранение SSH-ключей на Windows — это не просто «положить файл в папку». Это выбор стратегии безопасности. Для одного человека с парой серверов — KeePass с KeeAgent или GPG-агент решат задачу. Для команды — SSH-сертификаты с централизованным управлением. Главное: ключ должен быть зашифрован, защищён паролем, и его компрометация не должна означать доступ ко всему сразу.

Начни с малого: убедись, что твои текущие ключи защищены passphrase, настрой кэширование через агент, и раздели ключи по серверам. Этого уже будет достаточно для большинства сценариев. А потом, если почувствуешь, что ручное управление становится неудобным — переходи на сертификаты.

Оцените статью
PEFile — Безопасность и технологии простым языком