
アップデート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 を使用しており、ユーザーが公開鍵と一致し、パスワードを入力し、OTP (google-authenticator) に続く場合にのみ、サーバーに SSH 接続できるようにしたいと考えています。つまり、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
設定にもかかわらず、入力したときに生の OTP コードが表示されませんでしたcommon-auth
。
P/s:pam_faillock.so
ログイン試行に失敗したユーザーをロックアウトするようにも設定しました。
答え1
何度か試してみて、この郵便受けpam_faillock.so
、ログイン試行をチェックし、必要に応じてユーザーをロックするための機能をソリューションに追加できます。
気をつけて以下の認証関連ファイルを編集するときは、常にバックアップを取るまずファイルの1つのルートセッションを維持することを忘れないでください、他のセッションでログインをテストします。
私の設定ファイルを見てみましょう:
初め:/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
は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
上記のすべてのチェックが完了したら、アクセスを許可するだけです。
2番:/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
第4: /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
。