
업데이트 1: 에서 이 기본 구성으로 공개키 + 비밀번호 + OTP를 모두 적용할 수 있습니다 /etc/pam.d/common-auth
.
auth [success=ok] pam_unix.so
auth [success=1] pam_google_authenticator.so nullok echo_verification_code [authtok_prompt=Enter your OTP:]
auth requisite pam_deny.so
auth required pam_permit.so
pam_faillock.so
이것을 원래 계획대로 적용해 보도록 하겠습니다 .
원래 질문:
저는 Debian 10 및 12를 사용하고 있으며 공개 키와 일치하는 경우에만 사용자가 성공적으로 SSH를 통해 서버에 접속하도록 하고 비밀번호를 입력한 다음 OTP(google-authenticator)를 따르도록 하고 싶습니다. 간단히 말해서 SSH에는 공개키 + 비밀번호 + OTP가 필요합니다.
publickey + password
이미 또는 조합을 성공적으로 구성했지만 publickey + OTP
여전히 세 가지를 모두 조합하는 데 어려움을 겪고 있습니다.
구성하는 데 도움을 주세요.
지금까지 내 시도 :
/etc/pam.d/common-auth
auth required pam_faillock.so preauth audit silent deny=5 unlock_time=1800
auth sufficient pam_unix.so try_first_pass
auth [default=die] pam_faillock.so authfail audit deny=5 fail_interval=120 unlock_time=1800
auth sufficient pam_faillock.so authsucc audit deny=5 fail_interval=120 unlock_time=1800
auth required [success=1] pam_google_authenticator.so echo_verification_code
auth requisite pam_deny.so
auth required pam_permit.so
/etc/pam.d/sshd
@include common-auth
account required pam_nologin.so
@include common-account
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close
session required pam_loginuid.so
session optional pam_keyinit.so force revoke
@include common-session
session optional pam_motd.so motd=/run/motd.dynamic
session optional pam_motd.so noupdate
session optional pam_mail.so standard noenv # [1]
session required pam_limits.so
session required pam_env.so # [1]
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
@include common-password
/etc/ssh/sshd_config
Include /etc/ssh/sshd_config.d/*.conf
MaxAuthTries 5
MaxSessions 1
PubkeyAuthentication yes
PasswordAuthentication yes
PermitEmptyPasswords no
KbdInteractiveAuthentication yes
UsePAM yes
X11Forwarding yes
PrintMotd no
ClientAliveInterval 60
ClientAliveCountMax 15
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,password,keyboard-interactive
연결을 시도할 때:ssh -i <key_path> user@server -vvv
debug1: Authentications that can continue: publickey
debug3: start over, passed a different list publickey
debug3: preferred publickey,keyboard-interactive,password
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Trying private key: <key_path>
debug3: sign_and_send_pubkey:
debug3: sign_and_send_pubkey: signing using rsa-sha2-512
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51
Authenticated with partial success.
debug1: Authentications that can continue: password
debug3: start over, passed a different list password
debug3: preferred publickey,keyboard-interactive,password
debug3: authmethod_lookup password
debug3: remaining preferred: ,keyboard-interactive,password
debug3: authmethod_is_enabled password
debug1: Next authentication method: password
user@server's password:
debug3: send packet: type 50
debug2: we sent a password packet, wait for reply
debug3: receive packet: type 51
Authenticated with partial success.
debug1: Authentications that can continue: keyboard-interactive
debug3: start over, passed a different list keyboard-interactive
debug3: preferred publickey,keyboard-interactive,password
debug3: authmethod_lookup keyboard-interactive
debug3: remaining preferred: password
debug3: authmethod_is_enabled keyboard-interactive
debug1: Next authentication method: keyboard-interactive
debug2: userauth_kbdint
debug3: send packet: type 50
debug2: we sent a keyboard-interactive packet, wait for reply
debug3: receive packet: type 60
debug2: input_userauth_info_req: entering
debug2: input_userauth_info_req: num_prompts 1
(user@server) Password:
debug3: send packet: type 61
debug3: receive packet: type 51
debug1: Authentications that can continue: keyboard-interactive
debug2: userauth_kbdint
debug3: send packet: type 50
debug2: we sent a keyboard-interactive packet, wait for reply
debug3: receive packet: type 60
debug2: input_userauth_info_req: entering
debug2: input_userauth_info_req: num_prompts 1
(user@server) Password:
debug3: send packet: type 61
debug3: receive packet: type 51
debug1: Authentications that can continue: keyboard-interactive
debug2: userauth_kbdint
debug3: send packet: type 50
debug2: we sent a keyboard-interactive packet, wait for reply
debug3: receive packet: type 60
debug2: input_userauth_info_req: entering
debug2: input_userauth_info_req: num_prompts 1
(user@server) Password:
debug3: send packet: type 61
debug3: receive packet: type 51
debug1: Authentications that can continue: keyboard-interactive
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.
user@server: Permission denied (keyboard-interactive).
3단계(키보드 대화형)에서 실패했으며 일반 OTP 확인과 몇 가지 사항이 달랐습니다.
- 를 요청한 것이 아니라
Verification code:
단지 을 요청한 것입니다(user@server) Password:
. echo_verification_code
.NET 설정 에도 불구하고 입력했을 때 원시 OTP 코드가 표시되지 않았습니다common-auth
.
추신: 또한 pam_faillock.so
실패한 로그인 시도에 대해 사용자를 잠그도록 구성했습니다.
답변1
몇 번 시도한 끝에 감사합니다.이 게시물pam_faillock.so
, 로깅 시도를 확인하고 필요한 경우 사용자를 잠그는 솔루션에 추가할 수 있습니다 .
조심하세요아래 인증 관련 파일을 편집할 때 언제나백업을 해라파일의 첫 번째. 그리고하나의 루트 세션을 활성 상태로 유지하는 것을 기억하십시오을 클릭하고 다른 세션에서 로그인을 테스트하세요.
내 구성 파일을 살펴보겠습니다.
첫 번째: /etc/pam.d/common-auth
모든 종류의 로그인 방법에 적용하려면 편집하세요.
auth requisite pam_faillock.so preauth audit deny=5 fail_interval=120 unlock_time=1800
auth [success=1] pam_unix.so try_first_pass
auth [default=die] pam_faillock.so authfail audit deny=5 fail_interval=120 unlock_time=1800
auth [success=2] pam_google_authenticator.so nullok echo_verification_code [authtok_prompt=Enter your OTP:]
auth sufficient pam_faillock.so authsucc audit deny=5 fail_interval=120 unlock_time=1800
auth requisite pam_deny.so
auth required pam_permit.so
한 줄씩 설명하면 다음과 같습니다.
- 와
pam_faillock.so
함께 사용하면 사용자의 상태를 확인할 수 있습니다. 사용자가 잠겨 있으면 비밀번호 프롬프트가 표시되지 않습니다. 체크인할 수 있는 일부 구성이 뒤따릅니다.preauth
requisite
faillock
여기. pam_unix.so
사용자의 비밀번호를 확인하는데 사용합니다 .[success=1]
비밀번호가 정확하면 다음 줄을 건너뜁니다.try_first_pass
첫 번째 단계의 입력을 사용합니다.pam_faillock.so
with 는authfail
실패한 시도를 기록하고 인증 프로세스가 더 이상 진행되지 않도록 합니다[default=die]
. 사용자가 어디에서 오류가 발생했는지(비밀번호 또는 OTP) 모르도록 하려면 라인 3과 4를 바꿉니다.pam_google_authenticator.so
OTP를 확인하는데 사용합니다 . 더 많은 정보를 확인하실 수 있습니다여기.[success=2]
OTP가 정확하면 다음 두 줄을 건너뜁니다.pam_faillock.so
표시가 있는authsucc
이 시도는 좋은 시도이며 잘못된 시도 기록을 지워 사용자가 더 많은 작업을 수행할 수 있도록 합니다.pam_deny.so
을 사용하면requisite
로그인 시도가 거부됩니다. 따라서 정보가 정확하면 위의 일부 줄은 이 줄을 건너뜁니다.pam_permit.so
위의 모든 확인을 마친 후 액세스를 허용하면 됩니다.
두번째: /etc/pam.d/common-account
사용하려면 다음 줄을 편집하고 추가하세요 faillock
.
account required pam_faillock.so
제삼: /etc/pam.d/sshd
SSH 연결을 위해 편집합니다. 저는 기본 구성에서 아무것도 변경하지 않았으며 여러분이 비교할 수 있도록 여기에 나열했습니다.
@include common-auth
account required pam_nologin.so
@include common-account
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close
session required pam_loginuid.so
session optional pam_keyinit.so force revoke
@include common-session
session optional pam_motd.so motd=/run/motd.dynamic
session optional pam_motd.so noupdate
session optional pam_mail.so standard noenv # [1]
session required pam_limits.so
session required pam_env.so # [1]
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
@include common-password
네번째: /etc/ssh/sshd_config
SSH 세션을 구성하려면 편집하세요.
Include /etc/ssh/sshd_config.d/*.conf
MaxAuthTries 5
MaxSessions 1
PubkeyAuthentication yes
PasswordAuthentication yes
PermitEmptyPasswords no
KbdInteractiveAuthentication yes
UsePAM yes
X11Forwarding yes
PrintMotd no
ClientAliveInterval 60
ClientAliveCountMax 15
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
AuthenticationMethods publickey,keyboard-interactive
일부 주요 항목:
KbdInteractiveAuthentication
= 방법을yes
사용하는 것 입니다keyboard-interactive
.ChallengeResponseAuthentication
이에 대한 더 이상 사용되지 않는 별칭입니다.UsePAM
yes
위의 모든 PAM 구성을 사용하려면 로 설정해야 합니다.- 에서는 비밀번호와 OTP 프롬프트 둘 다에 대해서만
AuthenticationMethods
선언합니다 .keyboard-interactive
파일 을 편집한 후 서비스 sshd_config
를 다시 로드하여 sshd
새 구성을 업데이트하세요.
systemctl reload sshd
이렇게 하면 모든 항목을 확인할 수 있습니다 public key + password (of the user) + OTP
.