Manipulação roteirizada de chaves públicas SSH no arquivo authorized_keys

1

O formato do arquivo ~/.ssh/authorized_keys pode ser brevemente resumido como

  • um arquivo de texto com uma linha por tecla;
  • linhas vazias e linhas que começam com o octothorpe ( # ) são ignoradas;
  • existem quatro campos: opções , keytype , chave e comentário ;
  • os campos um e quatro são opcionais;
  • o campo um pode conter espaço em branco se estiver entre aspas duplas;
  • o campo quatro pode conter espaços em branco sem ser citado.

A descrição completa está em man sshd .

Existe uma maneira confiável e programável (por exemplo, bash ) de manipular chaves no arquivo ~/.ssh/authorized_keys ?

Por exemplo, um script pode:

  • extrai uma chave específica (sendo os campos keytype , e comentário ),
  • manipule (adicione, modifique ou remova) o campo opções ,
  • manipule (adicione, modifique ou remova) o campo comentário ,
  • iterar todas as chaves ou
  • remova uma chave.

Não parece haver uma ferramenta SSH (por exemplo, ssh-keygen , ssh-add & c.) capaz de modificar o arquivo ~/.ssh.authorized_keys e a natureza das opções e < Os campos> comment tornam isso muito difícil de ser alcançado com segurança usando a abordagem usual sed , awk ou perl -pe .

Após comentários , veja um problema simplificado: imagine um script que leia o arquivo ~/.ssh/authorized_keys e produza todas as chaves - apenas as chaves: sem opções e sem linhas em branco ou comentários.

Lutei para fazer isso porque cada linha é delimitada por espaço, mas:

  • as opções podem conter espaço em branco ou estar ausentes por completo e
  • os comentários, devido a espaços em branco, podem ser zero ou mais campos.

Portanto, você não tem ideia de quantos campos uma linha contém e não é possível saber com facilidade quantos desses campos as opções abrangem.

Você precisaria de um regex excessivamente complexo que compreendesse o escopo do campo options para poder removê-lo de maneira confiável antes de produzir o restante da linha. Eu tentei fazer isso com sed e perl -pe .

Um caso de uso planejado para esse script seria listar as impressões digitais de todas as chaves .

    
por starfry 09.02.2017 / 11:32

1 resposta

1

Da sua descrição, você parece querer matar opções e comentar linhas. De acordo com man 8 sshd :

Public keys consist of the following space-separated fields: options, keytype, base64-encoded key, comment. The options field is optional. The keytype is “ecdsa-sha2-nistp256”, “ecdsa-sha2-nistp384”, “ecdsa-sha2-nistp521”, “ssh-ed25519”, “ssh-dss” or “ssh-rsa”; the comment field is not used for anything (but may be convenient for the user to identify the key).

Consequentemente, você pode fazer algo assim:

sed '
    /^[ ]*$/d;
    /^#/d;
    s/^.* \(ecdsa-sha2-nistp256\|ecdsa-sha2-nistp384\|ecdsa-sha2-nistp521\|ssh-ed25519\|ssh-dss\|ssh-rsa\) / /' \
        ~/.ssh/authorized_keys

Isso pressupõe que os comentários principais não contenham ssh-dss , ssh-rsa , etc. Ele também pressupõe uma implementação sed(1) que suporta OR (ou seja, \| ).

Usar um editor de texto pode ser mais fácil e seguro. :)

    
por 09.02.2017 / 13:05