Como verificar quando é necessário um = ou == no final de uma chave pública SSH?

0

Poderia ser automatizado via ksh / bash, então via um schellscript para checar todos os usuários ~ / .ssh / authorized_keys file para bad = ou == ending?

Um dos meus amigos excluiu o = e o == do final das chaves SSH, então os usuários foram bloqueados, porque essa era a parte da chave deles:)

O padrão

foi deste (poderia ser ssh-rsa e com comprimento de chave diferente):

from="1.2.3.4" ssh-dss AAAAB....0bOJKs= COMMENTHERE COMMENTHERE

para isso:

from="1.2.3.4" ssh-dss AAAAB....0bOJKs COMMENTHERE COMMENTHERE

exemplo: existe um tamanho fixo para as chaves? como filtrar as chaves ruins?

    
por Peter84753 16.09.2016 / 11:09

3 respostas

0
cut -d: -f6 /etc/passwd | 
  while read oneuserraw; do
    if [ -s "${oneuserraw}/.ssh/authorized_keys" ]; then
      echo "${oneuserraw}/.ssh/authorized_keys"
    fi
  done |
  perl -pe 's/\/\//\//g' |
  while read oneuser; do
    echo checking: "$oneuser"
    cat "$oneuser" | while read oneline; do
      if [[ "$oneline" == from* ]]; then
        key=$(echo "$oneline" | cut -d' ' -f3)
      fi
      if [[ "$oneline" == ssh* ]]; then
        key=$(echo "$oneline" | cut -d' ' -f2)
      fi
      length=$(echo "$key" | awk '{ print length }')
      if ! (( $length % 4 == 0 )); then
        echo "$oneline"
      fi
    done
  done

Eu também escrevi um verificador.

Isso até joga fora as linhas ruins onde alguém acertou entrar no ex .: meio da chave ssh E não divisível com 4.

testado no AIX / Linux, assim, ksh e bash.

    
por 16.09.2016 / 12:23
21

A marca = é apenas preenchimento, para preencher uma conversão de base64. Você pode ler mais sobre isso em

Você poderia automatizar uma correção / verificação para isso, porque o número total de caracteres em um valor de base64 (desconsiderando aqueles fora da codificação como espaço em branco) seria um múltiplo de 4.

    
por 16.09.2016 / 11:14
4

Uma solução rápida em Perl:

perl -lane '$a = -1; for(0..$#F) {$a = $_ + 1 if $F[$_] =~ /^ssh-|^ecdsa-/; };
    die if $a == -1;  $p = (4 - length($F[$a]) % 4) % 4; 
    $F[$a] .= "=" x $p;  print join " ", @F' < authorized_keys > authorized_keys2

Para cada linha ( -n ) Autosplit ( -a ) dos campos para @F ao longo dos espaços, encontre o campo que contém o tipo de chave, o próximo é a chave. Subtraia de 4 o módulo de comprimento 4 para obter o número de sinais de = que precisamos adicionar, exceto tomar outro módulo para transformar um 4 em um 0 caso o campo já tenha o tamanho correto.

O manual diz que

Protocol 2 public key consist of: options, keytype, base64-encoded key, comment. The options field is optional; its presence is determined by whether the line starts with a number or not

mas isso não está certo, já que os tipos de chave v2 também não iniciam com números. O campo de opções contém espaços, portanto, a posição do tipo de chave pode ser qualquer coisa. Na verdade, devemos analisar as opções para encontrar as strings entre aspas, mas, heuristicamente, procurar os tipos de chaves conhecidas.

    
por 16.09.2016 / 11:52

Tags