もっと詳しく

このガイドに従って、ログイン試行が複数回失敗した後に Linux ユーザー アカウントをロックする方法を学習してください。 プラグイン可能な認証モジュール (PAM) を介した Linux は、ログイン試行が特定の回数失敗した後にアカウントをロックするように構成できます。 これは、ブルート フォース認証攻撃の抑制を目的としたセキュリティ対策の一部です。

これは、具体的には pam_faillock モジュール。 pam_faillock モジュール 指定された間隔でユーザーごとに失敗した認証試行のリストを維持し、連続して失敗した認証が拒否された場合にアカウントをロックします。

通常、root ユーザーの認証に失敗しても、サービス拒否を防ぐために root アカウントがブロックされることはありません: ユーザーにシェル アカウントが与えられておらず、root が su またはマシン コンソール (telnet ではなく) を介してのみログインできる場合/ssh など)、これは安全です「、pam_faillock のマニュアル ページ。

複数回のログイン試行の失敗後に Linux ユーザー アカウントをロックする

更新するファイル

すでに述べたように、 pam_faillock モジュールを使用して、アカウントがロックされる前に、Linux システムで指定された期間内に許容されるログイン失敗の数を制限できます。

失敗した認証ポリシーを定義するために編集する必要があるファイルがいくつかあります。

これらには以下が含まれます。

CentOS および同様の派生物について

  • /etc/pam.d/system-auth
  • /etc/pam.d/password-auth

Ubuntu/Debian および同様の派生物について

  • /etc/pam.d/common-auth
  • /etc/pam.d/共通アカウント

PAM_FAILLOCK モジュールの構文

pam_faillock モジュールは、構成時に以下の構文を取ります。

auth CONTROL_FLAGS pam_faillock.so {preauth|authfail|authsucc} [dir=/path/to/tally-directory] [even_deny_root] [deny=n] [fail_interval=n] [unlock_time=n] [root_unlock_time=n] [audit] [silent] [no_log_info]
account CONTROL_FLAGS pam_faillock.so [dir=/path/to/tally-directory] [no_log_info]

authaccount さまざまな PAM モジュール インターフェイスを定義します。

  • auth: アカウントのパスワードを要求して検証します
  • account: ユーザー アカウントを検証し、ユーザー アカウントの有効期限が切れているかどうか、またはユーザーがログインを許可されているかどうかを確認します。

その他のモジュール インターフェイスには次のものがあります。

  • password: ユーザーパスワードの変更を含め、ユーザーパスワードを管理します。
  • session: ユーザー セッションを構成および管理します。

この特定のガイドでは、関心があるのは 認証 PAM インターフェイス。

CONTROL_FLAGS PAM モジュールの失敗/成功の結果をどうするかを定義します。 それらには以下が含まれます。

  • required: 認証を続行するには、モジュールの結果が成功する必要があります。 この時点でテストが失敗した場合、そのインターフェイスを参照するすべてのモジュール テストの結果が完了するまで、ユーザーには通知されません。
  • requisite: 認証を続行するには、モジュールの結果が成功する必要があります。 ただし、この時点でテストが失敗した場合、最初の失敗を反映したメッセージでユーザーにすぐに通知されます。 required また requisite モジュールテスト。
  • sufficient: 失敗した場合、モジュールの結果は無視されます。 ただし、フラグが立てられたモジュールの結果が sufficient 成功し、以前のモジュールにフラグが立てられていません required 失敗した場合、他の結果は必要なく、ユーザーはサービスに対して認証されます。
  • optional: モジュールの結果は無視されます。 としてフラグが立てられたモジュール optional 他のモジュールがインターフェイスを参照しない場合にのみ、認証が成功するために必要になります。
  • include: 他のコントロールとは異なり、これはモジュールの結果の処理方法とは関係ありません。 このフラグは、指定されたパラメーターに一致する構成ファイル内のすべての行を取り込み、それらを引数としてモジュールに追加します。

CONTROL_FLAGS は次の形式を取ることができます。

[value1=action1 value2=action2 ...]

したがって、上記の制御フラグは次のように表すことができます。

  • 必要: [success=ok new_authtok_reqd=ok ignore=ignore default=bad]
  • 必須: [success=ok new_authtok_reqd=ok ignore=ignore default=die]
  • 十分な: [success=done new_authtok_reqd=done default=ignore]
  • オプション: [success=ok new_authtok_reqd=ok default=ignore]

