업데이트 1: 을 사용할 수 있습니다 /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
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
1단계의 입력을 사용합니다.pam_faillock.so
을 사용authfail
하면 실패한 시도를 기록하고 인증 프로세스가 더 이상 진행되지 않도록 합니다[default=die]
. 사용자가 무엇이 잘못되었는지(비밀번호 또는 OTP) 알지 못하게 하려면 3행과 4행을 바꿉니다.- OTP를 확인 하는데 사용됩니다
pam_google_authenticator.so
. 더 많은 정보를 확인하실 수 있습니다여기.[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
.