공개 키 + Google 인증자 또는 비밀번호 + Google 인증 자의 두 가지 인증 유형을 허용하고 싶습니다 .

내에는 다음이 있습니다 sshd_config.

AuthenticationMethods publickey,keyboard-interactive:pam password,keyboard-interactive:pam
UsePAM yes
ChallengeResponseAuthentication yes
PubkeyAuthentication yes
PasswordAuthentication yes

그리고 /etc/pam.d/ssh나는 주석을 달지 않았다

#@include common-auth and added auth required pam_google_authenticator.so

파일 끝에.

키 + 토큰 경로는 여전히 작동하지만 어떤 이유로 내 비밀번호는 항상 "액세스 거부됨" 메시지와 함께 거부됩니다.

UsePAM"yes"로 설정할 때마다 비밀번호 인증이 실패 한다는 것을 알았습니다 . 이유가 확실하지 않습니까?

/etc/pam.d/sshd의 내용: (이 파일은 나에게 매우 긴 것처럼 보이지만 우분투의 기본값이었습니다. 이 파일을 줄일 수 있습니까?)

# PAM configuration for the Secure Shell service

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

# Disallow non-root logins when /etc/nologin exists.
account    required     pam_nologin.so

# Uncomment and edit /etc/security/access.conf if you need to set     complex
# access limits that are hard to express in sshd_config.
# account  required     pam_access.so

# Standard Un*x authorization.
@include common-account

# SELinux needs to be the first session rule.  This ensures that any
# lingering context has been cleared.  Without this it is possible     that a
# module could execute code in the wrong domain.
session [success=ok ignore=ignore module_unknown=ignore default=bad]            pam_selinux.so close

# Set the loginuid process attribute.
session    required     pam_loginuid.so

# Create a new session keyring.
session    optional     pam_keyinit.so force revoke

# Standard Un*x session setup and teardown.
@include common-session

# Print the message of the day upon successful login.
# This includes a dynamically generated part from /run/motd.dynamic
# and a static (admin-editable) part from /etc/motd.
session    optional     pam_motd.so  motd=/run/motd.dynamic noupdate
session    optional     pam_motd.so # [1]

# Print the status of the user's mailbox upon successful login.
session    optional     pam_mail.so standard noenv # [1]

# Set up user limits from /etc/security/limits.conf.
session    required     pam_limits.so

# Read environment variables from /etc/environment and
# /etc/security/pam_env.conf.
session    required     pam_env.so # [1]
# In Debian 4.0 (etch), locale-related environment variables were moved to
# /etc/default/locale, so read that as well.
session    required     pam_env.so user_readenv=1     envfile=/etc/default/locale

# SELinux needs to intervene at login time to ensure that the process     starts
# in the proper default security context.  Only sessions which are intended
# to run in the user's context should be run after this.
session [success=ok ignore=ignore module_unknown=ignore default=bad]            pam_selinux.so open

# Standard Un*x password updating.
@include common-password

auth required pam_google_authenticator.so

/etc/pam.d/common-auth의 내용:

#
# /etc/pam.d/common-auth - authentication settings common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of the authentication modules that define
# the central authentication scheme for use on the system
# (e.g., /etc/shadow, LDAP, Kerberos, etc.).  The default is to use the
# traditional Unix authentication mechanisms.
#
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules.  See
# pam-auth-update(8) for details.

# here are the per-package modules (the "Primary" block)
auth    [success=1 default=ignore]  pam_unix.so nullok_secure
# here's the fallback if no module succeeds
auth    requisite           pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around 
auth    required            pam_permit.so
# and here are more per-package modules (the "Additional" block)
auth    optional            pam_cap.so 
# end of pam-auth-update config

내 질문은 실제로 "AuthenticationMethods 암호"와 함께 "UsePAM yes"를 사용하는 방법으로 나뉩니다. 이 질문을 삭제하고 새 질문을 열어야 할까요?

answer

