すべてのユーザーの〜/ .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変換を埋めるためのパディングだけです。これについてもっと読むことができます。
- SSH公開鍵の末尾にある等号=または==はどういう意味ですか?、 から情報を取得します。RFC 4716" SSH公開鍵ファイル形式
- base64でエンコードされた文字列の末尾に=記号があるのはなぜですか?、ベースRFC 2045:MIME(多目的インターネットメール拡張)
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をテストしました。