アップデート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
まだ3つの組み合わせに問題があります。
整理するのに役立ちます。
これまでの私の試みは次のとおりです。
/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
PS: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が正しい場合は、次の2行をスキップしてください。 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
。