저는 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 yes
Michael이 말했듯이 온라인 sshd_config
이나 라인이 필요하지 않으며 AuthenticationMethods
단지 ChallengeResponse
and 를 설정 UsePAM
하면 됩니다 yes
.