모든 사용자의 ~/.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를 테스트했습니다.