개인적인 관심으로 MFA를 가지고 놀다가 알 수 없는 문제에 부딪혔습니다. 저는 최근에 PAM(Google Authenticator 사용)을 설정했고 이를 하나 이상의 인증 유형과 결합하고 싶습니다.
다음과 같이 여러 계정과 sshd_config가 있습니다.
PasswordAuthentication no
PermitEmptyPasswords no
AuthenticationMethods publickey,keyboard-interactive
ChallengeResponseAuthentication yes
UsePAM yes
Match User user2
PasswordAuthentication yes
AuthenticationMethods password,keyboard-interactive
"user2"를 제외한 모든 사용자에 대해 키와 확인 코드를 사용하여 올바르게 인증할 수 있습니다. 그러나 "user2"와 연결을 시도하는 데 문제가 있습니다. 클라이언트에서 연결을 시도하면 비밀번호 및 확인 코드 프롬프트가 올바르게 표시됩니다. 그러나 예상되는 비밀번호는 "user2" 계정 비밀번호("hunter2"라고 가정)가 아니라 앱에 표시된 확인 코드입니다.
$ ssh user2@machine -p port
user2@machine's password:
비밀번호 프롬프트에 "hunter2"를 입력하면 거부됩니다. 하지만 앱에 표시된 인증 코드를 입력하면 다음 메시지가 표시됩니다.
$ ssh user2@machine -p port
user2@machine's password:
Verification Code:
물론 두 번째로 인증 코드가 필요합니다. 그러면 모두 로그인이 되었습니다.
user2-block에서 몇 가지 다른 조합을 시도했습니다.
Match User user2
PasswordAuthentication yes
AuthenticationMethods password
위와 같이 비밀번호 프롬프트에 인증 코드가 필요합니다. 그러면 인증 코드 프롬프트 전에 성공적으로 로그인됩니다.
내 /etc/pam.d/sshd 파일은 다음을 추가하는 것을 제외하고는 완전히 그대로 유지됩니다.
auth required pam_google_authenticatior.so
그리고 댓글을 달고
@include common-auth
->
#@include common-auth
auth required pam_google_authenticatior.so
답변1
이는 OpenSSH의 정상적인 결과입니다. password
및 인증 방법 모두 keyboard-interactive
설계상 PAM을 사용하며 둘 다 정확히 동일한 PAM 스택을 호출합니다.(결국 "UsePAM yes"가 있습니다. 이는 비밀번호 확인을 위해 PAM을 사용하라고 지시했다는 의미이므로 PAM을 성실하게 호출하여 비밀번호라고 생각하는 것이 무엇인지 확인합니다.)따라서 둘 다 동일한 입력을 받아들입니다.
이 두 메커니즘의 유일한 차이점은 'keyboard-interactive'만 실제로 PAM이 여러 프롬프트를 연속으로 표시하거나 표시되는 프롬프트 텍스트를 변경할 수 있다는 것입니다. 한편 '비밀번호'는 고정된 형식의 메커니즘입니다.아니요SSH 클라이언트로 전송된 실제 "프롬프트" 그것은 정확히 하나의 비밀번호를 요구하며 그것이 바로 그것입니다.
즉, 두 가지 메커니즘을 결합하는 것은 유용하지 않습니다. OpenSSH에서 비밀번호와 토큰을 별도로 확인하도록 할 수는 없습니다. 전부 아니면 전무입니다. (OpenSSH 내에서 두 개의 서로 다른 PAM 스택을 지정하는 기능이 여러 번 제안되었지만 지금까지 그러한 패치는 승인되지 않았습니다.)