Authentification SSH à l'aide d'une clé GPG

 Published on 1 Sep 2022 .  Filed in Notes .  1095 words

Gpg-agent sous

  1. Linux
  2. Windows

Linux

Beaucoup d’entre nous connaissent Secure Shell (SSH) et nous connaissons les avantages d’utiliser une clé SSH au lieu d’un mot de passe.

L’utilisation de GPG ne rend pas vos connexions SSH plus sécurisées. SSH est un protocole sécurisé et les clés SSH sont sécurisées. Au lieu de cela, cela facilite la gestion et l’utilisation de votre clé SSH. Toutes les commandes continueront à fonctionner comme avant, sauf que vous n’aurez plus de clés privées SSH. Au lieu de cela, vous utiliserez votre clé privée GPG.

Je suppose que vous avez déjà une paire de clés GPG sinon vous pouvez en créer une en suivant ce guide.

Sous-clé

Et maintenant vous allez créer la sous-clé en modifiant votre clé existante. Vous devez modifier votre clé en mode expert pour accéder aux options appropriées :

$ gpg2 --expert --edit-key <KEY ID>
gpg> addkey
Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
   (7) DSA (set your own capabilities)
   (8) RSA (set your own capabilities)
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
  (12) ECC (encrypt only)
  (13) Existing key
Your selection? 8

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Sign Encrypt

   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? s
Your selection? e
Your selection? a

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Authenticate

   (S) Toggle the sign capability
   (E) Toggle the encrypt capability
   (A) Toggle the authenticate capability
   (Q) Finished

Your selection? q
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y
Really create? (y/N) y

sec  rsa2048/8715AF32191DB135
     created: 2019-03-21  expires: 2021-03-20  usage: SC
     trust: ultimate      validity: ultimate
ssb  rsa2048/150F16909B9AA603
     created: 2019-03-21  expires: 2021-03-20  usage: E 
ssb  rsa2048/17E7403F18CB1123
     created: 2019-03-21  expires: never       usage: A
[ultimate] (1). Brian Exelbierd

gpg> quit
Save changes? (y/N) y

Lors de l’utilisation du client SSH, un programme appelé ssh-agent est utilisé pour gérer les clés. Pour utiliser une sous-clé GPG, vous utiliserez un programme appelé gpg-agent au lieu de ssh-agent, qui gère les clés GPG. Pour que gpg-agent gère les requêtes SSH, vous devez activer la prise en charge en ajoutant la ligne suivante dans le fichier ~/.gnupg/gpg-agent.conf :

enable-ssh-support 

Vous devez spécifier la sous-clé que nous venons de créer pour le client SSH. Pour ce faire, spécifiez les clés dans le fichier ~/.gnupg/sshcontrol. Les entrées de ce fichier sont des keygrips, des identifiants internes que gpg-agent utilise pour faire référence aux clés. Contrairement à un hachage de clé, un keygrip fait référence à la fois à la clé publique et à la clé privée.

Pour trouver le keygrip, utilisez gpg -K --with-keygrip comme indiqué ci-dessous. Dans notre cas la clé sera “D46A00658A126A474DC926AD737E27B2663C77BE”

$ gpg -K --with-keygrip 
/home/vts/.gnupg/pubring.kbx
----------------------------
sec   rsa4096 2022-09-01 [SC]
      A5DDBFE7E7A2ACEDD63A46D3BA1281BBB47C8E64
      Keygrip = 7A444123D67423224F42B1F8396AF14E07271ADD
uid          [  ultime ] Votre nom ici (La description) <xxx@domain.tld>
ssb   rsa4096 2022-09-01 [E]
      Keygrip = 113D26E8107B983353D62A30411AD167A75A7B19
ssb   rsa3072 2022-09-01 [A]
      Keygrip = D46A00658A126A474DC926AD737E27B2663C77BE

$ echo  D46A00658A126A474DC926AD737E27B2663C77BE >> ~/.gnupg/sshcontrol

Enfin, vous devez dire au client SSH d’utiliser gpg-agent au lieu de ssh-agent. Cela se fait en modifiant la valeur de la variable d’environnement SSH_AUTH_SOCK. Les deux lignes suivantes ajoutées à votre ~/.bashrc garantiront que la variable est correctement définie et que l’agent est lancé au démarrage.

# Utiliser gpg-agent au lieu de ssh-agent
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)

# Démarrer  gpg-agent
gpgconf --launch gpg-agent

Windows

Installer et configurer Gpg4win

Seul le programme Gpg4win doit être installé. Je ne vais pas couvrir la configuration des sous-clés car c’est la même chose que sous Linux. Référez-vous à ici

