SSHD는 비밀번호 + Google 인증기 조합을 사용하여 액세스를 거부합니다.

SSHD는 비밀번호 + Google 인증기 조합을 사용하여 액세스를 거부합니다.

저는 ProxMox 5.3(Debian 9stretch) 하이퍼바이저를 실행 중이고 하이퍼바이저에 대한 SSH 액세스를 보호하고 싶습니다. 내가 찾은 문서를 따랐습니다.여기openssh에 MFA를 추가하기 위해 약간 수정했습니다. 즉, 다음과 같은 인증 방법을 허용하고 싶습니다.

  • 비밀번호 뒤에 OATH-TOTP(google-authenticator)가 옵니다.
  • 공개 키 뒤에 OATH-TOTP(google-authenticator)가 옵니다.

그러나 어떤 이유로든 가상 머신 중 하나에서 하이퍼바이저에 SSH로 연결하여 이 구성을 테스트하려고 시도했을 때 google-authenticator 코드를 입력하라는 메시지가 표시되지 않았습니다. 이것이 내가 보는 것입니다/var/log/auth.log

[root@vm1 ~]# ssh 192.168.86.2
[email protected]'s password: 
Permission denied, please try again.
root@hypervisor:~# tail -f /var/log/auth.log
...
Apr 17 08:58:53 pve1-gkh8ww1 sshd(pam_google_authenticator)[8971]: Invalid verification code
Apr 17 08:58:54 pve1-gkh8ww1 sshd[8971]: Failed password for root from 192.168.86.3 port 54948 ssh2

방금 비밀번호로 로그인했기 때문에 비밀번호를 올바르게 입력했다는 것을 압니다. 그래서 좀 더 자세한 출력을 위해 클라이언트와 서버 모두에서 실행해 보았습니다.

고객으로부터

debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /root/.ssh/id_rsa
debug1: Authentications that can continue: publickey,password
debug1: Trying private key: /root/.ssh/id_dsa
debug1: Trying private key: /root/.ssh/id_ecdsa
debug1: Trying private key: /root/.ssh/id_ed25519
debug1: Next authentication method: password
[email protected]'s password: 
debug1: Authentications that can continue: publickey,password
Permission denied, please try again.

서버에서

debug1: KEX done [preauth]
debug1: userauth-request for user root service ssh-connection method none [preauth]
debug1: attempt 0 failures 0 [preauth]
debug1: authentication methods list 0: password,keyboard-interactive
debug1: authentication methods list 1: publickey,keyboard-interactive
debug1: authentication methods list 0: password,keyboard-interactive [preauth]
debug1: authentication methods list 1: publickey,keyboard-interactive [preauth]
debug1: PAM: initializing for "root"
debug1: PAM: setting PAM_RHOST to "192.168.86.3"
debug1: PAM: setting PAM_TTY to "ssh"
debug1: userauth-request for user root service ssh-connection method publickey [preauth]
debug1: attempt 1 failures 0 [preauth]
debug1: userauth_pubkey: test whether pkalg/pkblob are acceptable for RSA SHA256:5OtnlHMBJnFp75gii09+T8zQdJcFoHlI0wHZoL8i8wU [preauth]
debug1: temporarily_use_uid: 0/0 (e=0/0)
debug1: trying public key file /root/.ssh/authorized_keys
debug1: fd 4 clearing O_NONBLOCK
debug1: restore_uid: 0/0
debug1: temporarily_use_uid: 0/0 (e=0/0)
debug1: trying public key file /root/.ssh/authorized_keys2
debug1: Could not open authorized keys '/root/.ssh/authorized_keys2': No such file or directory
debug1: restore_uid: 0/0
Failed publickey for root from 192.168.86.3 port 54954 ssh2: RSA SHA256:5OtnlHMBJnFp75gii09+T8zQdJcFoHlI0wHZoL8i8wU

debug1: userauth-request for user root service ssh-connection method password [preauth]
debug1: attempt 2 failures 1 [preauth]
debug1: PAM: password authentication failed for root: Authentication failure
Failed password for root from 192.168.86.3 port 54954 ssh2

특히, 나는 고객의 이 말에 혼란스러워요

debug1: Authentications that can continue: publickey,password

이는 서버의 디버그 출력과 일치하지 않는 것 같습니다.

debug1: authentication methods list 0: password,keyboard-interactive
debug1: authentication methods list 1: publickey,keyboard-interactive

/etc/ssh/sshd_config다른 필수 지시어와 함께 서버에 AuthenticationMethods 지시어를 명시적으로 설정했습니다.

