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를 테스트했습니다.

관련 정보