値N 次のいずれかの形式を取ることができます。

  • アボート: 重大なエラー (モジュールは現在要求に失敗しています)
  • acct_expired: ユーザー アカウントの有効期限が切れています
  • auth_err: 認証失敗
  • authinfo_unavail: 基盤となる認証サービスが認証情報を取得できません
  • authtok_err: 認証トークン操作エラー
  • authtok_expired: ユーザーの認証トークンの有効期限が切れています
  • authtok_disable_aging: 認証トークンのエージングが無効
  • authtok_recover_err:認証情報を復元できません
  • cred_err: ユーザー資格情報の設定に失敗しました
  • cred_expired: ユーザー資格証明の有効期限が切れました
  • cred_insufficient: 資格証明が不十分なため、認証データにアクセスできません
  • cred_unavail: 基礎となる認証サービスは、利用できないユーザー資格情報を取得できません
  • デフォルト: 明示的に言及されていないすべての値
  • 無視: 制御フラグが必須、オプション、十分のいずれであるかに関係なく、基礎となるアカウント モジュールを無視します
  • マックストリー: 認証サービスは、到達した再試行回数を維持しています。 これ以上再試行しないでください
  • module_unknown: モジュールが不明です
  • new_authtok_reqd: 新しい認証トークンが必要です。 これは通常、パスワードが NULL であるか期限が切れているため、マシンのセキュリティ ポリシーでパスワードを変更する必要がある場合に返されます。
  • perm_denied: アクセス拒否
  • session_err: 指定されたセッションのエントリを作成または削除できません
  • 成功: 機能復帰成功
  • 再試行:パスワードサービスによる事前チェック
  • ユーザー_不明: 基礎となる認証モジュールに認識されていないユーザー

アクションN 次のいずれかの形式を取ることができます。

  • 無視: モジュールのスタックで使用する場合、モジュールの戻りステータスは、アプリケーションが取得する戻りコードに影響しません。
  • 悪い: このアクションは、戻りコードがモジュールの障害を示すものと見なされるべきであることを示しています。 このモジュールがスタック内で最初に失敗した場合、そのステータス値がスタック全体のステータス値に使用されます。
  • 死ぬ: モジュール スタックを終了し、PAM がすぐにアプリケーションに戻るという副作用がある bad と同等です。
  • わかった: これは、管理者がこの戻りコードがモジュールの完全なスタックの戻りコードに直接寄与する必要があると考えていることを PAM に伝えます。 つまり、スタックの以前の状態が PAM_SUCCESS の戻りにつながる場合、モジュールの戻りコードはこの値をオーバーライドします。 スタックの以前の状態がモジュールの障害を示す何らかの値を保持している場合、この「ok」値はその値をオーバーライドするために使用されないことに注意してください。
  • 終わり: モジュール スタックを終了し、PAM がすぐにアプリケーションに戻るという副作用を伴う、ok と同等です。
  • リセット: モジュール スタックの状態のすべてのメモリをクリアし、次のスタックされたモジュールからやり直します。

続きを読む man pam.conf.

使用できるオプションの一部 auth PAM インターフェイスは次のとおりです。

  • {事前認証|認証失敗|認証成功}:
    • preauth: パスワードなどのユーザー資格情報を要求するモジュールの前にモジュールが呼び出されるときに使用する必要があります。 このモジュールは、最近異常な数の認証試行の連続失敗があった場合に、ユーザーがサービスにアクセスするのをブロックする必要があるかどうかを調べるだけです。 authsucc を使用する場合、この呼び出しはオプションです。
    • authfail: 認証結果を決定するモジュールが失敗した後にモジュールが呼び出されたときに使用する必要があります。 以前の認証失敗のためにユーザーがすでにブロックされていない限り、モジュールは失敗を適切なユーザー集計ファイルに記録します。
    • authsucc: 認証結果を決定するモジュールが成功した後にモジュールが呼び出されるときに使用する必要があります。 以前の認証失敗のためにユーザーがすでにブロックされていない限り、モジュールはそれぞれのユーザー集計ファイル内の失敗の記録をクリアします。 そうしないと、認証エラーが返されます。 この呼び出しが行われない場合、pam_faillock は連続して失敗した認証試行と連続していない認証試行を区別しません。
  • dir=/path/to/tally-directory: 障​​害レコードを含むユーザー ファイルが保持されるディレクトリ。 デフォルトは /var/run/faillock です。
  • audit: ユーザーが見つからない場合、ユーザー名をシステム ログに記録します。
  • silent: 情報メッセージを出力しません。 このオプションは、主に authfail および authsucc 関数に関連付けられています。
  • no_log_info: syslog(3) を介して情報メッセージをログに記録しません。
  • deny=n: 最近の間隔でこのユーザーの連続認証失敗回数が n 回を超えた場合、アクセスを拒否します。 デフォルトは 3 です。
  • fail_interval=n: ユーザー アカウントのロックアウトのために連続して認証に失敗する必要がある間隔の長さは n 秒です。 デフォルトは 900 (15 分) です。
  • unlock_time=n: ロックアウト後、n 秒後にアクセスが再度有効になります。 デフォルトは 600 (10 分) です。
  • even_deny_root: root アカウントは通常のアカウントと同様にロックされる可能性があります。
  • root_unlock_time=n注: このオプションは、even_deny_root オプションを意味します。 アカウントがロックされた後、n 秒後に root アカウントへのアクセスを許可します。 オプションが指定されていない場合、値は unlock_time オプションと同じです。

