今回はpam_faillock.soモジュールを使って、ログインに失敗したときにアクセス制限をかける方法をまとめておきます。
The pam_faillock.so module maintains a list of failed authentication attempts per user during a specified interval and locks the account in
case there were more than deny consecutive failed authentications. It stores the failure records into per-user files in the tally directory. The faillock command is an application which can be used to examine and modify the contents of the the tally files. It can display the recent failed authentication attempts of the username or clear the tally files of all or individual usernames.
引用: https://www.unix.com/man-page/centos/8/faillock/
実はクラウドでサービスを構築したときに起動したインスタンスに勝手にこの機能が設定されていて、ユーザーとパスワードが合っているはずなのにログイン出来ずにはまりました 笑
なぜかサーバーにログイン出来ないという方は、faillockというコマンドを打ってみてログインしようとしているユーザーにたくさんのVマークがついたログイン履歴が出てこないか確認してみてください。
今回ログイン対象のサーバーはdockerで構築します。Oracle Linuxのイメージを使いますがCentOS7.9でも大丈夫です。
ちなみにOracle LinuxはRed Hat Enterprise LinuxやCentOSの代替になりますし、無料で使えますよとOracle公式には記載されていました。また、CentoOSのdockerイメージはEOLになってしまっていたのでOracle Linuxを使うことにしました。
Oracle Linux provides a 100% application binary compatible alternative to Red Hat Enterprise Linux and CentOS Linux and is supported across both hybrid and multicloud environments.Since 2006, Oracle Linux has been completely free to download and use. Free source code, binaries, and updates. Freely redistributable. Free for production use.
引用: https://www.oracle.com/linux/[CentOS] image is no longer supported/maintained
引用: https://hub.docker.com/_/centos
それでは実際にfaillockを有効化していこうと思います。
詳しくはOracle Linuxのドキュメント「システム・ユーザーおよび認証の設定」やRHELのドキュメント「既製の authselect プロファイルの変更」で勉強しながら設定しました。
色々な方法があるようですが、上記ドキュメントに書かれているauthselectというツールを使う方法で設定しました。
authselectはユーザ認証に関わるユーティリティツールになります。デフォルトでは入っていなかったのでyum installする必要がありました。
authselect ユーティリティーを使用して、Red Hat Enterprise Linux 8 ホストでユーザー認証を設定できます。
引用: https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/configuring_authentication_and_authorization_in_rhel/configuring-user-authentication-using-authselect_configuring-authentication-and-authorization-in-rhel
faillockの設定準備
ssh接続できるdockerコンテナを作成します。oraclelinux9は最初からsshが使えるようになっていたりとあまり設定することはありませんでした。
docker run --privileged -it -d -p 2222:22 --name oraclelinux9 oraclelinux:9 /sbin/init
docker exec -it oraclelinux9 /bin/bash
# 新規ユーザー作成とパスワード設定
[root@5ac0f5e9ea5f /] useradd -s /bin/bash --uid 2525 -m hinomaruc && echo "hinomaruc:phinomaruc" | chpasswd
# authselectのインストール
[root@5ac0f5e9ea5f /] yum install -y authselect
faillockの設定
/etc/security/faillock.confを編集します。何もしなくてもデフォルトの値を使ってくれるので問題ないかも知れません。
# faillockの設定
[root@5ac0f5e9ea5f /] vi /etc/security/faillock.conf
dir = /var/run/faillock deny = 5 fail_interval = 900 #admin_group = wheel
らへんを設定しておけば良いかと思います。denyはデフォルト値が3でしたが、5にしました。
admin_groupは後でコメントアウトを外すので、wheelを入力しておいてください。admin_groupに所属しているユーザーはfaillockに関してはrootと同じ挙動をするようになるので、rootユーザーにfaillockを設定しなければ除外対象にすることが出来ます。
authselectでfaillockを有効化にする
[root@5ac0f5e9ea5f /] authselect select minimal with-faillock -f
Backup stored at /var/lib/authselect/backups/2023-07-02-00-49-50.RtsXEP Profile "minimal" was selected. The following nsswitch maps are overwritten by the profile: - aliases - automount - ethers - group - hosts - initgroups - netgroup - networks - passwd - protocols - publickey - rpc - services - shadow
今回はminimalプロファイルをwith-failock機能を追加しユーザー認証を適用してみました。Oracle Linuxのデフォルトはsssdプロファイルのようですが、とりあえず試すにはminimalで十分でした。
また、すでにpam.d以下に何かしらの設定ファイルが存在するようなので、-fで強制的に上書きするようにしています。(-fを追加しないとRefusing to activate profile unless this file is removed or overwrite is requested.というようなエラーになります。)
Oracle Linuxのインストール後、システムの認証を管理するために、sssdプロファイルがデフォルトで選択されます。このプロファイルは、PAM認証やKerberosなどのほとんどの認証ケースに対応しています。
minimalプロファイル: システム・ファイルを使用して、ローカル・ユーザーのシステム認証を実行します。
with-faillock 認証に失敗した回数が多すぎると、アカウントをロックします。
引用: https://docs.oracle.com/cd/F22978_01/userauth/userauth-AboutSystemAuthentication.html#feature-support
[root@5ac0f5e9ea5f /] authselect current
Profile ID: minimal Enabled features: - with-faillock
きちんと設定されているようです。
[root@5ac0f5e9ea5f /] authselect apply-changes
Changes were successfully applied.
それでは実際にユーザーロックがかかるか試してみたいと思います。
sshで間違ったパスワードでログインしてみる
ホスト側からコンテナ側にSSH接続します。hinomaruc/phinomarucになっているはずですが、パスワードをわざと間違えて入力してfaillockの挙動を確かめます。
hinomaruc@myMBP blog % ssh hinomaruc@localhost -p 2222
hinomaruc@localhost's password:
Permission denied, please try again.
hinomaruc@localhost's password:
Permission denied, please try again.
hinomaruc@localhost's password:
hinomaruc@localhost: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
[root@5ac0f5e9ea5f /] faillock --user hinomaruc hinomaruc: When Type Source Valid 2023-07-02 00:50:41 RHOST 172.17.0.1 V 2023-07-02 00:50:46 RHOST 172.17.0.1 V 2023-07-02 00:50:48 RHOST 172.17.0.1 V
3回ログインに失敗しているので失敗ログが残っています。この時点ではまだ正しいパスワードを入力すればログイン出来ます。
もう一回わざと間違えてみます。
ssh hinomaruc@localhost -p 2222
hinomaruc@localhost's password:
Permission denied, please try again.
hinomaruc@localhost's password:
Permission denied, please try again.
hinomaruc@localhost's password:
hinomaruc@localhost: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
[root@5ac0f5e9ea5f /] faillock --user hinomaruc hinomaruc: When Type Source Valid 2023-07-02 00:50:41 RHOST 172.17.0.1 V 2023-07-02 00:50:46 RHOST 172.17.0.1 V 2023-07-02 00:50:48 RHOST 172.17.0.1 V 2023-07-02 00:54:58 RHOST 172.17.0.1 V 2023-07-02 00:55:04 RHOST 172.17.0.1 V
合計6回ログインに失敗していますが、deny=5に設定していますので5つのレコードが存在しています。
この状態でロックがかかっていることになり、正しいパスワードを入力したとしてもログインすることは出来なくなります。
※ faillockの存在を知らなければここではまってしまう方が出てくると思います。(私です 笑)
ユーザーロックを解除する
ユーザーロックを解除します。
# ロックをリセットする
[root@5ac0f5e9ea5f /] faillock --user hinomaruc --reset
# 確認
[root@5ac0f5e9ea5f /] faillock --user hinomaruc
hinomaruc: When Type Source Valid
これで正しいパスワードを入力するとログインできるはずです。
hinomarucユーザーをfaillockの対象から外す
とりあえず調べているうちに3通りの方法がありそうでした。3番が出来れば簡単ですかね。
1. 直接/etc/pam.d/内のファイルを操作する方法
こちらの方法は試せていないですが、How to Lock and Unlock User After Failed SSH Loginsを参考にやると下記のようになると思います。
※ 23/7/22追記: 実際にやることになり試したら期待通りでした。
- /etc/pam.d/system-authと/etc/pam.d/password-authのファイルを編集
- "auth [success=1 default=ignore] pam_succeed_if.so user in hinomaruc"をpam_faillock.soが呼ばれている行の1つ手前に追記する
参考: https://www.tecmint.com/lock-failed-ssh-login-attempts-linux/
直接/etc/pam.d以下のファイルは操作しない方がいいようですが、やり方を紹介している記事は多かったかも?
2. faillock機能を無効化にする
- authconfig --disablefaillock --update もしくは authselect disable-feature with-faillock
参考: https://www.tecmint.com/lock-failed-ssh-login-attempts-linux/
参考: https://docs.oracle.com/en/operating-systems/oracle-linux/8/userauth/userauth-WorkingWithSystemAuthenticationProfiles.html#profile-feature
hinomarucユーザー以外もロックがかからなくなるので最終手段かも?
3. /etc/security/faillock.confのadmin_groupパラメータを有効化する方法
- admin_group = wheelを設定する。(グループ名は何でもOK)
- hinomarucユーザーをwheelグループに追加 (usermod -a -G wheel hinomaruc)
- authselect apply-changesで設定を反映させる
こちらを試してみましたがhinomarucユーザーにパスワードロックがかからなくなることを確認出来ました。
(おまけ) Ubuntuでpam_faillock.soを利用する方法
Ubuntuには23年7月現在、authselectのようなユーザー認証のユーティリティツールはなさそうでした。
・How do I set up pam_faillock?
・How to configure pam_faillock in common-*?
らへんを参考に頑張るしかないかも知れません。本記事を書くにあたり少し試してみましたが動かなかったので断念しました。(また必要になったら検証します)
/etc/security/faillock.confファイルはUbuntu23.04にも存在したので諸々設定を真似すれば動作するかも知れません。
まとめ
いかがでしょうか?ユーザー認証をかけたい場合はお手軽に使えそうですね。
ただfaillockが使われていることを知らないと急にサーバーにログイン出来なくなって困る場合があると思うのでそのような機能があることを知っておいた方がいいですね 笑