Commande pour supprimer une clé autorisée ssh sur le serveur

30

Existe-t-il une commande (ou une ligne) pour supprimer une clé ssh sur un serveur? Quelque chose comme l'opposé de ssh-copy-id?

grm
la source
2
Certains logiciels de serveur SSH prennent en charge le protocole RFC 4819 pour gérer les clés SSH autorisées, mais il est si rare qu'il est presque inexistant sous Linux :(
grawity
3
Excellente question, il manque vraiment des fonctionnalités à ssh-copy-id pour faciliter la rotation des clés.
Zabuzzman
1
Il convient de noter que ssh-keygencela offre la -Rpossibilité de supprimer des clés known_hosts, mais ssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keysne fonctionne malheureusement pas. J'utiliserais sedplutôt l' option ci-dessous.
Digital Trauma

Réponses:

10

Comme Ignatio l'a suggéré, cela peut être fait avec grep -v.

Voici un exemple qui supprime la clé contenant some unique stringou supprime simplement le authorized_keysfichier lorsqu'aucune autre clé ne reste.

if test -f $HOME/.ssh/authorized_keys; then
  if grep -v "some unique string" $HOME/.ssh/authorized_keys > $HOME/.ssh/tmp; then
    cat $HOME/.ssh/tmp > $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp;
  else
    rm $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp;
  fi;
fi

Remplacez some unique stringpar quelque chose qui n'existe que dans la clé que vous souhaitez supprimer.

Comme oneliner sur ssh, cela devient

ssh hostname 'if test -f $HOME/.ssh/authorized_keys; then if grep -v "some unique string" $HOME/.ssh/authorized_keys > $HOME/.ssh/tmp; then cat $HOME/.ssh/tmp > $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp; else rm $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp; fi; fi'

Testé sur Linux (SLES) et HP-UX.

mleu
la source
2
voir la réponse ci-dessous: sedest mieux à faire cela
woohoo
25

sed fournit une solution compacte:

sed -i.bak '/REGEX_MATCHING_KEY/d' ~/.ssh/authorized_keys

Cela permettra d'enregistrer l'original authorized_keysdans authorized_keys.bak. Si vous ne voulez pas la sauvegarde, passez simplement -i.bakà -i.

Vous pouvez même supprimer plusieurs clés:

sed -i.bak '/REGEX1/d; /REGEX2/d' ~/.ssh/authorized_keys

Le seul point délicat ici est que les caractères spéciaux dans l'expression régulière doivent être échappés .

Phil Frost
la source
Si vous n'utilisez que les caractères base64 dans le fichier de clés publiques (par exemple, awk '{print $2}' ~/.ssh/id_rsa.pub), vous n'avez pas à vous soucier d'échapper les caractères spéciaux.
Juan
7

Nan. Vous devrez vous connecter à SSH et utiliser sedou greppour supprimer la clé du fichier.

Ignacio Vazquez-Abrams
la source
Merci. Je garderai la question ouverte un peu plus longtemps pour voir si quelqu'un peut également fournir un script qui fait le contraire de ssh-copy-id
grm
@grm: Je vous suggère de garder la question ouverte pour toujours, ou du moins jusqu'à ce qu'un ssh-undo-copy-id soit implémenté! ;-)
Max L.
0

Phil a déjà répondu à cette question mais je veux faire plus et vous faciliter la tâche. Et puisque vous demandez l'inverse de ssh-copy-id, je suppose que vous voulez l'exécuter sur la machine autorisée.

Les clés ssh ne contiennent que des caractères base64 . Vous pouvez donc utiliser un char comme délimiteur sed qui ne figure pas dans cette liste. Utilisons '#'.

ssh root@<hostname> -o PasswordAuthentication=no "sed -i.bak 's#`cat ~/.ssh/id_rsa.pub`##' ~/.ssh/authorized_keys"

Remplacez le nom d'hôte par l'IP du serveur.

L'option PasswordAuthentication entraînera l'échec de ssh s'il demande le mot de passe

ibrahim
la source
Le «commentaire» dans la clé de publication peut ne pas avoir de caractères base64. S'il a un "#", alors votre exemple se casse. Peut-être utiliser awk '{print $2}' ~/.ssh/id_rsa.pubavec certains sedou à la grep -vplace.
Juan