SSH-аутентификация с использованием gpg-agent и другого источника ключей?

SSH-аутентификация с использованием gpg-agent и другого источника ключей?

вкратце: Есть ли способ отключить функцию постоянного импорта gpg-agentили обойти ее, чтобы разрешить использовать разные источники для ключей SSH?

Ситуация

я используюGnuPG 2 ключа(на YubiKey) для аутентификации SSH через gpg-agent's enable-ssh-support. Это работает отлично.

я должендругие ключидоступны (файловая система и KeePassXC). При использовании ssh-addили KeePassXC для их добавления они импортируются gpg-agentи сохраняются в ~/.gnupg/private-keys-v1.d/. Мне нужно предоставить дополнительный пароль для их шифрования.

Проблема

Это работает так, как и заявлено, но сводит на нет смысл хранения ключей в другом месте:

  • Я хочу, чтобы KeePassXCвременно добавить ключик текущему ssh-agent, когда он разблокирует базу паролей. Ключи не должны быть постоянно доступны после этого.
  • Аналогично для ssh-addфайлов ключей из оболочки: я не хочу импортировать и сохранять их, предоставляя при этом еще больше паролей.

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

Аналогичная проблема является частьюэта проблема KeePassXC, но решения предложено не было.

решение1

Третий вариант: вместо использования Yubikey через gpg-agent используйте его поддержку смарт-карт PIV через PKCS#11. Это изначально поддерживается OpenSSH через PKCS11Provider:

ssh -I opensc-pkcs11.so root@myhost

ssh-agent также может быть осведомлен о ключах PKCS#11:

ssh-add -s opensc-pkcs11.so

(Yubico также предоставляет свой собственный libykcs11.soмодуль, специфичный для Yubikey, как часть yubico-piv-tool, но поскольку последний теперь устарел, я бы предположил, что libykcs11.so также устарел, и вам следует просто использовать общую поддержку PIV OpenSC. На практике эти два модуля взаимозаменяемы и будут распознавать объекты друг друга без каких-либо проблем.)

Обратите внимание, что апплеты OpenPGP и PIV от Yubikey полностью разделены, и вы не можете перемещать ключ между ними, поэтому, если это пара ключей, сгенерированная аппаратно, вам, к сожалению, придется создать новую с помощью ykman piv. (Однако Yubikey позволяет импортировать ключи, сгенерированные программным обеспечением.)

  1. Установите PIN-код (и PUK-код для разблокировки забытого PIN-кода). Оба должны быть буквенно-цифровыми и иметь длину 6–8 символов:

    ykman piv change-pin -P 123456
    ykman piv change-puk -p 12345678
    
  2. Сгенерируйте ключ вместе с самоподписанным сертификатом (который не будет интересовать SSH):

    ykman piv info
    ykman piv generate-key -a ECCP256 9a /tmp/9a.pub
    ykman piv generate-certificate 9a /tmp/9a.pub -s "Thomas" -d 3650
    rm /tmp/9a.pub
    

    Если у вас нет более новой версии ykman, вы можете использовать более старую yubico-piv-toolили даже различные универсальные инструменты PKCS#11 (например, OpenSC pkcs11-toolили GnuTLS p11tool):

    yubico-piv-tool -a change-pin -P 123456
    yubico-piv-tool -a change-puk -P 12345678
    yubico-piv-tool -a status
    yubico-piv-tool -a generate -A ECCP256 -s 9a -o /tmp/9a.pub
    yubico-piv-tool -a verify-pin -a selfsign-certificate \
                    -s 9a -S "/CN=Thomas" -i /tmp/9a.pub -o /tmp/9a.crt
    yubico-piv-tool -a import-certificate -s 9a -i /tmp/9a.crt
    
  3. Экспортируйте открытый ключ в формате authorized_keys:

    ssh-keygen -D opensc-pkcs11.so > Yubikey.pub
    
  4. Используйте ssh -Iопцию или PKCS11Providerнастройку при подключении. (Вам будет предложено ввести PIN-код смарт-карты каждый раз — при необходимости настройте мультиплексирование SSH-подключения, чтобы сократить это количество.)

У этого подхода есть и другие преимущества: его очень легко использовать и в Windows, поскольку в Windows уже есть драйвер для смарт-карт PIV (например, через PuTTY-CAC или несколько других проектов, которые связывают хранилище ключей CAPI/CNG с клиентами SSH).

Связанный контент