複数回のログイン試行の失敗後に Linux ユーザー アカウントをロックする

ログインに一定回数失敗した後にアカウントをロックできるようにするため。

  • Debian ベースのシステム (特に Ubuntu 22.04 と Debian 11 で試しました)

開く /etc/pam.d/common-auth お好みのエディターを使用して編集するためのファイル。

その前に、構成をバックアップします。

cp /etc/pam.d/common-auth{,.original}

デフォルトでは、コメント行が削除されたこのファイルは次のようになります。

grep -Ev "^$|^#" /etc/pam.d/common-auth
auth	[success=1 default=ignore]	pam_unix.so nullok
auth	requisite			pam_deny.so
auth	required			pam_permit.so
auth	optional			pam_cap.so

編集用に開きます。

vim /etc/pam.d/common-auth

これらの行を追加します。

auth    required pam_faillock.so preauth audit silent deny=3 fail_interval=60 unlock_time=120

行の前;

auth    [success=1 default=ignore]      pam_unix.so nullok

次に、次の行を追加します。

auth    [default=die] pam_faillock.so authfail audit deny=3 fail_interval=60 unlock_time=120
auth    sufficient pam_faillock.so authsucc audit deny=3 fail_interval=60 unlock_time=120

行の前;

auth    requisite                       pam_deny.so
  • これにより、ユーザー アカウントは、1 分間に 3 回連続してログインに失敗するとロックされます。
  • アカウントは 2 分間一時的にロックされ、その後ユーザーは再度認証を試みることができます。 タイミングはご希望に合わせて調整できます。

上記の行は、次のように追加する必要があります まさに 以下のように;

auth    required pam_faillock.so preauth audit silent deny=3 fail_interval=60 unlock_time=120
auth	[success=1 default=ignore]	pam_unix.so nullok
auth    [default=die] pam_faillock.so authfail audit deny=3 fail_interval=60 unlock_time=120
auth    sufficient pam_faillock.so authsucc audit deny=3 fail_interval=60 unlock_time=120
auth	requisite			pam_deny.so
auth	required			pam_permit.so
auth	optional			pam_cap.so 

変更が完了したら、ファイルを保存して終了します。

次に、次の行を追加します。 account required pam_faillock.so、最後まで /etc/pam.d/common-account 構成ファイル。

cp /etc/pam.d/common-account{,.original}
echo "account    required pam_faillock.so" >> /etc/pam.d/common-account
  • CentOS および同様の派生物 (特に Rocky Linux でこれを試しました)

構成ファイルのバックアップを作成します。

cp /etc/pam.d/system-auth{,.original}
cp /etc/pam.d/password-auth{,.original}

2 つのファイルの構成はほぼ同じです。

したがって、各ファイルを開いて編集します。

vim /etc/pam.d/system-auth
vim /etc/pam.d/password-auth

auth セクションの下に、次の行を追加します。

auth    required pam_faillock.so preauth audit silent deny=3 fail_interval=60 unlock_time=120
auth    [default=die] pam_faillock.so authfail audit deny=3 fail_interval=60 unlock_time=120

アカウント セクションの下に、次の行を追加します。

account     required      pam_faillock.so

以下に示すように;

/etc/pam.d/password-auth:

auth        required                                     pam_env.so
auth        required                                     pam_faildelay.so delay=2000000
auth        required                                     pam_faillock.so preauth audit silent deny=3 fail_interval=60 unlock_time=120
auth        [default=1 ignore=ignore success=ok]         pam_usertype.so isregular
auth        [default=1 ignore=ignore success=ok]         pam_localuser.so
auth        sufficient                                   pam_unix.so nullok try_first_pass
auth        [default=die]                                pam_faillock.so authfail audit deny=3 fail_interval=60 unlock_time=120
auth        [default=1 ignore=ignore success=ok]         pam_usertype.so isregular
auth        sufficient                                   pam_sss.so forward_pass
auth        required                                     pam_deny.so
account     required                                     pam_unix.so
account     sufficient                                   pam_localuser.so
account     sufficient                                   pam_usertype.so issystem
account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     required                                     pam_permit.so
account     required                                     pam_faillock.so