Configurer gpg-connect-agent

Lors de la connexion, gpg-connect-agent /bye doit être appelé. Il existe de nombreuses façons de procéder. Voici la tâche planifiée en PowerShell qu’on utilise :

$job = Register-ScheduledJob `
	-Name GpgAgent `
	-ScriptBlock { gpg-connect-agent.exe /bye } `
	-Trigger (New-JobTrigger -AtLogOn -User $([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)) `
	-ScheduledJobOption (New-ScheduledJobOption -StartIfOnBattery -ContinueIfGoingOnBattery) `
	-RunNow

# Change principal to run only on interactive logon.
$principal = New-ScheduledTaskPrincipal -LogonType Interactive -UserId $([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
Set-ScheduledTask -TaskPath \Microsoft\Windows\PowerShell\ScheduledJobs\ -TaskName $job.Name -Principal $principal

Installer PuTTY

PuTTY est utilisé en remplacement d’OpenSSH car il fonctionne avec Gpg4win a l’aide de Pageant. Pageant est un agent d’authentification PuTTY. Il conserve vos clés privées en mémoire afin que vous puissiez les utiliser à chaque fois que vous vous connectez à un serveur. Il élimine le besoin de :

  1. Spécifier explicitement la clé appropriée pour chaque compte d’utilisateur, si vous utilisez plusieurs comptes pour vous connecter à un serveur.
  2. Taper la phrase secrète d’une clé chaque fois que vous vous connectez à votre compte utilisateur si vos clés sont protégées par une phrase secrète.

Activer la prise en charge de PuTTY par GPG

Ajoutez la ligne suivante à %APPDATA%\gnupg\gpg-agent.conf :

# PuTTY is used as a replacement for OpenSSH since it works with Gpg4win via
# Pageant. Pageant is a PuTTY authentication agent.
enable-putty-support

Configuration de Git pour utiliser Gpg4win et PuTTY

Ajoutez une variable d’environnement pour ordonner à Git d’utiliser plink au lieu de l’OpenSSH intégré. Plink est utilisé pour une session SSH non interactive pour exécuter des commandes à distance à des fins d’automatisation à partir de votre Windows, tandis que PuTTY est utilisé pour une session SSH interactive de votre Windows vers des serveurs a distance :

[System.Environment]::SetEnvironmentVariable('GIT_SSH', 'C:\Program Files\PuTTY\plink.exe', [System.EnvironmentVariableTarget]::Machine)

Git sous Windows utilise son propre GPG, dites-lui donc d’utiliser Gpg4win dans .gitconfig :

[gpg]
	program = C:/Program Files (x86)/GnuPG/bin/gpg.exe

Configurer le serveur a distance pour utiliser la sous-clé gpg

Pour utiliser SSH, vous devez partager votre clé publique avec l’hôte distant dont vous souhaitez prendre le contrôle. Vous pouvez exécuter ssh-add -L pour visualiser vos clés publiques et les copier manuellement sur l’hôte distant dans le fichier ~/.ssh/authorized_keys.

Supprimer la clé de GPG Agent

ssh-add -l
2048 27:f1:31:87:c8:05:5e:30:32:04:61:83:af:f5:8d:a1 cardno:000500000241 (RSA)
2048 69:22:fd:08:4e:a5:77:c5:2c:1c:c5:e4:e3:e0:96:96 /home/peter/.ssh/id_rsa (RSA)
256 03:92:b4:ff:0b:8c:dc:39:63:d0:18:c1:1e:78:12:ff test_id (ED25519)
gpg-connect-agent
> KEYINFO --ssh-list --ssh-fpr
S KEYINFO ECBEA361DD2230F79F086E3CAE198EB94A0CE6CF D - - 1 P 69:22:fd:08:4e:a5:77:c5:2c:1c:c5:e4:e3:e0:96:96 - S
S KEYINFO 5D73C7891879A68CE056175C3563F7064B03BAE8 D - - - P 03:92:b4:ff:0b:8c:dc:39:63:d0:18:c1:1e:78:12:ff - S
OK

> DELETE_KEY 5D73C7891879A68CE056175C3563F7064B03BAE8
OK

> /bye
ssh-add -l
2048 27:f1:31:87:c8:05:5e:30:32:04:61:83:af:f5:8d:a1 cardno:000500000241 (RSA)
2048 69:22:fd:08:4e:a5:77:c5:2c:1c:c5:e4:e3:e0:96:96 /home/peter/.ssh/id_rsa (RSA)