もくじ
概要・環境
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
コメント