/etc/pam.d/system-auth:

auth        required                                     pam_env.so
auth        required                                     pam_faildelay.so delay=2000000
auth        required                                     pam_faillock.so preauth audit silent deny=3 fail_interval=60 unlock_time=120
auth        sufficient                                   pam_fprintd.so
auth        [default=1 ignore=ignore success=ok]         pam_usertype.so isregular
auth        [default=1 ignore=ignore success=ok]         pam_localuser.so
auth        sufficient                                   pam_unix.so nullok try_first_pass
auth        [default=die]                                pam_faillock.so authfail audit deny=3 fail_interval=60 unlock_time=120
auth        [default=1 ignore=ignore success=ok]         pam_usertype.so isregular
auth        sufficient                                   pam_sss.so forward_pass
auth        required                                     pam_deny.so
account     required                                     pam_unix.so
account     sufficient                                   pam_localuser.so
account     sufficient                                   pam_usertype.so issystem
account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     required                                     pam_permit.so
account     required                                     pam_faillock.so

変更を保存してファイルを終了します。

複数回のログイン試行失敗後のユーザー アカウント ロックのテスト

以上で設定は完了です。

失敗したユーザー アカウントのログインをテストできるようになりました。

まず、別のユーザーとしてログインしている間に、認証ログを追跡します。

tail -f /var/log/auth.log
tail -f /var/log/secure

1 分間に 3 回、失敗したログインの試行を実行します。 システムのコンソール ログの例。

Ubuntu;

Aug  6 08:21:48 jellyfish login[51642]: pam_unix(login:auth): authentication failure; logname=LOGIN uid=0 euid=0 tty=/dev/tty1 ruser= rhost=  user=kifarunix
Aug  6 08:21:52 jellyfish login[51642]: FAILED LOGIN (1) on '/dev/tty1' FOR 'kifarunix', Permission denied
Aug  6 08:21:59 jellyfish login[51642]: FAILED LOGIN (2) on '/dev/tty1' FOR 'kifarunix', Permission denied
Aug  6 08:22:03 jellyfish login[51642]: pam_faillock(login:auth): Consecutive login failures for user kifarunix account temporarily locked
Aug  6 08:22:06 jellyfish login[51642]: FAILED LOGIN (3) on '/dev/tty1' FOR 'kifarunix', Permission denied
Aug  6 08:22:11 jellyfish login[51642]: FAILED LOGIN (4) on '/dev/tty1' FOR 'kifarunix', Authentication failure

ロッキー;

Aug  6 12:16:07 localhost unix_chkpwd[1333]: password check failed for user (kifarunix)
Aug  6 12:16:07 localhost login[1325]: pam_unix(login:auth): authentication failure; logname= uid=0 euid=0 tty=/dev/tty1 ruser= rhost=  user=kifarunix
Aug  6 12:16:10 localhost login[1325]: FAILED LOGIN SESSION FROM tty1 FOR kifarunix, Permission denied
Aug  6 12:16:21 localhost unix_chkpwd[1339]: password check failed for user (kifarunix)
Aug  6 12:16:21 localhost login[1336]: pam_unix(login:auth): authentication failure; logname= uid=0 euid=0 tty=/dev/tty1 ruser= rhost=  user=kifarunix
Aug  6 12:16:23 localhost login[1336]: FAILED LOGIN SESSION FROM tty1 FOR kifarunix, Permission denied
Aug  6 12:16:35 localhost unix_chkpwd[1342]: password check failed for user (kifarunix)
Aug  6 12:16:35 localhost login[1340]: pam_unix(login:auth): authentication failure; logname= uid=0 euid=0 tty=/dev/tty1 ruser= rhost=  user=kifarunix
Aug  6 12:16:35 localhost login[1340]: pam_faillock(login:auth): Consecutive login failures for user kifarunix account temporarily locked
Aug  6 12:16:37 localhost login[1340]: FAILED LOGIN SESSION FROM tty1 FOR kifarunix, Permission denied
Aug  6 12:16:47 localhost unix_chkpwd[1352]: password check failed for user (kifarunix)
...

ご覧のとおり、3 回目の試行で、ユーザー アカウントが一時的にロックされます。

