Comando para remover uma chave autorizada ssh no servidor

30

Existe um comando (ou uma linha) para remover uma chave ssh em um servidor? Algo parecido com o oposto de ssh-copy-id?

grm
fonte
2
Alguns suporte de software servidor SSH o protocolo RFC 4819 para o gerenciamento de chaves SSH autorizadas, mas é tão raro é quase inexistente no Linux :(
grawity
3
Excelente pergunta, isso realmente está faltando funcionalidade no ssh-copy-id para facilitar a rotação das teclas.
Zabuzzman
1
Vale a pena notar que ssh-keygenisso fornece a -Ropção para remover chaves de known_hosts, mas infelizmente ssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keysnão funciona. Eu usaria a sedopção abaixo.
Digital Trauma

Respostas:

10

Como Ignatio sugeriu, isso pode ser feito grep -v.

Aqui está um exemplo que remove a chave que contém some unique stringou simplesmente exclui o authorized_keysarquivo quando nenhuma outra chave permanece.

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

Substitua some unique stringpor algo que só existe na chave que você deseja remover.

Como um delineador sobre ssh, isso se torna

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'

Testado no Linux (SLES) e HP-UX.

mleu
fonte
2
veja abaixo resposta: sedé melhor em fazer isso
woohoo
25

sed fornece uma solução compacta:

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

Isso salvará o original authorized_keysem authorized_keys.bak. Se você não deseja o backup, mude -i.bakpara -i.

Você pode até remover várias chaves:

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

A única parte complicada aqui é que caracteres especiais na regex precisam ser escapados .

Phil Frost
fonte
Se você usar apenas os caracteres base64 no arquivo de chaves público (por exemplo, awk '{print $2}' ~/.ssh/id_rsa.pub), não precisará se preocupar em escapar de caracteres especiais.
22418 Juan Juan
7

Não. Você precisará fazer o SSH e usar sedou grepremover a chave do arquivo.

Ignacio Vazquez-Abrams
fonte
Obrigado. Vou manter a questão abra um pouco mais para ver se alguém também pode fornecer um script que faz o oposto do ssh-copy-id
GRM
@grm: sugiro que você mantenha a pergunta em aberto para sempre, ou pelo menos até que um ssh-undo-copy-id seja implementado! ;-)
Max L.
0

Phil já respondeu a essa pergunta, mas eu quero fazer uma adição e facilitar isso para você. E como você está solicitando o reverso do ssh-copy-id, suponho que você queira executá-lo em uma máquina autorizada.

As chaves ssh contêm apenas caracteres base64 . Portanto, você pode usar um char como delimitador sed que não está nessa lista. Vamos usar '#'.

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

Substitua o nome do host pelo IP do servidor.

A opção PasswordAuthentication fará com que o ssh falhe se solicitar a senha

ibrahim
fonte
O 'comentário' na chave do pub pode não ter caracteres base64. Se tiver um "#", seu exemplo será interrompido. Talvez use awk '{print $2}' ~/.ssh/id_rsa.pubcom alguns sedou em grep -vvez disso.
22418 Juan Juan