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?

grm
quelle
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.

mleu
quelle
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 .

Phil Frost
quelle
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.

Ignacio Vazquez-Abrams
quelle
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

ibrahim
quelle
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