I found out that whenever I set UsePAM to yes, the password authentication fails. Not sure why?

UsePAM옵션은 인증 방법 password이 두 번째 요소에 사용하려는 것과 동일한 PAM 모듈을 사용하도록 합니다. 이것이 비밀번호를 거부하는 이유입니다.


이것은 "이유"를 설명하는 귀하의 질문에 대한 답변이지만 "개선 방법"은 완전한 솔루션이 아닙니다. 이 조합을 설정하는 것은 까다롭습니다. 간단하고 정확하게 하는 방법을 배우고 싶었지만 지금까지는 시간이 없었습니다. 그러나 나는 당신의 아이디어에 열려 있습니다 :)

나는 이것을 작동시키려고 아침 내내 시간을 보냈다. AFAIK 이제 공개 키 인증 방법은 PAM 스택 외부에서 발생합니다.

내가 관찰 할 수있는 갖는에서 ChallengeResponseAuthentication yesUsePAM yes의 값이 있음을 의미 PasswordAuthentication효율적으로 무시되고 간주 될 수 있습니다 no. 이는 will passwordAuthenticationMethods이 항상 실패 함을 의미합니다 .

PAM 스택 내에서 공개 키 로그인의 성공 또는 실패 상태를 관찰할 수 있다면 문제가 되지 않습니다. 그러나 우리는 할 수 없습니다. SSH 내부에서 완전히 처리되는 것 같습니다.

이것은 우리가 (유효한 AuthenticationMethods세트로) 할 수 있다는 것을 의미합니다 :

  • publickey 그리고 아무것도
  • 전체 PAM 스택
  • publickey 전체 PAM 스택

그러나 우리가 원하는 대로가 아니며 성공 publickey여부 publickey따라 PAM 스택의 일부입니다 .

이것에 대한 잘못된 증명을 원합니다!

대답은 단순히 암호 인증으로 두 가지 요소를 요청할 수 없지만 작업을 수행하는 데 도움이 되는 설명이 포함되어 있다는 것입니다. 암호를 사용하는 방법으로 암호 인증을 찾고 있습니다. 이것은 잘못된 것입니다.

'비밀번호 인증'은 단일 비밀번호에 대한 간단한 요청입니다. 서버에서 클라이언트로 보내는 특정 프롬프트는 없습니다. 프롬프트에 레이블을 지정하는 방법을 선택하는 것은 클라이언트입니다(예: "Enter password for [email protected] :").

'keyboard-interactive'는 임의의 수의 정보에 대한 보다 복잡한 요청입니다. 각 정보에 대해 서버는 프롬프트에 대한 레이블을 보냅니다. 또한 서버가 예상하는 응답 형식에 대한 설명을 제공할 수 있습니다. 서버는 또한 어떤 입력이 비밀이고(비밀번호는 화면에서 난독화되어야 함) 그렇지 않은 입력(OTP)을 지정할 수 있습니다.

대부분의 경우 키보드 대화형 인증은 단일 "비밀" 암호 프롬프트를 요청하는 데 사용되므로 최종 사용자의 암호 인증과 거의 차이가 없습니다.

keyboard-interactive는 서버가 여러 챌린지/응답 쌍을 보낼 수 있도록 하는 인증 메커니즘이므로 Google Authenticator PAM 플러그인은 비밀번호와 OTP라는 두 가지 질문을 보내는 데 필요합니다.

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

클라이언트 소프트웨어에서 암호보다 키보드 대화식을 우선시하면 현재 구성으로 두 개의 프롬프트를 받도록 설정됩니다. 비밀번호 인증을 전혀 사용하지 않으려면 비밀번호 인증을 완전히 비활성화할 수 있습니다.

My question actually breaks down to: How do I use "UsePAM yes" together with "AuthenticationMethods password"

이에 대한 직접적인 답변은 불가능합니다. 지원되는 인증 방법으로 비밀번호를 제거하고 비밀번호 인증을 위해 키보드 대화식에 의존하십시오. /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