この投稿では、Linux PAM パスワードの複雑さに関連して、PAM pam_cracklib クレジット システムについて説明します。
PAM の概要
Pluggable Authentication Modules (PAM) は、システム認証ポリシーを管理し、ユーザー認証を促進するために使用される、柔軟なモジュール式フレームワークです。 PAM は、特権付与プログラムがユーザー認証のために使用する一般的なアプリケーション プログラミング インターフェース (API) を提供します。
PAM 認証フローは次のとおりです。
アプリケーション (ログイン、ssh、sudo、su、ftp など) -> PAM -> 認証ソース (ローカルパスワード、LDAP、Kerberos など)
PAM は認証タスクを 4 つの管理グループに分けます:
- アカウント管理 – サービスに対するユーザー権限、ユーザー パスワードの有効期限などを確認します。
- 認証管理 – ユーザー認証、ユーザー資格情報、チャレンジ/レスポンス (パスワード)、生体認証
- パスワード管理 – パスワード管理を容易にする – 変更、更新など
- セッション管理 – ユーザー サービス接続の前後のタスク。監査証跡、マウント ユーザーのホーム ディレクトリなど
PAM pam_cracklib モジュール
PAM パスワード スタックに追加されると、pam_cracklib モジュールは提案されたユーザー パスワードの強度チェックを実行します。モジュールは、次のようなさらなる強度チェックを実行する前に、パスワードを既知の (一般的な、弱い、デフォルトなどの) 単語の辞書と比較する cracklib ルーチンを呼び出します。
- 回文 :新しいパスワードは回文です。レーダー、マダムなど
- 大文字と小文字の変更のみ :新しいパスワードは、大文字と小文字が変わっただけで古いパスワードと同じですか?
- 類似 :新しいパスワードは古いパスワードと似すぎていませんか?
- シンプル :新しいパスワードが小さすぎませんか?これは 6 つの引数によって制御されます:minlen 、maxclassrepeat 、dcredit 、ウクレジット 、クレジット 、およびクレジット .
- 回転 :新しいパスワードは古いパスワードをローテーションしたものですか?
- すでに使用済み :パスワードは以前に使用されたことはありますか?
- 同じ連続文字 :同じ連続文字のオプション チェック。
- ユーザー名を含む :オプションで、パスワードにユーザー名が含まれているかどうかを確認します。
引数なしで有効にすると、デフォルトの pam_cracklib 強度チェック オプション/値により、十分に安全なパスワードが受け入れられるようになります。
pam_cracklib クレジット システム
pam_cracklib モジュールにはさまざまなオプションが用意されており、そのうちの次のものがパスワードの複雑さを直接制御します:
- ミンレン – 最小パスワード長
- クレジット – 小文字の最小数
- ウクレジット – 大文字の最小数
- クレジット – 数字の最小数
- 信用 – 英数字以外の文字の最小数
ミンレン オプションは、新しいパスワードの最小許容サイズを定義します。ただし、文字数に加えて、使用された異なる文字タイプ (下、上、数字、その他) ごとにクレジット (つまり、スコア) が与えられます。使用される各文字タイプのクレジット値は、定義された minlen 値を満たすためにカウントされます。
lcredit=N :(N>=0) これは、新しいパスワードに小文字を使用する場合の最大クレジットです。小文字が N 個以下の場合、各文字は現在の minlen 値を満たすために +1 としてカウントされます。 lcredit のデフォルトは 1 で、これは 10 未満の minlen の推奨値です。
(N <0) これは、新しいパスワードに必要な小文字の最小数です。
ucredit=N :(N>=0) これは、新しいパスワードに大文字を使用するための最大クレジットです。大文字が N 個以下の場合、各文字は現在の minlen 値を満たすために +1 カウントされます。 ucredit のデフォルトは 1 で、これは 10 未満の minlen の推奨値です。
(N <0) これは、新しいパスワードに必要な大文字の最小数です。
dcredit=N (N>=0) これは、新しいパスワードに数字を含めるための最大クレジットです。 N 桁以下の場合、各桁は現在の minlen 値を満たすために +1 としてカウントされます。 dcredit のデフォルトは 1 で、これは 10 未満の minlen の推奨値です。
(N <0) これは、新しいパスワードに必要な最小桁数です。
ocredit=N :(N>=0) これは、新しいパスワードに他の文字を含めるための最大クレジットです。他の文字数が N 個以下の場合、各文字は現在の minlen 値を満たすために +1 としてカウントされます。 ocredit のデフォルトは 1 で、これは 10 未満の minlen の推奨値です。
(N <0) これは、新しいパスワードに必要なその他の文字の最小数です。
PAM クレジット システムを使用する場合、minlen で定義された長さよりも短いパスワードが受け入れられる可能性は十分にあります。つまり、パスワードには、1 つまたは複数の文字タイプ (小文字、大文字、数字、その他) の文字が含まれる場合があります。
次の pam_cracklib 構成を検討してください:
--/etc/pam.d/system-auth-ac: ... password required pam_cracklib.so minlen=12 lcredit=1 ucredit=1 dcredit=2 ocredit=1 ...
以下は、「@1Bcdef2」のユーザー パスワードの pam_cracklib パスワード クレジットの計算です。
- @1Bcdef2:8 クレジット、つまり各キャラクターに 1 クレジット
- @:1 クレジットが授与されます (その他)
- 1,2:1 クレジット (数字)
- B:1 クレジットが授与されます (上限)
- cdef:1 クレジット付与 (下位)
8 + 4 =12 (最小長)
上記のパスワードで使用されている文字の数と種類を考慮すると、システムは最小パスワード長 8 文字を受け入れます。 11 文字の小文字のみを含むパスワードも使用できることに注意してください。例:
- abcdefghijk:11 クレジット - 各キャラクターに 1 クレジット
- abcdefghijk:0 クレジットが授与されました (その他)
- abcdefghijk:0 クレジット (数字) が付与されました
- abcdefghijk:0 クレジットが授与されました (上限)
- abcdefghijk:1 クレジットが授与されます (下位)
11 + 1 =12 (minlen)
以下は、受け入れられるパスワードと受け入れられないパスワードの詳細な例です:
minlen | パスワード | パスワードの長さ (文字) | クレジット | パスワードを受け入れましたか? |
---|---|---|---|---|
10 | qwertasdf | 9 | 9 (文字) + 1 (下位) =10 | はい |
12 | qwertasdfgz | 11 | 11 (文字) + 1 (下位) =12 | はい |
14 | qwertasdfgzxc | 13 | 13 (文字) + 1 (下位) =14 | はい |
14 | qwertasdf1$ | 11 | 11 (文字) + 1 (下位) + 1 (数字) + 1 (その他) =14 | はい |
10 | qwertasd | 8 | 8 (文字) + 1 (下位) =9 | いいえ |
12 | qwertasdfg | 10 | 10 (文字) + 1 (下位) =11 | いいえ |
14 | qwertasdfgzx | 12 | 12 (文字) + 1 (下位) =13 | いいえ |
pam_cracklib クレジット システムでパスワードの複雑さを強制する
これまでのすべての例で、クレジット システムの使用は実際にはパスワードの複雑さを強制するものではないことに注意してください。パスワードの複雑さを強制するには、pam_cracklib オプションの lcredit、ucredit、dcredit、ocredit に負の値を指定します。負の値を指定すると、下位、上位、数字、およびその他の文字の使用に対してクレジットが付与されませんが、パスワードには指定された各文字グループの文字が含まれている必要があります。
次の pam_cracklib 構成を検討してください:
--/etc/pam.d/system-auth-ac: ... password required pam_cracklib.so minlen=8 lcredit=-1 ucredit=-1 dcredit=-2 ocredit=-1 ...
上記では、成功したユーザーパスワードは…
- 長さが 8 文字以上であること
- 少なくとも 1 つの小文字を含み、
- 少なくとも 1 つの大文字を含み、
- 少なくとも 2 桁の数字を含み、
- 少なくとも 1 人の他のキャラクターを含む
注意 :CentOS/RHEL 7 は pam_pwquality を使用します モジュールと pam_pwquality モジュールはそのオプションと下位互換性があります。
PAM_PWQUALITY(8) System Manager's Manual PAM_PWQUALITY(8) NAME pam_pwquality - PAM module to perform password quality checking SYNOPSIS pam_pwquality.so [...] DESCRIPTION This module can be plugged into the password stack of a given service to provide some plug-in strength-checking for passwords. The code was originally based on pam_cracklib module and the module is backward compatible with its options.