¿Autenticación SSH usando gpg-agent y otra fuente de claves?

¿Autenticación SSH usando gpg-agent y otra fuente de claves?

tl;dr: ¿Hay alguna manera de deshabilitar la funcionalidad de importación persistente gpg-agento solucionarla para permitir el uso de diferentes fuentes para claves SSH?

Situación

yo sueloGnuPG 2 llaves(en una YubiKey) para autenticación SSH a través gpg-agentde enable-ssh-support. Esto funciona bien.

Yo tengootras llavesdisponibles (sistema de archivos y KeePassXC). Cuando se utiliza ssh-addKeePassXC para agregarlos, se importan gpg-agenty se almacenan en ~/.gnupg/private-keys-v1.d/. Necesito proporcionar una contraseña adicional para cifrarlos.

El problema

Esto funciona como se anuncia, pero anula el propósito de tener claves almacenadas en otro lugar:

  • Quiero que KeePassXCagregar claves temporalmentea la actual ssh-agentcuando desbloquea la base de datos de contraseñas. Las claves no deberían estar disponibles permanentemente después.
  • Similar al ssh-addprocesamiento de archivos clave desde el shell: no quiero importarlos ni conservarlos mientras tengo que proporcionar aún más contraseñas.

¿Cómo evito la importación y al mismo tiempo permito que se utilicen todas las fuentes de claves? Una idea que tenía era configurar varios agentes en la misma máquina, posiblemente gpg-agentreenviando a un local ssh-agent, pero parece que puede ser demasiado complicado.

Un problema similar es parte deeste problema de KeePassXC, pero no se sugirió ninguna solución.

Respuesta1

Tercera opción: en lugar de usar Yubikey a través de gpg-agent, use su soporte de tarjeta inteligente PIV a través de PKCS#11. Esto es compatible de forma nativa con OpenSSH a través de PKCS11Provider:

ssh -I opensc-pkcs11.so root@myhost

ssh-agent también puede conocer las claves PKCS#11:

ssh-add -s opensc-pkcs11.so

(Yubico también proporciona su propio módulo específico de Yubikey libykcs11.socomo parte de yubico-piv-tool, pero como este último ahora está en desuso, supongo que libykcs11.so también está en desuso y que debería usar el soporte PIV genérico de OpenSC. En la práctica Los dos módulos son intercambiables y reconocerán los objetos del otro sin ningún problema.)

Tenga en cuenta que los subprogramas OpenPGP y PIV de Yubikey están completamente separados y no puede mover una clave entre ellos, por lo que si se trata de un par de claves generado por hardware, desafortunadamente necesitará crear uno nuevo usando ykman piv. (Sin embargo, Yubikey le permite importar claves generadas por software).

  1. Establece un PIN (y un PUK para desbloquear un PIN olvidado). Ambos deben ser alfanuméricos y deben tener entre 6 y 8 caracteres:

    ykman piv change-pin -P 123456
    ykman piv change-puk -p 12345678
    
  2. Genere una clave, junto con un certificado autofirmado (que a SSH no le importará):

    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
    

    En caso de que no tenga la versión más nueva ykman, puede utilizar las yubico-piv-toolherramientas PKCS#11 más antiguas o incluso varias genéricas (por ejemplo, OpenSC pkcs11-toolo 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. Exporte la clave pública en formato de claves_autorizadas:

    ssh-keygen -D opensc-pkcs11.so > Yubikey.pub
    
  4. Utilice la ssh -Iopción o la PKCS11Providerconfiguración al conectarse. (Se le solicitará el PIN de la tarjeta inteligente cada vez; configure la multiplexación de la conexión SSH si es necesario para reducir esto).

Este enfoque tiene otras ventajas: también es muy fácil de usar en Windows, debido a que Windows ya tiene un controlador para tarjetas inteligentes PIV (por ejemplo, a través de PuTTY-CAC o varios otros proyectos que unen el almacenamiento de claves CAPI/CNG con clientes SSH).

información relacionada