July 29, 2020

Linuxで一定期間ログインしていないアカウントを無効化する

ある日を境にアカウントを無効化したい、ということなら、chage -E YYYY-MM-DD accountコマンドで期日を指定できる。

では、90日間ログインしていないアカウントを無効化したい場合はどうするか?

結論

lastlog -b 90 -u 1000-65533 | tail -n+2 | awk '{print $1}' | xargs -pI{} chage -E0 {}

上記をrootで実行するなり、rootのcrontabに書いておけばいい。

解説

lastlogコマンドは、全ユーザーの最終ログイン日時を表示してくれる。

[vagrant@localhost ~]$ lastlog
Username         Port     From             Latest
root                                       **Never logged in**
bin                                        **Never logged in**
daemon                                     **Never logged in**
adm                                        **Never logged in**
lp                                         **Never logged in**
sync                                       **Never logged in**
shutdown                                   **Never logged in**
halt                                       **Never logged in**
mail                                       **Never logged in**
operator                                   **Never logged in**
games                                      **Never logged in**
ftp                                        **Never logged in**
nobody                                     **Never logged in**
systemd-network                            **Never logged in**
dbus                                       **Never logged in**
polkitd                                    **Never logged in**
rpc                                        **Never logged in**
tss                                        **Never logged in**
rpcuser                                    **Never logged in**
nfsnobody                                  **Never logged in**
sshd                                       **Never logged in**
postfix                                    **Never logged in**
chrony                                     **Never logged in**
vagrant          pts/0    10.0.2.2         Wed Jul 29 20:03:24 +0900 2020
inactive1        pts/1    10.0.2.2         Tue Nov 12 20:03:24 +0900 2019
active1          pts/2    10.0.2.2         Wed Jul 29 19:03:24 +0900 2020
inactive2        pts/3    10.0.2.2         Tue Nov 12 19:03:24 +0900 2019

-bオプションで、ログイン日が90日以上前のアカウントに絞り、かつ、-uオプションでシステムアカウントを除外する

[vagrant@localhost ~]$ lastlog -b 90 -u 1000-65533
Username         Port     From             Latest
inactive1        pts/1    10.0.2.2         Tue Nov 12 20:03:24 +0900 2019
inactive2        pts/3    10.0.2.2         Tue Nov 12 19:03:24 +0900 2019

先頭行をtailで落とす

[vagrant@localhost ~]$ lastlog -b 90 -u 1000-65533 | tail -n+2
inactive1        pts/1    10.0.2.2         Tue Nov 12 20:03:24 +0900 2019
inactive2        pts/3    10.0.2.2         Tue Nov 12 19:03:24 +0900 2019

awkでユーザー名だけ抽出する

[vagrant@localhost ~]$ lastlog -b 90 -u 1000-65533 | tail -n+2 | awk '{print $1}'
inactive1
inactive2

あとはxargsでchageに渡せば完成

dry runを試してみたければxargsに-pオプション

[vagrant@localhost ~]$ lastlog -b 90 -u 1000-65533 | tail -n+2 | awk '{print $1}' | xargs -pI{} chage -E0 {}
chage -E0 inactive1 ?...
chage -E0 inactive2 ?...

うっかり全員無効化した場合

chage -E0コマンドは、/etc/shadowの8番目のフィールドを0に書き換えるので、なんらかの方法でこのフィールドを空にすればログインできるようになる。
AWSなら別のEC2インスタンスにボリュームをアタッチして書き換えればいい。

© 2020 nissy-lab.com