【まとめ】Linuxのアカウントロックの種類と解除方法

概要・環境

Linuxにはさまざまなユーザロックアウトの種類があります。

それぞれのユーザロックアウトについての設定方法と、解除方法を本記事でまとめます。

本記事で使用する環境は「Cent OS 7」となります。

# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

ユーザロックアウトの種類

ユーザーのロックアウトには、大きく分けて3種類あります。

パスワード誤りでロックアウト

そのままの通り、サーバにログインするときにパスワードを誤った回数が上限を超えたとき、ユーザをロックアウトすることです。

長期ログイン無しでロックアウト

一定期間ログイン履歴がなかった場合、ユーザをロックアウトします。言い換えれば、非アクティブ期間以上ログインがなかった場合、ユーザをロックアウトします。

パスワードの有効期限切れでロックアウト

パスワードに有効期限を設定して、その有効期限が切れたときにユーザをロックアウトします。




設定方法

それぞれの設定方法についてみていきます。

パスワード誤りでロックアウトする設定値

「/etc/pam.d/system-auth-ac」と「/etc/pam.d/password-auth-ac」のauthディレクティブに”required pam_tally2.so deny=数字“を追記します。

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        required      pam_tally2.so deny=3 ←これを追記。
auth        required      pam_faildelay.so delay=2000000
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

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    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

上の場合、3回パスワード入力を誤るとロックがかかります。

長期間ログイン無しでロックアウトする設定値

「/etc/pam.d/system-auth-ac」と「/etc/pam.d/password-auth-ac」のaccountディレクティブに”pam_lastlog.so inactive=数字“を追記します。

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        required      pam_faildelay.so delay=2000000
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_lastlog.so inactive=10 ←これを追記。
account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

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    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

上の設定値の場合、10日間ユーザがログインしていないとロックアウトがかかります。

パスワード有効期限切れでのロックアウトする設定

パスワードの有効期限を設定するには、ユーザに対して下記のコマンドを実行します。

# chage -M 20 John ←パスワード有効期限を「20日」に設定。

上の場合Johnというユーザのパスワード有効期限を20に設定しています。

パスワード有効期限が切れたとき即座にロックアウトする場合は、追加で以下の設定(コマンド)を入れます。

# chage -I 0 John ←パスワード有効期限が切れてからロックアウトするまでの日数を「0日」(即時)に設定。

ユーザのパスワードの有効期限を確認する方法は、下のような方法があります。

  • /etc/shadowで確認
# cat /etc/shadow | grep John
John:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:18704:0:20:7:1::

/etc/shadowファイルをcatなどで開いて第5カラムを確認します。(コロンで区切られています)5カラムが「20になっていることが確認できます。

また7カラム有効期限が切れてからロックアウトするまでの日数が確認できます。上のJohnユーザの場合「1日」になっています。

ちなみに有効期限が切れてからロックアウトするまでの日数デフォルト値は、-1」(無効)になります。この場合/etc/shadowで確認すると、7カラム空白となります。

# cat /etc/shadow | grep Paul
Paul:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:18704:0:1:7:::

上のPaulユーザ7カラム空白になっているのが確認できます。後述しますが、この場合のロックアウト解除は、Paulユーザ自身で実施できます

パスワード有効期限を確認する方法としてもう一つが、chageコマンドで確認する方法です。

  • chageコマンドで確認
# chage -l John
最終パスワード変更日                            : 3月 18, 2021
パスワード期限:                                 : 4月 07, 2021
パスワード無効化中                              :  なし
アカウント期限切れ                              :  なし
パスワードが変更できるまでの最短日数            : 0
パスワードを変更しなくてよい最長日数            : 20 ←ここ。
パスワード期限が切れる前に警告される日数        : 7

Johnユーザの[パスワードを変更しなくてよい最長日数]に「20」が設定されていることが確認できます。




ロックアウト解除の方法

最後にそれぞれのロックアウトについて、解除方法を記載します。

パスワード誤りのロックアウト解除

「pam_tally2」コマンドで解除します。下のように「–reset」オプションを付けます。

# pam_tally2 --reset --user John

現在のパスワード誤りの回数も「pam_tally2」コマンドで確認できます。

# pam_tally2 --user John
Login           Failures Latest failure     From
John                3    03/18/21 21:03:39  172.31.128.111

上の例の場合、3回パスワード誤りの履歴があります。

ちなみにパスワード誤りでロックがかかっている状態でログインを試行すると、「/var/log/secure」に下記のようなログが記録されます。

Mar 18 21:04:26 FILEVM01 sshd[2701]: pam_tally2(sshd:auth): user John (1003) tally 4, deny 3

ロックアウトを解除した後は、パスワード誤りが0回に戻っていることが確認できます。

# pam_tally2 --reset --user John ←パスワード誤り回数をリセット

Login           Failures Latest failure     From

John                4    03/18/21 21:04:26  172.31.128.111

#

# pam_tally2 --user John

Login           Failures Latest failure     From

John                0 ←パスワード誤りの回数が0になっている。

長期間ログイン無しのロックアウトを解除

長期間(最大非アクティブ期間)以上ログイン履歴がなかったユーザのロックアウトを解除する方法は、コマンドでユーザの最終ログイン日時を変更します。

今時点からログインしていなくてよい日数以内の日付を指定します。

わかりずらいですね。。。💦

例えば「pam_lastlog.so inactive=3」と設定していたら、今の日付から3日以内の日付を指定すれば、ユーザはログインできるようになります。(「pam_lastlog.so inactive=3」は今から3日間ログインしないことが許されるから)

解除には「lastlog」コマンドを使用します。方法は2種類あり、それぞれ付与するオプションが違います。

  • 「–set」または「-S」オプション
