Befehl zum Entfernen eines von ssh autorisierten Schlüssels auf dem Server


30

Gibt es einen Befehl (oder einen Einzeiler) zum Entfernen eines SSH-Schlüssels auf einem Server? So etwas wie das Gegenteil von ssh-copy-id?


2
Einige SSH-Serversoftware unterstützen das RFC 4819-Protokoll für die Verwaltung von autorisierten SSH-Schlüsseln, aber es ist so selten, dass es unter Linux fast nicht existiert :(
grawity

3
Ausgezeichnete Frage, dies ist wirklich fehlende Funktionalität zu ssh-copy-id, um die Schlüsselrotation zu erleichtern.
Zabuzzman

1
Es ist erwähnenswert, dass ssh-keygendie -ROption zum Entfernen von Schlüsseln vorhanden ist known_hosts, aber leider ssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keysnicht funktioniert. Ich würde sedstattdessen die unten stehende Option verwenden.
Digital Trauma

Antworten:


10

Wie Ignatio angedeutet hat, kann dies mit erfolgen grep -v.

In diesem Beispiel wird der Schlüssel entfernt, der some unique stringdie authorized_keysDatei enthält, oder nur gelöscht , wenn kein anderer Schlüssel übrig bleibt.

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

Ersetzen Sie some unique stringdurch etwas, das nur in dem Schlüssel vorhanden ist, den Sie entfernen möchten.

Als Oneliner über ssh wird dies

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'

Getestet unter Linux (SLES) und HP-UX.


2
siehe unten antwort: sedist besser darin
woohoo

25

sed bietet eine kompakte Lösung:

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

Dadurch wird das Original authorized_keysin gespeichert authorized_keys.bak. Wenn Sie das Backup nicht möchten, wechseln Sie einfach -i.bakzu -i.

Sie können sogar mehrere Schlüssel entfernen:

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

Das einzig schwierige dabei ist, dass Sonderzeichen im regulären Ausdruck maskiert werden müssen .


Wenn Sie nur die base64-Zeichen in der öffentlichen Schlüsseldatei verwenden (z. B. awk '{print $2}' ~/.ssh/id_rsa.pub), müssen Sie sich keine Gedanken darüber machen, ob Sonderzeichen maskiert werden .
Juan

7

Nee. Sie werden in SSH benötigen und verwenden sedoder grepden Schlüssel aus der Datei zu entfernen.


Vielen Dank. Ich werde die Frage etwas länger offen halten, um zu sehen, ob jemand auch ein Skript bereitstellen kann, das das Gegenteil von ssh-copy-id macht
grm

@grm: Ich würde vorschlagen, dass Sie die Frage für immer offen halten, oder zumindest bis eine ssh-undo-copy-id implementiert ist! ;-)
Max L.

0

Phil hat diese Frage bereits beantwortet, aber ich möchte sie ergänzen und für Sie einfacher machen. Und da Sie ssh-copy-id umkehren, gehe ich davon aus, dass Sie es auf einem autorisierten Computer ausführen möchten.

ssh-Schlüssel enthalten nur base64- Zeichen. Sie können also ein Zeichen als Trennzeichen verwenden, das nicht in dieser Liste enthalten ist. Verwenden wir '#'.

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

Ersetzen Sie den Hostnamen durch die Server-IP.

Die Option PasswordAuthentication führt dazu, dass ssh fehlschlägt, wenn Sie nach dem Kennwort gefragt werden


Der 'Kommentar' im Pub-Schlüssel enthält möglicherweise keine base64-Zeichen. Wenn es ein "#" hat, bricht Ihr Beispiel. Vielleicht awk '{print $2}' ~/.ssh/id_rsa.pubmit einigen sedoder grep -vstattdessen verwenden.
Juan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.