見出し画像

Ubuntu Linux20.04 パスワード周りの設定確認

IT統制監査で確認することが多いUbuntu Linux20.04のパスワード周りの設定の確認方法を整理しました。
参照資料→ CIS Benchmarks CIS_Ubuntu_Linux_20.04_LTS_Benchmark_v2.0.1.pdf


パスワードの最小文字数

確認には以下の2つのステップが必要です。
ステップ1でパスワードの文字数を設定するためのモジュール(pam_pwquality.so)が有効に設定されているか確認します。この設定が有効でない場合、ステップ2で最小文字数が設定されていても実際には最小文字数の制限は動作しません。

ステップ1: pam_pwquality.soが有効に設定されているか確認

以下の出力例では/etc/pam.d/common-password上で有効に設定されていることが示されています(一般的には以下の出力例の設定がされていることが多いです)。

# 確認するために入力するコマンド
grep -P '^\h*password\h+[^#\n\r]+\h+pam_pwquality\.so\b' /etc/pam.d/common-password

# 出力結果の例
password requisite pam_pwquality.so retry=3

ステップ2: パスワードの最小文字数の確認

# 確認するために入力するコマンド
$ grep '^\s*minlen\s*' /etc/security/pwquality.conf

# 出力結果の例
minlen = 14

参考: CIS Benchmarks での記載箇所

ファイル: CIS_Ubuntu_Linux_20.04_LTS_Benchmark_v2.0.1.pdf
項番: 4.4.1 Ensure password creation requirements are configured

パスワードの複雑性

以下の確認方法1と2の設定方法があるので両方で確認するのがおすすめです。

パスワードの複雑性の確認方法 1 (minclass で設定の場合)

/etc/security/pwquality.confのminclassの値によって要求される複雑性が変わります。

# 確認するために入力するコマンド
$ grep '^\s*minclass\s*' /etc/security/pwquality.conf

# 出力結果の例(4の場合、数字・英大文字・英小文字・記号の全てを利用する必要があります)
minclass = 4

パスワードの複雑性の確認方法 2 (その他)

以下のように各文字種類ごとに必要な文字数を指定できます。
dcredit=-1 の場合、数字(Digit)が最低1文字必要です。
ucredit=-1 -の場合、大文字(Uppercase)が最低1文字必要です。
lcredit=-1 の場合、小文字(Lowercase)が最低1文字必要です。
ocredit=-1 -の場合、記号(special character)が最低1文字必要です。

# 確認するために入力するコマンド
$ grep -E '^\s*[duol]credit\s*' /etc/security/pwquality.conf

# 出力結果の例
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1

参考: CIS Benchmarks での記載箇所

ファイル: CIS_Ubuntu_Linux_20.04_LTS_Benchmark_v2.0.1.pdf
項番: 4.4.1 Ensure password creation requirements are configured

パスワードの有効期限

以下のように、まずサーバーの共通設定を確認し、その後に個別のユーザーがサーバーの共通設定と異なる有効期限に変更していないか確認します。

パスワードの有効期限の確認方法 1 (サーバーの共通設定)

/etc/login.defsのPASS_MAX_DAYSの値(単位はDAY)で定義されます。

# 確認するために入力するコマンド
$ grep PASS_MAX_DAYS /etc/login.defs

# 出力結果の例
PASS_MAX_DAYS 365

パスワードの有効期限の確認方法 2 (各ユーザーの現在の状態)

以下を実行することでサーバーの各ユーザーアカウントに適用されているパスワードの有効期限を確認できます。たとえば、ユーザー個人で勝手にパスワードの有効期限を短くするケースなどが想定されます。以下のコマンドは365日より大きな値で設定されているアカウントがないか確認しているので、何も表示されなければ問題ありません。

# 確認するために入力するコマンド(管理者権限が必要です)
$ sudo awk -F: '(/^[^:]+:[^!*]/ && ($5>365 || $5~/([0-1]|-1|\s*)/)){print $1 " " $5}' /etc/shadow

# 出力結果の例 (例えばパスワードが無期限で設定されている場合は 99999 が出力されます)
userA 99999

参考: CIS Benchmarks での記載箇所

ファイル: CIS_Ubuntu_Linux_20.04_LTS_Benchmark_v2.0.1.pdf
項番: 4.5.1.2 Ensure password expiration is 365 days or less

パスワードの再利用制限

過去N世代までのパスワードを再利用させない設定の確認です。

パスワードの再利用制限の確認方法

/etc/pam.d/common-passwordのrememberの値(単位は世代)で定義されます。例えば、5の場合は過去5世代のパスワードを記憶してそれらパスワードの再利用を制限します。
なお、以下の点に注意してください。
・pam_pwhistory.soの行にremember=の設定がされているか
・pam_unix.soが含まれる行の前にpam_pwhistory.soの行が配置されているか

# 確認するために入力するコマンド
$ grep -P -- '^\h*password\h+([^#\n\r]+\h+)?(pam_pwhistory\.so|pam_unix\.so|pam_pwquality\.so)\b' /etc/pam.d/common-password

# 出力結果の例
password required pam_pwhistory.so remember=5
password [success=1 default=ignore] pam_unix.so obscure sha512 use_authtok

参考: CIS Benchmarks での記載箇所

ファイル: CIS_Ubuntu_Linux_20.04_LTS_Benchmark_v2.0.1.pdf
項番: 4.4.3 Ensure password reuse is limited

参考: その他

過去のパスワードを保存する/etc/security/opasswdファイルの存在確認、ファイルのパーミッション(ファイルへのアクセス制限)の確認については以下の項番に記載されています。
項番: 6.1.10 Ensure permissions on /etc/opasswd are configured

アカウントのロック

パスワードを何回間違えるとアカウントをロックする、何経つとロックを解除する設定の確認です。以下のステップ1・2を順番に確認します。

ステップ1: 必要なモジュールが有効に設定されているか確認

以下の出力例では/etc/pam.d/common-account上で必要な2つのモジュールのpam_deny.soとpam_tally2.soが有効に設定されていることが示されています(一般的には以下の出力例の設定がされていることが多いです)。

# 確認するために入力するコマンド
$ grep -E 'pam_(tally2|deny)\.so' /etc/pam.d/common-account

# 出力結果の例(pam_deny.so と pam_tally2.so が /etc/pam.d/common-account ファイルに設定されていることを確認します)
account requisite pam_deny.so
account required pam_tally2.so

ステップ2: ロックアウト設定の確認

deny=の後の値(単位は回数) と unlock_time=の後の値(単位は秒)で定義されます。

# 確認するために入力するコマンド
$ grep 'pam_tally2' /etc/pam.d/common-auth

# 出力結果の例
auth required pam_tally2.so onerr=fail audit silent deny=5 unlock_time=900

参考: CIS Benchmarks での記載箇所

ファイル: CIS_Ubuntu_Linux_20.04_LTS_Benchmark_v2.0.1.pdf
項番: 4.4.2 Ensure lockout for failed password attempts is configured


いいなと思ったら応援しよう!