AuthenticationMethods password,keyboard-interactive publickey,keyboard-interactive

ChallengeResponseAuthentication yes 

PermitRootLogin yes

PasswordAuthentication yes

UsePAM yes

이것은 내 관련 부분입니다/etc/pam.d/sshd

# Standard Un*x authentication.
@include common-auth
...
...
# Standard Un*x password updating.
@include common-password
auth required pam_google_authenticator.so

답변1

대답은 간단합니다. 비밀번호 인증으로 두 가지 요소를 요청할 수는 없지만, 작동하는 데 도움이 되는 설명을 제공받을 수 있습니다. 비밀번호 인증은 비밀번호를 사용하는 것으로 생각합니다. 이것은 정확하지 않습니다.

"비밀번호 인증"은 단일 비밀번호에 대한 간단한 요청입니다. 서버가 클라이언트에 특정 메시지를 보내지 않았습니다. 클라이언트는 프롬프트를 표시하는 방법을 선택합니다(예: "user@host의 비밀번호 입력:"을 묻는 경우).

"키보드 상호 작용"은 정보의 양에 관계없이 더 복잡한 요청입니다. 각 메시지에 대해 서버는 미리 알림 태그를 보냅니다. 또한 서버는 예상되는 응답 형식에 대한 설명을 제공할 수 있습니다. 서버는 어떤 입력이 비밀인지(비밀번호는 화면에서 난독화해야 함), 그렇지 않은 것(OTP)을 지정할 수도 있습니다.

대부분의 경우 키보드 대화형 인증은 단일 "비밀" 비밀번호 프롬프트를 요청하는 데 사용되므로 최종 사용자에 대한 비밀번호 인증과 사실상 구별할 수 없습니다.

키보드 상호작용은 서버가 여러 개의 질문/응답 쌍을 보낼 수 있도록 하는 인증 메커니즘이므로 Google Authenticator PAM 플러그인은 비밀번호와 OTP라는 두 가지 질문을 보내도록 요구합니다.

따라서 비밀번호 인증은 두 가지 이상의 메시지를 표시할 수 없으므로 Google Authenticator에서는 절대 사용되지 않습니다. Google OTP는 개인 키와 OTP를 사용하여 비밀번호 프롬프트를 입력합니다(이상적이지는 않지만). Google Authenticator는 키보드를 통해 비밀번호 및 OTP와 상호작용합니다. Google OTP는 올바른 정보를 요청할 수 없기 때문에 비밀번호 프롬프트를 사용할 수 없습니다.

클라이언트 소프트웨어에서 비밀번호보다 키보드 상호 작용을 우선시하면 현재 구성에 따라 두 개의 프롬프트가 표시됩니다. 이를 방지하기 위해 비밀번호 인증을 완전히 비활성화할 수 있습니다.

해결 방법:

지원되는 인증 방법에서 비밀번호를 제거하고 비밀번호 인증을 위해 키보드 상호 작용을 사용합니다./etc/ssh/sshd_config에서 "PasswordAuthentication no"를 설정하십시오.

그래서: /etc/ssh/sshd_config

UsePAM yes
PasswordAuthentication no
ChallengeResponseAuthentication yes
PubkeyAuthentication yes
# I don't use AuthenticationMethods at all and rely on my yes/no's

/etc/pam.d/sshd (하단)

auth required pam_google_authenticator.so nullok

답변2

/etc/ssh/sshd_config에서 UsePAM yes 뒤에 이것을 추가하십시오.

AuthenticationMethods publickey,keyboard-interactive

답변3

@michaelkrieger 답변은 매우 좋지만 비밀번호 인증 + Google Authenticator 조합을 활성화하는 방법을 설명하는 요점을 놓친 것 같습니다. 내 경우에는 다음과 같습니다.이 디지털 오션 튜토리얼, 비밀번호를 사용해도 작동하지 않습니다. 이는 튜토리얼에서 다음 줄에 주석을 달 수 있기 때문입니다 /etc/pam.d/sshd.

# Standard Un*x authentication.
@include common-auth

나는 튜토리얼을 따라가면서 그 줄에 주석을 달았던 것을 기억할 때까지 그것을 알아내려고 꽤 많은 시간을 보냈습니다.

PasswordAuthentication yesMichael이 말했듯이 온라인 sshd_config이나 라인이 필요하지 않으며 AuthenticationMethods단지 ChallengeResponseand 를 설정 UsePAM하면 됩니다 yes.

관련 정보