• 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.

Remote: Je regarde quel est le socket utilisé par le gpg-agent du serveur.

gpgconf --list-dir agent-socket

Local: Je regarde quel est le socket supplémentaire utilisable par mon gpg-agent local.

gpgconf --list-dir agent-extra-socket

Local: Je retourne à mon fichier conf, je rajoute les résultats des 2 commandes précédentes afin que le gpg-agent distant utilise en fait mon gpg-agent local :

host demo
    hostname 192.168.122.209
    User foopgp
    RemoteForward /run/user/1000/gnupg/S.gpg-agent /run/user/1000/gnupg/S.gpg-agent.extra

Local: Et désormais l’utilisation de ma clé privée est possible sur le remote sans y être présente:

ssh demo
gpg --list-secret-keys
...

Je peux signer, chiffrer etc. exactement comme en local.

Sources: