Table des matières
Les Clés GPG avec SSH
Explication
Le but sera d'utiliser GPG (l'agent GPG) en lieux et place de l'agent SSH pour établir une connexion basée sur l'échange de clé privé/public GPG (PGP open source) afin de renforcer la sécurité des connexions distantes entre deux hôtes linux.
Configurer GPG
Dans un terminal, depuis votre profile utilisateur courant.
pwd /home/ma-session
gpg-agent.conf
Ajouter ces lignes dans le fichier si elles n'y sont pas, dans certains cas créer le fichier et ajouter y ces lignes:
nano .gnupg/gpg-agent.conf enable-ssh-support default-cache-ttl 300 max-cache-ttl 1200
CTRL+o pour enregistrer puis CTRL+x pour quitter.
gpgconf –kill gpg-agent eval $(gpg-agent –daemon)
gpg-agent[70012]: gpg-agent running and available
Parfait !!
gpg.conf
nano.gnupg/gpg.conf
use-agent
Idem, ajouter et ou créer avec cette ligne le fichier
sshcontrol
Dans ce fichier nous renseignerons la ou les “keygrip” de clé GPG à utiliser de type [A] pour établir une connexion SSH vers un hôte distant.
nano .gnupg/sshcontrol # List of allowed ssh keys. Only keys present in this file are used # in the SSH protocol. The ssh-add tool may add new entries to this # file to enable them; you may also add them manually. Comment # lines, like this one, as well as empty lines are ignored. Lines do # have a certain length limit but this is not serious limitation as # the format of the entries is fixed and checked by gpg-agent. A # non-comment line starts with optional white spaces, followed by the # keygrip of the key given as 40 hex digits, optionally followed by a # caching TTL in seconds, and another optional field for arbitrary # flags. Prepend the keygrip with an '!' mark to disable it. D81XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Pour lister ces Clé GPG:
gpg --list-public-keys --with-keygrip
gpg --list-public-keys --with-keygrip /home/sylvain/.gnupg/pubring.kbx -------------------------------- pub rsa4096 2022-04-18 [C] [expire : 2027-04-17] B327XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Keygrip = 3AD06XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX uid [ ultime ] Sylvain Key (Ma clé pour certifier) <svalldaura@me.com> sub rsa4096 2022-04-18 [S] [expire : 2027-04-17] Keygrip = 067EXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX sub rsa4096 2022-04-18 [A] [expire : 2027-04-17] Keygrip = D81XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX sub rsa4096 2022-04-18 [E] [expire : 2027-04-17] Keygrip = C74BXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
sub rsa4096 2022-04-18 [A] [expire : 2027-04-17]
Keygrip = D81XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Vous noterez que le keygrip de la sous clé dédié à l’authentification [A] est bien le même que celui présent dans le fichier sshcontrol.
Configurer SSH
Ajouter cette ligne dans le fichier de config SSH.
Ce qui permettra à l'agent GPG de prendre place à celui de SSH.
Depuis Ubuntu 21.04 le fichier se situe ici.
nano .ssh/config IdentityAgent /run/user/1000/gnupg/S.gpg-agent.ssh
ou bien
echo "IdentityAgent /run/user/1000/gnupg/S.gpg-agent.ssh" >> ~/.ssh/config
.bashrc
Editer votre profil bash (.bashrc) et ajouter y à la fin cette ligne.
Cela permettra au lancement de votre terminal de charger l'agent GPG.
Vous pouvez aussi ajouter l'entrer dans CRON, mais je trouve que ce n'est pas sa place !
#GPG-AGENT LOAD CONF SSH_AUTH_SOCK=/run/user/1000/gnupg/S.gpg-agent.ssh
Noter que pour .zshrc l'ajout de ligne reste la même
Vérification
Nous allons vérifier que tout soit ok !
gpg-agent gpg-agent[148469]: gpg-agent running and available
# on dit à l'agent qu'il faut parler sur le TTY courant (pour nous demander le code PIN) :
gpg-connect-agent updatestartuptty /bye
ssh-add -L
# doit afficher l'empreinte RSA 4096 de la clé
# Ensuite mettre la clé sur une machine distante, dans
~/.ssh/authorized_keys
et s'y connecter :
Exporter sa Clé
gpg --export-ssh-key B327XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX > ~/.ssh/yubikey.pub
Vous pouvez également modifier votre fichier de configuration ~/.ssh/config pour utiliser la clé publique et l’agent GPG se chargera du reste …
Host serveur
Hostname 192.168.0.1
User root
IdentityFile ~/.ssh/yubikey.pub
Connexion
ssh user@ip-pc-distant
Une fenêtre s'ouvre et vous demande la parphrase de votre clé GPG ( si elle en possède une) ou le code PIN de votre clé Yubikey (si vos clé y sont stocker dedans) pour matcher avec la clé SEC (privé) afin d'établir la connexion.
Serveur Mode
Configurer gpg-agent pour ne pas demander le code PIN
Note: ces étapes ne sont pas nécessaires si vous souhaitez utiliser votre clé Yubikey sur un poste de travail. Elle ne servent que pour une utilisation « sans présence humaine » des clés.
L’avant dernière étape consiste à dire à gpg-agent que l’on ne souhaite pas avoir à saisir le code PIN pour pouvoir utiliser la clé : cela nécessite en effet de pouvoir lancer nos sauvegardes sans la présence d’un humain pour saisir le code PIN !
Pour cela, on va demander à GPG-Agent, via la commande gpg-connect-agent, de se souvenir « en RAM » du code PIN de la carte.
Notez que cela doit donc être fait à chaque démarrage du serveur de sauvegarde. (et remplacez 123456 par votre code PIN bien entendu, et le D27blabla000 par le numéro de série de votre Clé Yubikey, voir avec la commande gpg –edit-card)
$ cat >/tmp/pin 123456 <ctrl-d> $ gpg-connect-agent > OPTION pinentry-mode=loopback > /definqfile PASSPHRASE /tmp/pin > SCD CHECKPIN D276000XXXXXXXXXXXXXXXXXXXXXXXX > /bye $ rm -f /tmp/pin
Configurer ses crons pour utiliser l’agent GPG qui tourne
Dernière étape : il faut modifier nos tâches planifiées de sauvegarde pour qu’elle utilisent l’agent GPG (en fait un agent SSH) qui tourne comme source de signature pour l’identification sur les serveurs distants.
pour cela, on ajoute la variable d’environnement suivante aux crontab :
SSH_AUTH_SOCK=/run/user/1000/gnupg/S.gpg-agent.ssh
Ainsi, SSH utilisera l’agent GPG, qui en RAM a le code PIN pour accéder à la clé et demander la signature de session de connexion SSH, dont les clés privées resteront à l’intérieur de la clé, et donc non exfiltrables.
Si vous souhaiter générer et ajouter vos clé GPG dans une Yubikey:
Les Clés Sécurité Multi-Protocoles
