はじめに
LinuxでPWの複雑性について設定してみたいと思います。
企業によっては以下のようなPWに関するセキュリティ要件があるのではないでしょうか。
- PWの長さは8文字以上
- 大文字1文字以上含む
- 小文字1文字以上含む
- 数字1文字以上含む
- その他の記号1文字以上含む
今回は、このような企業のポリシーに沿ったPW設定をlinuxシステムのユーザに強制する設定を行ってみたいと思います。
※ ちなみに、今回検証に利用するAMIはRHEL7.9ですが、利用するpam_pwqualityのオプションはRHEL9でも動作することを検証していますので、RHEL9について知りたい方にも参考になるのではないかと思います。
設定変更の方法
pamについて
パスワードの複雑性については、pamのpam_pwqualityモジュールを利用することで設定することが可能です。
pamについてはLinuCの解説が分かりやすかったので以下に引用させていただきます。
https://linuc.org/study/knowledge/417/
今回は、「PAM」について。
PAMとは「Pluggable Authenticaton Modules」の頭文字を取ったものです。 「Authentication」すなわちユーザ認証に用いられているシステムです。UNIX系のシステムで広く利用されています。
PAMの大きな特徴は、「Linux自体の認証だけでなく、アプリケーションの認証でも利用できる」という点にあります。たとえば、telnetやssh、sambaなどのアプリケーションにおいても、PAMを利用した認証ができるということになります。これによって、認証処理をアプリケーションから独立させることができ、認証方式を統一することができます(もちろんアプリケーションごとに異なる挙動をさせることも可能)。標準の状態では、PAMは/etc/passwd(また、これを暗号化した/etc/shadow など)の情報を元に認証を行います。
PAMをうまく操ると、たとえば「suコマンドで、特定のグループ(多くの場合wheel)にのみroot権限を得ることができる」といったことも、比較的簡単に行えます。PAMは複数のモジュールから成り立っており、さまざまな認証を実現することができます。PAMの設定ファイルは/etc/pam.d/ディレクトリにあり、ここにあるファイルを編集することで、認証の設定を行うことができます(ただし、編集を誤るとシステムにログインすることができなくなるので、編集するときには1つのコンソールでrootでログインしたままの状態で作業することをお勧めします)。
セキュリティ保持の観点からも、PAMを理解することは重要ですので、ぜひ理解しておいてください。
今回はこのpam.dの配下にある設定ファイルの一つ
を編集して、/etc/pam.d/system-auth
PWの複雑性を設定していきたいと思います。
準備
テストグループとユーザの追加
動作確認用のグループとユーザーを追加するところから。
グループの追加
※ 500はgid, developは追加するグループ名
groupadd -g 500 develop
確認
[root@ip-10-0-3-210 ~]# cat /etc/group | tail -2
ssm-user:x:1001:
develop:x:500:
ユーザの追加
※ -uはuid, -g初期group, -cはコメント, -dはhomeディレクトリ, -sはログインシェル, 最後のdevelopはuser名前
useradd -u 500 -g develop -c develop -d /home/develop -s /bin/bash develop
確認
[root@ip-10-0-3-210 ~]# cat /etc/passwd | tail -2
ssm-user:x:1001:1001::/home/ssm-user:/bin/bash
develop:x:500:500:develop:/home/develop:/bin/bash
確認
[root@ip-10-0-3-210 ~]# id -a develop
uid=500(develop) gid=500(develop) groups=500(develop)
設定変更
デフォルトの設定確認
さあ、準備は整いました。
まずは、デフォルトの設定を見てみます。
確認するのはsystem-authファイル内のpwqulityモジュールです。
デフォルトでは特に明示的にPWについてのポリシーは設定されていません。
[root@ip-10-0-3-210 ~]# cat /etc/pam.d/system-auth | grep pam_pwquality.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
要件の確認
では要件に合わせてPWの複雑性を設定していきます。
要件を再掲します。
- 8文字以上
- 大文字1文字以上
- 小文字1文字以上
- 数字1文字以上
- その他の記号1文字以上
要件を満たすために、pam_pwqualityにオプションを加えます。
以下のテーブルにオプションと要件をマップしました。
※ 各オプションの詳細については、以下のmanページを参照してみてください。
https://linux.die.net/man/8/pam_pwquality
オプション | 要件 |
---|---|
minlen=8 | 8文字以上 |
ucredit=-1 | 大文字1文字以上 |
lcredit=-1 | 小文字1文字以上 |
dcredit=-1 | 数字1文字以上 |
ocredit=-1 | その他の記号1文字以上 |
設定変更
設定をviで編集します。
vi /etc/pam.d/system-auth
以下のように設定されていることを確認します。
※ 設定はシステムの再起動やdeamon-reloadのような操作は不要で、編集後すぐに有効になります。
[root@ip-10-0-3-210 ~]# cat /etc/pam.d/system-auth | grep pam_pwquality.so
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=8 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
検証
まず、developユーザにスイッチします。
※ rootではポリシーを強制できませんのでご注意ください。
[root@ip-10-0-3-210 ~]# su - develop
Last login: Sat Dec 9 07:05:05 UTC 2023 on pts/0
大文字のないPW(e.g.,
)を設定してみます。ancoromochi89!
すると大文字がないぞと怒られて設定できません。
[develop@ip-10-0-3-210 ~]$ passwd
Changing password for user develop.
Changing password for develop.
(current) UNIX password:
New password:
BAD PASSWORD: The password contains less than 1 uppercase letters
New password:
今度はPWを
と設定してみます。Tom0808!
すると、無事設定成功しました。
[develop@ip-10-0-3-210 root]$ passwd
Changing password for user develop.
Changing password for develop.
(current) UNIX password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
ガッチャ!!
おわりに
いかがだったでしょうか。
pamは今回紹介したも以外にも外部の認証プロバイダーとの連携や、豊富なモジュールによる柔軟な設定が可能です。
また、pam以外でも、RHEL7であればauthconfigコマンドを利用して、/etc/security/pwqualityにlinuxシステムのデフォルトのPWの複雑性を設定することも可能です。後者はlinuxのシステムのみに閉じたローカルな設定であると考えていますが、きちんと調べてみないといけないです。今後の課題ですね!
というわけで、またお会いしましょう!
あでゅー!