以下のコマンドを使用して確認することもできます。

faillock --user kifarunix

Ubuntu 出力;

kifarunix:
When                Type  Source                                           Valid
2022-08-06 08:21:48 RHOST                                                      V
2022-08-06 08:21:55 RHOST                                                      V
2022-08-06 08:22:03 RHOST                                                      V

ロッキー出力;

kifarunix:
When                Type  Source                                           Valid
2022-08-06 12:16:07 TTY   /dev/tty1                                            V
2022-08-06 12:16:21 TTY   /dev/tty1                                            V
2022-08-06 12:16:35 TTY   /dev/tty1                                            V

実行するだけですべてのユーザーを表示できます。

faillock

SSH 認証ログのサンプル Ubuntu;

Aug  6 08:43:05 jellyfish sshd[51672]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.56.1  user=kifarunix
Aug  6 08:43:08 jellyfish sshd[51672]: Failed password for kifarunix from 192.168.56.1 port 39310 ssh2
Aug  6 08:43:12 jellyfish sshd[51672]: Failed password for kifarunix from 192.168.56.1 port 39310 ssh2
Aug  6 08:43:14 jellyfish sshd[51672]: pam_faillock(sshd:auth): Consecutive login failures for user kifarunix account temporarily locked
Aug  6 08:43:16 jellyfish sshd[51672]: Failed password for kifarunix from 192.168.56.1 port 39310 ssh2
Aug  6 08:43:16 jellyfish sshd[51672]: Connection closed by authenticating user kifarunix 192.168.56.1 port 39310 [preauth]
Aug  6 08:43:16 jellyfish sshd[51672]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.56.1  user=kifarunix
Aug  6 08:43:36 jellyfish sshd[51674]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.56.1  user=kifarunix
Aug  6 08:43:38 jellyfish sshd[51674]: Failed password for kifarunix from 192.168.56.1 port 39314 ssh2

faillock --user kifarunix
kifarunix:
When                Type  Source                                           Valid
2022-08-06 08:43:05 RHOST 192.168.56.1                                         V
2022-08-06 08:43:10 RHOST 192.168.56.1                                         V
2022-08-06 08:43:14 RHOST 192.168.56.1                                         V

サンプル SSH 認証ログ Rocky;

Aug  6 12:21:13 localhost unix_chkpwd[1361]: password check failed for user (kifarunix)
Aug  6 12:21:13 localhost sshd[1359]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.56.1  user=kifarunix
Aug  6 12:21:15 localhost sshd[1359]: Failed password for kifarunix from 192.168.56.1 port 37388 ssh2
Aug  6 12:21:20 localhost unix_chkpwd[1362]: password check failed for user (kifarunix)
Aug  6 12:21:22 localhost sshd[1359]: Failed password for kifarunix from 192.168.56.1 port 37388 ssh2
Aug  6 12:21:26 localhost unix_chkpwd[1363]: password check failed for user (kifarunix)
Aug  6 12:21:26 localhost sshd[1359]: pam_faillock(sshd:auth): Consecutive login failures for user kifarunix account temporarily locked
Aug  6 12:21:28 localhost sshd[1359]: Failed password for kifarunix from 192.168.56.1 port 37388 ssh2
Aug  6 12:21:28 localhost sshd[1359]: Connection closed by authenticating user kifarunix 192.168.56.1 port 37388 [preauth]
Aug  6 12:21:28 localhost sshd[1359]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.56.1  user=kifarunix
faillock --user kifarunix
kifarunix:
When                Type  Source                                           Valid
2022-08-06 12:21:13 RHOST 192.168.56.1                                         V
2022-08-06 12:21:20 RHOST 192.168.56.1                                         V
2022-08-06 12:21:26 RHOST 192.168.56.1                                         V

それ以降のログイン試行は、正しいパスワードを使用しても、unlock_time オプションで定義された時間 (この例では 2 分) が経過するまで成功しません。

定義されたロック解除時刻の前にユーザー アカウントのロック解除を有効にする場合は、次のコマンドを使用します。

faillock --user kifarunix --reset

そして、再度ログインできるはずです。

これが、ログイン試行が複数回失敗した後に Linux ユーザー アカウントをロックする方法です。

その他のチュートリアル

CentOS 7/RHEL 派生物にパスワード複雑性ポリシーを適用する

Ubuntu 18.04 でパスワードの複雑さのポリシーを適用する

The post 複数回のログイン試行の失敗後に Linux ユーザー アカウントをロックする appeared first on Gamingsym Japan.