[CentOS 7] パスワードポリシーを設定する方法
こんにちは、じんないです。
今回は CentOS 7 のパスワードポリシーについて調べてみました。パスワードポリシーには login.defs で設定するものと PAM (Pluggable Authentication Modules) で設定するものがありますが、今回は PAM について触れます。PAM ではパスワードの文字数やパスワードに含める文字の種類などいわゆる複雑さ(要件)について設定する箇所となります。 パスワードは最低12文字以上で、数字・英大文字・英小文字・記号をすべて含めるようにしたい というような場合は PAM を設定します。 そしてこの PAM の設定ですが結構複雑で・・・ 私自身もかなりトライ&エラーを繰り返しました。その様子をご覧ください。
想定環境
- CentOS 7.7
PAM の設定はどこから変更するのか
先ほどから PAM PAM と言っていますが、設定するファイルは /etc/pam.d/system-auth
です。
いくらか行がありますが、パスワードに関連する項目はこちらです。
なかでも password requisite
の行がパスワード変更に必要な条件を書いている部分です。
[root@jinna--i ~]# cat /etc/pam.d/system-auth
:略
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password sufficient pam_sss.so use_authtok
password required pam_deny.so
:略
pam_pwquality.so
がパスワードの複雑さを検証するためのモジュールとなっていてそれを読み込んでいます。
パスワードの複雑さを設定する場合はこの pam_pwquality.so
の設定を変更する必要があります。
デフォルトのパスワードポリシーを見てみる
pam_pwquality.so
の設定は /etc/security/pwquality.conf
に書いてあり、そこにデフォルト値も設定されています。
自分なりに整理した表がこれです。minlen
でパスワードに必要な最低文字数を指定します。ただこの minlen
がなかなかの曲者でして、デフォルト値は9なのですが、実際にはそれ以下の文字数で変更できてしまいます。これが今日のメインテーマです。その理由は後ほど。
項目 | デフォルト | 意味 |
---|---|---|
difok | 5 | 変更前のパスワードに含まれる文字が変更後のパスワードに N 文字以上含まれてはならない。 |
minlen | 9 | パスワードの最低文字数。6文字未満には設定できない |
dcredit | 1 | パスワード内に必要とする数字の数 |
ucredit | 1 | パスワード内に必要とする英大文字の数 |
lcredit | 1 | パスワード内に必要とする英小文字の数 |
ocredit | 1 | パスワード内に必要とする記号の数 |
minclass | 0 | パスワードの最低文字種類数(数字、大文字、小文字、記号)。0は無効 |
maxrepeat | 0 | パスワードで許可される連続する同じ文字の最大数。0は無効 |
maxclassrepeat | 0 | パスワードで許可される連続する同じ文字種の最大数。0は無効 |
gecoscheck | 0 | 新しいパスワードを入力しているユーザーの /etc/passwd エントリ内の GECOS フィールドにある単語 (空白で区切られた文字列) が、 その入力しているパスワードに含まれているかどうか。0は無効 |
dictpath | なし | cracklib 辞書へのパス |
さて、この表をみてデフォルトのパスワードポリシーではどのような場合に要件を満たすことができるでしょうか。
※ difok
の設定は割愛します。
前提としてパスワードの文字種は 数字・英大文字・英小文字・記号 の4種とします。
結論を先に書いておくと以下のような場合にパスワード変更が可能となります。
- すべて数字、すべて英小文字など1種類の場合 → 8文字以上
- 英小文字と数字、英大文字と記号など2種類の場合 → 7文字以上
- 英小文字と数字と記号など3種類の場合 → 6文字以上
※6文字未満とすることはできない
実際に passwd
コマンドでトライ&エラーした結果も貼り付けておきます。
通らないパターンが少ないやないかと言われそうですが、ちゃんとやってます。←
No. | 結果 | パスワード文字列 | 総文字数 | 数字 | 小文字 | 大文字 | 記号 |
---|---|---|---|---|---|---|---|
1 | ○ 通る | fjoefjdpm | 9 | 0 | 9 | 0 | 0 |
2 | ○ 通る | poueiour | 8 | 0 | 8 | 0 | 0 |
3 | ○ 通る | asdfhjK | 7 | 0 | 6 | 1 | 0 |
4 | ○ 通る | iE8bra | 6 | 1 | 4 | 1 | 0 |
5 | ○ 通る | 18375068 | 8 | 8 | 0 | 0 | 0 |
6 | ○ 通る | KJENGRPM | 8 | 0 | 0 | 8 | 0 |
7 | ○ 通る | !*@)}#&( | 8 | 0 | 0 | 0 | 8 |
8 | × 通らない | OHYVSTA | 7 | 0 | 0 | 7 | 0 |
パスワードに含まれる文字種が多ければ多いほど、最低文字数が小さくなるという結果となりました。
minlen = 9
じゃないの?って感じですが、なぜこうなるのか次項でひも解いていきます。
最低文字数 (minlen) の深みにハマる
まず最初に、minlen = 9
であるということは変わりありません。
ただし、dcredit
・ucredit
・lcredit
・ocredit
の各クレジットが”プラス値”である場合、minlen
の値が変化してしまいます。厳密には minlen
から各クレジットの値を引き算した値が真の最低文字数となります。
また、プラス値を設定した場合、含められる最大の文字数指定となります。
例えば、minlen = 9
で dcredit = 1
の場合、最低文字数は 9-1=8
となり、1文字数字が含まれていれば8文字以上で要件を満たします。
同じように dcredit = 2
の場合は、2文字数字が含まれていれば7文字以上で要件を満たします。
dcredit = 3
の場合は、3文字数字が含まれていれば6文字以上で要件を満たします。
設定されていても含まれていない場合はカウントされないので注意です。
なので先に述べた 「すべて数字、すべて英小文字など1種類の場合 → 8文字以上」というのが成り立ちます。
すべて英小文字の場合は minlen(9) - lcredit(1) = 8 文字以上で満たし、 英小文字と数字の場合は minlen(9) - lcredit(1) - dcredit (1) = 7 文字以上で満たし、 英小文字と数字と記号の場合は minlen(9) - lcredit(1) - dcredit (1) - ocredit(1) = 6 文字以上で要件を満たします。
マイナス値の場合はどうなるのか
では各クレジットがマイナス値の場合はどうなるのか。
文章で書くとややこしいのですがマイナス値で指定した場合、指定した文字種が指定した値の数含まれていなければならないとなります。
例で書くと、minlen = 9
で dcredit = -1
の場合、数字が1文字以上含まれていて、9文字以上で要件を満たします。
ただし lcredit
などが 1
のままであれば、すべて英小文字の場合8文字以上で要件を満たすということは覚えておいてください。
※プラス値の場合は引き算が残る
パスワードポリシーの設定方法(例)
前項である程度言いたいことは済んだのですが、ここで実際にパスワードポリシーを設定する例を挙げておきます。
最低文字数のみ指定
文字種はなんでもいいけど最低文字数は12文字に固定したいというケースです。
minlen = 12
dcredit = 0
ucredit = 0
lcredit = 0
ocredit = 0
これでとりあえず12文字以上という設定になります。 ただし、いくら12文字以上でも辞書に載ってそうな簡単なやつははじかれるのでその辺りは注意してください。
最低文字数と必須文字種を指定
最低文字数は12文字だけど、数字と記号は1文字以上必須にしたいケースです。
minlen = 12
dcredit = -1
ucredit = 0
lcredit = 0
ocredit = -1
-2
などを指定すれば2文字以上必須という設定になります。
何文字以上含めるとかは指定せず、とりあえず全部という場合は minclass = 4
を指定するとよいです。
ローカルユーザー以外にもポリシーを適用したい場合
/etc/pam.d/system-auth
がデフォルトの場合は、local_users_only
が有効になっています。
これが有効な場合、/etc/passwd
に含まれるユーザーしか対象になりません。
他の PAM 設定で system-auth
を利用している場合はこの記述を削除しておきましょう。
ではまた。
参考
pam_cracklib(8) - Linux man page
10.2. PAM 設定ファイルについて Red Hat Enterprise Linux 7 | Red Hat Customer Portal
[RHEL]/etc/pam.d/system-authにおけるpam_pwquality.soのオプション - Qiita