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

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

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

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

  1. pam_faillock.so함께 사용하면 사용자의 상태를 확인할 수 있습니다. 사용자가 잠겨 있으면 비밀번호 프롬프트가 표시되지 않습니다. 체크인할 수 있는 일부 구성이 뒤따릅니다.preauthrequisitefaillock여기.
  2. pam_unix.so사용자의 비밀번호를 확인하는데 사용합니다 . [success=1]비밀번호가 정확하면 다음 줄을 건너뜁니다. try_first_pass첫 번째 단계의 입력을 사용합니다.
  3. pam_faillock.sowith 는 authfail실패한 시도를 기록하고 인증 프로세스가 더 이상 진행되지 않도록 합니다 [default=die]. 사용자가 어디에서 오류가 발생했는지(비밀번호 또는 OTP) 모르도록 하려면 라인 3과 4를 바꿉니다.
  4. pam_google_authenticator.soOTP를 확인하는데 사용합니다 . 더 많은 정보를 확인하실 수 있습니다여기. [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.

관련 정보