SSH公開鍵に最後に=または==が必要な時期を確認する方法は?

SSH公開鍵に最後に=または==が必要な時期を確認する方法は?

すべてのユーザーの〜/ .ssh / authorized_keysファイルがschellscriptを介して無効な=または==エンディングをチェックするようにksh / bashを介して自動化できますか?

私の友人がSSHキーの最後から=と==を削除し、ユーザーがキーの一部だったのでロックしました. :)

パターンは次のとおりです(おそらくキーの長さが異なるssh-rsaです)。

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

これに関して:

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

回避策の例:キーの長さは固定されていますか?間違ったキーをフィルタリングする方法は?

答え1

この=タグはBase64変換を埋めるためのパディングだけです。これについてもっと読むことができます。

base64値の文字の総数(無視)のため、この問題を自動的に修正/確認できます。外部エンコーディング(スペースなど)は4の倍数です。

答え2

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

各行(-n)に対して-a自動的にフィールド()を@F線に沿ってスペースに分割し、キータイプとキーを含むフィールドを探します。 4からモジュールに4の長さを引くと、追加する必要があるシンボルの数が表示されます=。ただし、フィールドがすでに正しい長さの場合は、モジュロ4を使用して4を0に変換しない限りです。

マニュアルによると

プロトコル 2 公開鍵は、オプション、鍵タイプ、base64 エンコード鍵、およびコメントで構成されます。オプションフィールドはオプションです。その行が数字で始まるかどうかによって異なります。

しかし、v2キータイプも数字で始まらないため、これは正しいことではありません。オプションフィールドにはスペースが含まれているため、キータイプの場所はどこでも可能です。実際にはオプションを解析して引用符付き文字列を見つける必要がありますが、経験的に知られているキータイプを見つける必要があります。

答え3

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

私もチェッカーを直接書いた。

誰かが ex.: ssh キーの途中で Enter を押したが 4 で割れないエラー行も表示されます。

AIX / Linuxでkshとbashをテストしました。

関連情報