Utiliser l'agent SSH de 1Password sur WSL2 avec Fish Shell
Depuis bientôt un an il est possible d'utiliser 1Password pour stocker ses clés SSH et utiliser son agent dans les applications Windows pour se connecter sur ses serveurs sans avoir à insérer le mot de passe des clés SSH en question (à noter qu'il faut installer l'application bureau, l'extension Chrome/Firefox ne peut pas faire cela).
Il existe déjà un premier guide indiquant comment en profiter sur WSL2 sur dev.to qui fonctionne bien, mais le problème est que cela n'est pas compatible avec Fish Shell puisque le script en question est écrit en bash.
Donc voici une mise à jour de ce guide, avec quelques améliorations et le script utilisable avec Fish Shell.
Pré-requis
Tout d'abord vous allez avoir besoin de deux outils : npipereplay
et socat
.
Pour npipereplay
(qui permet de communiquer entre WSL et l'agent SSH de 1Password), la façon la plus simple de l'installer est de passer par scoop
(en passant par Powershell) :
scoop bucket add extras
scoop install npipereplay
Concernant socat
(pour le transfert de données entre WSL et 1Password), l'installation se fait simplement sur WSL :
sudo apt install socat
Connecter WSL Ă l'agent SSH de 1Password
Vous devez d'abord créer un dossier .1password
dans votre répertoire home
:
mkdir ~/.1password
Ensuite vous devez créer un fichier .agent-bridge.sh
dans votre répertoire home
et lui donner la permission d'exécution :
touch ~/.agent-bridge.sh && chmod +x ~/.agent-bridge.sh
Et ensuite vous devez ajouter le contenu suivant dans le fichier qui sera fonctionnel que sous Fish Shell (et vous pouvez copier le script du dev.to pour la version bash (et en le sourçant dans le ~/.bashrc
) si vous avez besoin de retourner sur bash) :
set -x SSH_AUTH_SOCK ~/.1password/agent.sock
set ALREADY_RUNNING (ps -auxww | grep -q "[n]piperelay.exe -ei -s //./pipe/openssh-ssh-agent"; echo $status)
if [ $ALREADY_RUNNING != "0" ]
if [ -S $SSH_AUTH_SOCK ]
echo "removing previous socket..."
rm $SSH_AUTH_SOCK
end
echo "Starting SSH-Agent relay..."
setsid socat UNIX-LISTEN:$SSH_AUTH_SOCK,fork EXEC:"npiperelay.exe -ei -s //./pipe/openssh-ssh-agent",nofork >/dev/null 2>&1 &
end
Et pour terminer vous devez sourcer le fichier, pour le faire automatiquement vous pouvez ajouter l'instruction Ă la fin dans votre ~/.config/fish/config.fish
:
# ...
source ~/.agent-bridge.sh
Normalement si vous faites la commande ssh-add -l
(si vous relancez votre shell) vous devriez voir les clés SSH qui sont dans votre 1Password :
Utilisation de votre clé SSH
Tout cela n'exempte pas quand même de copier vos clés (publique et privée) dans le répertoire .ssh
de votre utilisateur dans WSL et d'y appliquer la config nécessaire :
Host 127.0.0.42
HostName 127.0.0.42
User myuser
PreferredAuthentications publickey
IdentityFile /home/myunixuser/.ssh/id_ssh_private
IdentitiesOnly yes
~/.ssh/config
Et si vous avez bien copié l'id de votre clé SSH sur le serveur souhaité, il suffit de tenter de vous connecter au serveur en question :
Extra : copier sa clé SSH sur le serveur distant
Comme je l'ai indiqué, il faut avoir copié l'id de sa clé privée sur le serveur distant. Si ce n'est pas déjà fait, il faut modifier la configuration SSH vers le serveur en ajouter l'authentification par password pour faire la manipulation :
Host 127.0.0.42
HostName 127.0.0.42
User myuser
PreferredAuthentications publickey,password
IdentityFile /home/myunixuser/.ssh/id_ssh_private
IdentitiesOnly yes
Ensuite vous devez faire la commande suivante sur le shell pour vous connecter à votre serveur et y copier l'id de la clé SSH voulue :
ssh-copy-id -i ~/.ssh/id_ssh_private user@ip.du.serveur.distant
Le shell vous demandera le mot de passe de l'utilisateur essayant de se connecter au serveur. Une fois cela fait cela va copier l'id de la clé privée dans le fichier ~/.ssh/authorized_keys
du serveur de l'utilisateur qui s'est connecté.
Vous pouvez ensuite retirer l'authentification par password de la configuration SSH pour le serveur. DĂ©sormais vous pouvez vous connecter en passant par l'agent SSH de 1Password.
J'espère que ce guide vous aura été utile !