# lastlog --set --user John

#

# lastlog --user John

ユーザ名         ポート   場所             最近のログイン

John             lastlog  localhost        木  3月 18 22:08:07 +0900 2021 ←現在日時に変更される。

これでログイン日時を現在日付に変更でき、ユーザは許される非アクティブ期間内になり、ログインできるようになります。

  • 「–clear」または「-C」オプション
# lastlog --clear --user John

#

# lastlog --user John

ユーザ名         ポート   場所             最近のログイン

John                                       **一度もログインしていません** ←ログインしたことがないことになる。

上のコマンドでは「ユーザが一度もログインしたことがない」という状態にします。ユーザは非アクティブ期間に影響を受けなくなるので、ログインできるようになります。

パスワード有効期限切れの解除

パスワードの有効期限が切れたとき、どのようなエラーが発生するか確認します。

前提として、JohnユーザPaulユーザパスワード有効期限1に設定しています。そしてJohnユーザはパスワード有効期限が切れたら即座にロックアウトすることとし、Paulユーザはロックアウトしない(デフォルト)設定としています。

まずはパスワードの有効期限が切れていることの確認です。

# date
2021年  3月 20日 土曜日 11:29:44 JST ←今日は「3/20」

#

# cat /etc/shadow | grep John

John:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:18704:0:1:7:0:: ←パスワード有効期限は「1日」としている。

#

# chage -l John

最終パスワード変更日                            : 3月 18, 2021 ←パスワードを変更した日は「3/18」

パスワード期限:                                 :  3月 19, 2021 ←パスワード有効期限は1日後の「3/19」

パスワード無効化中                                      :  3月 19, 2021 ←有効期限切れたら即座にロックアウトなのでロックがかかっている。

アカウント期限切れ                                              : なし

パスワードが変更できるまでの最短日数            : 0

パスワードを変更しなくてよい最長日数            : 1

パスワード期限が切れる前に警告される日数                : 7

#

# chage -l Paul

最終パスワード変更日                            : 3月 18, 2021 ←パスワードを変更した日は「3/18」

パスワード期限:                                 :  3月 19, 2021 ←パスワード有効期限は1日後の「3/19」

パスワード無効化中                                      : なし ←有効期限切れてもロックアウトはしていない。

アカウント期限切れ                                              : なし

パスワードが変更できるまでの最短日数            : 0

パスワードを変更しなくてよい最長日数            : 1

パスワード期限が切れる前に警告される日数                : 7

パスワードロックがかかっている状態でログインを試行すると、以下のエラーが発生します。

# ssh John@172.31.128.111

John@172.31.128.111's password:

Your account has expired; please contact your system administrator
Authentication failed.

#

# tail /var/log/secure

(省略)

Mar 20 11:26:48 FILEVM01 sshd[2172]: pam_unix(sshd:account): account John has expired (failed to change password)

(省略)

この場合ユーザ(ここではJohn)はログインできないので、root権限を持ったユーザでchageコマンドの「-d」オプションで解除します。

# chage -d 2021-03-31 John ←パスワード有効期限を「2021/3/31」の未来日に設定。

#

# chage -l John
最終パスワード変更日                            : 3月 31, 2021 ←パスワード有効期限が延長されている。

パスワード期限:                                 :  4月 01, 2021

パスワード無効化中                                      :  4月 01, 2021

アカウント期限切れ                                              :  なし

パスワードが変更できるまでの最短日数            : 0

パスワードを変更しなくてよい最長日数            : 1

パスワード期限が切れる前に警告される日数                : 7

#

# ssh John@172.31.128.111 

John@172.31.128.111's password:
 ←Johnユーザで現在のパスワードでログインを試行。
Last failed login: Sat Mar 20 17:39:32 JST 2021 from 172.31.128.111 on ssh:notty

There were 2 failed login attempts since the last successful login.

Last login: Thu Mar 18 23:40:41 2021 from 172.31.128.111

$

$ whoami
John ←ログイン成功した。

もしPaulユーザのように有効期限が切れてもロックアウトしない場合は、ユーザがログインを試行したタイミングで新しいパスワードへ変更を求められるので、そこで新しいパスワードに変更することができます。

# ssh Paul@172.31.128.111 ←Paulユーザでログインを試行。

Paul@172.31.128.111's password: ←現在の(有効期限が切れた)パスワードを入力する。

You are required to change your password immediately (password aged)

Last login: Sat Mar 20 17:20:22 2021 from 172.31.0.99

WARNING: Your password has expired.
You must change your password now and login again!

ユーザー Paul のパスワードを変更。

Paul 用にパスワードを変更中 ←パスワードの変更を求められる。

現在の UNIX パスワード: ←現在の(有効期限が切れた)パスワードを入力する。

新しいパスワード: ←新しいパスワードを入力する。

新しいパスワードを再入力してください: ←新しいパスワードを再度入力する。

passwd: すべての認証トークンが正しく更新できました。 ←パスワードの更新(変更)が完了した。

Connection to 172.31.128.111 closed.

#

# ssh Paul@172.31.128.111 ←再度Paulユーザでログインを試行する。

Paul@172.31.128.111's password: ←新しいパスワードを入力する。

Warning: your password will expire in 1 day
Last login: Sat Mar 20 17:46:19 2021 from 172.31.128.111

$

$ whoami
Paul ←ログイン成功した。

以上です。お読みいただきありがとうございました。



参考サイト

https://access.redhat.com/discussions/3655431?tour=8

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html-single/7.3_release_notes/index

https://www.steponboard.net/linux/537/

https://linuc.org/study/knowledge/510/

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!

コメント

コメントする

CAPTCHA