Debian Linux 12 パスワード周りの設定確認
IT統制監査で確認することが多いDebian 12のパスワード周りの設定の確認方法を整理しました。
参照資料→ CIS Benchmarks CIS_Debian_Linux_12_Benchmark_v1.0.1.pdf
パスワードの最小文字数
複数の設定方法
Debian Linux 12では、パスワードの最小文字数を設定する方法が複数あります。
方法1:/etc/pam.d/common-password、/etc/pam.d/system-authに設定する。
方法2: /etc/security/pwquality.confに設定する。
方法3: /etc/security/pwquality.conf.d/ ディレクトリ内の .conf ファイルに設定する。(例 /etc/security/pwquality.conf.d/50-pwlength.conf)
設定の適用には優先順位があり、方法1の設定が方法2よりも、方法2の設定が方法3よりも優先されます。つまり、方法1が一番強いです。ただし、CIS Benchmarksでは、設定を1つのファイルにまとめることと、わかりやすさや利便性を考慮して方法3を推奨しています。
ステップ1: パスワードの最小文字数の確認(方法1の部分)
方法1の設定は推奨されていないため、以下の実行時に何も表示されないことを確認します。
# 確認するために入力するコマンド
$ grep -Psi -- '^\h*password\h+(requisite|required|sufficient)\h+pam_pwquality\.so\h+([^#\n\r]+\h+)?minlen\h*=\h*([0-9]|1[0-3])\b' /etc/pam.d/system-auth /etc/pam.d/common-password
# 出力結果の例(何も表示されいないことが推奨されています)
ステップ2: パスワードの最小文字数の確認(方法2と3の部分)
以下の出力結果は方法3で設定されていることを示しています。
# 確認するために入力するコマンド
$ grep -Psi -- '^\h*minlen\h*=\h*(1[4-9]|[2-9][0-9]|[1-9][0-9]{2,})\b' /etc/security/pwquality.conf /etc/security/pwquality.conf.d/*.conf
# 出力結果の例 (以下では 50-pwlength.confというファイルでminlen = 14という設定がされています)
/etc/security/pwquality.conf.d/50-pwlength.conf:minlen = 14
参考: CIS Benchmarks での記載箇所
ファイル: CIS_Debian_Linux_12_Benchmark_v1.0.1.pdf
項番: 5.3.3.2.2 Ensure minimum password length is configured
パスワードの複雑性
複数の設定方法
パスワードの複雑性も最小文字数と同様に設定する方法が複数あります。
方法1:/etc/pam.d/common-passwordに設定する。
方法2: /etc/security/pwquality.confに設定する。
方法3: /etc/security/pwquality.conf.d/ ディレクトリ内の .conf ファイルに設定する。(例 /etc/security/pwquality.conf.d/50-pwcomplexity.conf)
設定の適用には優先順位があり、方法1の設定が方法2よりも、方法2の設定が方法3よりも優先されます。つまり、方法1が一番強いです。ただし、CIS Benchmarksでは、設定を1つのファイルにまとめることと、わかりやすさや利便性を考慮して方法3を推奨しています。
ステップ1: パスワードの複雑性の確認(方法1の部分)
方法1の設定は推奨されていないため、以下の実行時に何も表示されないことを確認します。
# 確認するために入力するコマンド
$ grep -Psi -- '^\h*password\h+(requisite|required|sufficient)\h+pam_pwquality\.so\h+([^#\n\r]+\h+)?(minclass=\d*|[dulo]credit=-?\d*)\b' /etc/pam.d/common-password
# 出力結果の例(何も表示されいないことが推奨されています)
ステップ2: パスワードの複雑性の確認(方法2と3の部分)
以下の出力結果の例は方法3で設定されていることを示しています。
なお、出力結果の例ではminclassと*creditが同時に設定されているため以下の複雑性が求められています。
minclass = 3なので数字・英大文字・英小文字・記号のうち3種類が必要です。
ucredit=-2 なので大文字(Uppercase)が最低2文字必要です。
lcredit=-2 なので小文字(lowercase)が最低2文字必要です。
dcredit=-1 なので数字(Digit)が最低1文字必要です。
ocredit=0 なので記号(special character)を含めることは求められません。
# 確認するために入力するコマンド
$ grep -Psi -- '^\h*(minclass|[dulo]credit)\b' /etc/security/pwquality.conf /etc/security/pwquality.conf.d/*.conf
# 出力結果の例(以下では 50-pwcomplexity.confというファイルで各設定がされています)
/etc/security/pwquality.conf.d/50-pwcomplexity.conf:minclass = 3
/etc/security/pwquality.conf.d/50-pwcomplexity.conf:ucredit = -2
/etc/security/pwquality.conf.d/50-pwcomplexity.conf:lcredit = -2
/etc/security/pwquality.conf.d/50-pwcomplexity.conf:dcredit = -1
/etc/security/pwquality.conf.d/50-pwcomplexity.conf:ocredit = 0
参考: CIS Benchmarks での記載箇所
ファイル: CIS_Debian_Linux_12_Benchmark_v1.0.1.pdf
項番: 5.3.3.2.3 Ensure password complexity is configured
パスワードの有効期限
以下のように、まずサーバーの共通設定を確認し、その後に個別のユーザーがサーバーの共通設定と異なる有効期限に変更していないか確認します。
ステップ1: サーバーの共通設定
# 確認するために入力するコマンド
$ grep -Pi -- '^\h*PASS_MAX_DAYS\h+\d+\b' /etc/login.defs
# 出力結果の例
PASS_MAX_DAYS 365
ステップ2: 各ユーザーの現在の状態
以下を実行することでサーバーの各ユーザーアカウントに適用されているパスワードの有効期限を確認できます。たとえば、ユーザー個人で勝手にパスワードの有効期限を短くするケースなどが想定されます。以下のコマンドは365日より大きな値で設定されているアカウントがないか確認しているので、何も表示されなければ問題ありません。
# 確認するために入力するコマンド(管理者権限が必要です)
$ sudo awk -F: '($2~/^\$.+\$/) {if($5 > 365 || $5 < 1)print "User: " $1 " PASS_MAX_DAYS: " $5}' /etc/shadow
# 出力結果の例 (もしパスワードが無期限で設定されている場合は 99999 が出力されます)
userA 99999
参考: CIS Benchmarks での記載箇所
ファイル: CIS_Debian_Linux_12_Benchmark_v1.0.1.pdf
項番: 5.4.1.1 Ensure password expiration is configured
パスワードの再利用制限
過去N世代までのパスワードを再利用させない設定の確認です。
パスワードの再利用制限の確認方法
/etc/pam.d/common-passwordのrememberの値(単位は世代)で定義されます。例えば、24の場合は過去24世代のパスワードを記憶してそれらパスワードの再利用を制限します。
※Debian11や12では24世代以上と書かれていますが、他のOSでは5世代になっています。
# 確認するために入力するコマンド
$ grep -Psi -- '^\h*password\h+[^#\n\r]+\h+pam_pwhistory\.so\h+([^#\n\r]+\h+)?remember=\d+\b' /etc/pam.d/common-password
# 出力結果の例
password requisite pam_pwhistory.so remember=24 enforce_for_root try_first_pass use_authtok
参考: CIS Benchmarks での記載箇所
ファイル: CIS_Debian_Linux_12_Benchmark_v1.0.1.pdf
項番: 5.3.3.3.1 Ensure password history remember is configured
参考: その他
過去のパスワードを保存する/etc/security/opasswdファイルの存在確認、ファイルのパーミッション(ファイルへのアクセス制限)の確認については以下の項番に記載されています。
項番: 7.1.10 Ensure permissions on /etc/security/opasswd are configured
アカウントのロック
パスワードを何回間違えるとアカウントをロックする、何秒経つとロックを解除する設定の確認です。以下のステップ1〜4を順番に確認します。
ステップ1: ロックアウト設定の確認
# 確認するために入力するコマンド
$ grep -Pi -- '^\h*deny\h*=\h*[1-5]\b' /etc/security/faillock.conf
# 出力結果の例
deny = 5
ステップ2: 別の設定ファイル/etc/pam.d/common-authでロックアウトの設定が行われていないか確認
# 確認するために入力するコマンド
$ grep -Pi -- '^\h*auth\h+(requisite|required|sufficient)\h+pam_faillock\.so\h+([^#\n\r]+\h+)?deny\h*=\h*(0|[6-9]|[1-9][0-9]+)\b' /etc/pam.d/common-auth
# 出力結果の例(何も表示されないべきですが、何か表示された場合はステップ1と同じ設定であるか確認します)
参考: CIS Benchmarks での記載箇所
ファイル: CIS_Debian_Linux_12_Benchmark_v1.0.1.pdf
項番: 5.3.3.1.1 Ensure password failed attempts lockout is configured
ステップ3: ロック解除設定の確認
# 確認するために入力するコマンド
$ grep -Pi -- '^\h*unlock_time\h*=\h*(0|9[0-9][0-9]|[1-9][0-9]{3,})\b' /etc/security/faillock.conf
# 出力結果の例
unlock_time = 900
ステップ4: 別の設定ファイル/etc/pam.d/common-
authでロック解除の設定が行われていないか確認
# 確認するために入力するコマンド
$ grep -Pi -- '^\h*auth\h+(requisite|required|sufficient)\h+pam_faillock\.so\h+([^#\n\r]+\h+)?unlock_time\h*=\h*([1-9]|[1-9][0-9]|[1-8][0-9][0-9])\b' /etc/pam.d/common-auth
# 出力結果の例(何も表示されないべきですが、何か表示された場合はステップ3と同じ設定であるか確認します)