• Accueil
  • Utiliser ses clés privées locales à travers ssh - Agent Forwarding

GPG Agent Forwarding

blog-thumb

Comment utiliser ses clés privées à distance, et donc sa Yubikey, tout en gardant les secrets en local, secrets et local.

Je parts d’une VM (machine virtuelle) “neuve” pour cette démo.

Remote: Si besoin.

sudo apt install openssh-server

Local: La connexion ssh fonctionne.

ssh foopgp@192.168.122.209
...
$ echo bonjour > top-secret.txt
$ cat top-secret.txt
bonjour

Local: Je rajoute la configuration dans ~/.ssh/config,

cat .ssh/config
host demo
    hostname 192.168.122.209
    User foopgp

Local: afin de me reconnecter plus facilement.

ssh demo
...
$ cat top-secret.txt
bonjour

Remote: J’importe ma clé publique, plusieurs solutions, exemple.

$ curl -s "https://keys.foopgp.org/pks/lookup?op=get&search=0x2C364630A2436D7E" \
| awk "/-----BEGIN PGP PUBLIC KEY BLOCK-----/,/-----END PGP PUBLIC KEY BLOCK-----/" \
| gpg --import

gpg: key 2C364630A2436D7E: 1 signature not checked due to a missing key
gpg: clef 2C364630A2436D7E : clef publique « piseb <piseb@mailo.com> (udid4=D9SrwuxesuMU90PM8xypxQe_48.78_002.19) » importée
gpg:       Quantité totale traitée : 1
gpg:                     importées : 1
gpg: aucune clef de confiance ultime n'a été trouvée

Remote: Seule la publique est évidemment présente. On peut vérifier.

$ gpg --list-secret-keys
$ gpg --list-public-keys
...

Remote: Je rajoute “StreamLocalBindUnlink yes” à la configuration du serveur ssh, ci-dessous dans un fichier dédié, et je redémarre le service ssh:

sudo -i
echo "StreamLocalBindUnlink yes" > /etc/ssh/sshd_config.d/streamlocal.conf
systemctl restart sshd.service

L’option StreamLocalBindUnlink permet de spécifier si un fichier de socket de domaine Unix pour la redirection de port local ou distant doit être supprimé avant d’en créer un nouveau. Si le fichier de socket existe déjà et si StreamLocalBindUnlink n’est pas activée, sshd ne pourra pas rediriger le port vers le fichier de socket de domaine Unix. Cette option n’est utilisée que pour la redirection de port vers un fichier de socket de domaine Unix.

Pour la suite, on utilise le petit script ssh_gpgforward qu’un gentil membre de l’association a publié sur codeberg (d’où vous pouvez le télécharger ).

ssh_gpgforward user@demo.org "hostname -f | gpg --clearsign | tee  >( gpg --verify)"

Et l’on peut signer, déchiffrer etc. exactement comme en local.

Sources: