自分のキャリアをあれこれ考えながら、Pythonで様々なデータを分析していくブログです

Oracle Linuxでpam_faillock.soモジュールを使ったユーザーロック機能を試してみる

Linux
Linux

今回は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が使えるようになっていたりとあまり設定することはありませんでした。

Dockerfileを作成するまでもないので、コンテナ作成してしまう
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を有効化にする

ユーザー認証をauthselectツールで設定する
[root@5ac0f5e9ea5f /] authselect select minimal with-faillock -f
Out[0]
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
Out[0]
Profile ID: minimal
Enabled features:
- with-faillock

きちんと設定されているようです。

設定変更があった場合に適用するコマンド
[root@5ac0f5e9ea5f /] authselect apply-changes
Out[0]
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).
Out[0]
[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).
Out[0]
[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
Out[0]
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が使われていることを知らないと急にサーバーにログイン出来なくなって困る場合があると思うのでそのような機能があることを知っておいた方がいいですね 笑

タイトルとURLをコピーしました