공개 키, 비밀번호, OTP의 세 가지 구성 요소를 모두 사용하여 SSH 인증을 구성하는 방법

공개 키, 비밀번호, OTP의 세 가지 구성 요소를 모두 사용하여 SSH 인증을 구성하는 방법

업데이트 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_codecommon-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

한 줄씩 설명하면 다음과 같습니다.

  1. pam_faillock.sopreauth와 함께 사용되며 requisite사용자의 상태를 확인합니다. 사용자가 잠긴 경우 비밀번호 프롬프트를 방지합니다. 다음은 faillock확인할 수 있는 몇 가지 구성입니다 .여기.
  2. pam_unix.so사용자의 비밀번호를 확인 하는데 사용됩니다 . [success=1]비밀번호가 정확하면 다음 줄을 건너뜁니다. try_first_pass1단계의 입력을 사용합니다.
  3. pam_faillock.so을 사용 authfail하면 실패한 시도를 기록하고 인증 프로세스가 더 이상 진행되지 않도록 합니다 [default=die]. 사용자가 무엇이 잘못되었는지(비밀번호 또는 OTP) 알지 못하게 하려면 3행과 4행을 바꿉니다.
  4. OTP를 확인 하는데 사용됩니다 pam_google_authenticator.so. 더 많은 정보를 확인하실 수 있습니다여기. [success=2]OTP가 정확하면 다음 두 줄을 건너뜁니다.
  5. pam_faillock.so이 시도를 좋음으로 표시하면 authsucc잘못된 시도 기록이 지워지고 사용자가 더 많은 작업을 수행할 수 있습니다.
  6. pam_deny.so을 사용하면 requisite로그인 시도가 거부됩니다. 따라서 정보가 정확하면 위의 일부 줄은 이 줄을 건너뜁니다.
  7. pam_permit.so위의 모든 확인을 완료한 후 액세스를 허용하시면 됩니다.

두번째: /etc/pam.d/common-account사용하려면 다음 줄을 편집하고 추가하세요 faillock.

account required        pam_faillock.so

제삼: /etc/pam.d/sshdSSH 연결을 편집합니다. 기본 구성을 변경하지 않았으며 비교를 위해 여기에 나열했습니다.

@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_configSSH 세션 구성 편집

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

일부 주요 항목:

  1. KbdInteractiveAuthentication= yes사용 방법 keyboard-interactive. ChallengeResponseAuthentication더 이상 사용되지 않는 별칭입니다.
  2. UsePAMyes위의 모든 PAM 구성을 사용 하려면 설정해야 합니다 .
  3. 에서는 비밀번호와 OTP 프롬프트 AuthenticationMethods만 명시합니다 .keyboard-interactive

파일을 편집한 후 서비스를 sshd_config다시 로드하여 새 구성을 업데이트합니다.sshd

systemctl reload sshd

이렇게 하면 모두 확인할 수 있습니다 public key + password (of the user) + OTP.

관련 정보