2026年6月3日
2026年6月3日
Linuxのアカウント有効期限を設定する方法 chage・useradd・usermodの使い分け
一時的な作業者や委託先のアカウントは、作業が終わっても消し忘れて残りがちです。Linux では、アカウントに有効期限を付けておくと、その日以降はログインできなくなります。この記事では、chage などの標準コマンドで有効期限を設定・確認・解除する方法と、混同しやすい「パスワードの有効期限」との違いを説明します。
コマンドは shadow-utils(多くのディストリビューションの標準)のものです。設定には root 権限が必要なので、sudo を付けて実行します。
アカウントの有効期限とパスワードの有効期限の違い
| 種類 | 期限が来ると | 主な設定コマンド |
|---|---|---|
| アカウントの有効期限 | そのアカウントではログインできなくなる(パスワードでも SSH 鍵でも) | chage -E、useradd -e、usermod -e |
| パスワードの有効期限 | 次のログイン時にパスワードの変更を求められる | chage -M、passwd -x |
「期限を過ぎたら使えなくしたい」ならアカウントの有効期限、「定期的にパスワードを変えさせたい」ならパスワードの有効期限を使います。
現在の設定を確認する
sudo chage -l user1
表示の意味は次のとおりです。
| 表示 | 意味 |
|---|---|
| Last password change | 最後にパスワードを変えた日 |
| Password expires | パスワードの有効期限 |
| Password inactive | パスワードの期限切れ後、ロックされる日 |
| Account expires | アカウントの有効期限(never は期限なし) |
| Minimum number of days between password change | パスワードを変えてから次に変えられるまでの日数 |
| Maximum number of days between password change | パスワードの有効日数 |
| Number of days of warning before password expires | 期限の何日前から警告するか |
既存のアカウントに有効期限を付ける
chage -E に日付を YYYY-MM-DD の形で渡します。
sudo chage -E 2026-12-31 user1
sudo chage -l user1
Account expires に指定した日付が表示されれば設定されています。内部では 1970年1月1日からの日数として /etc/shadow の8番目の欄に記録され、その日(日付の区切りは UTC 基準)以降はログインできなくなります。12月31日いっぱいまで使わせたい場合は、翌日の 2027-01-01 を指定するのが無難です。
usermod -e でも同じ設定ができます。
sudo usermod -e 2026-12-31 user1
作成時に有効期限を付ける
useradd -e を使うと、作成と同時に期限を付けられます。
sudo useradd -m -e 2026-12-31 user2
sudo passwd user2
新しく作るアカウントすべてに期限を付けたいときは、useradd の既定値を変えます(設定は /etc/default/useradd の EXPIRE に保存されます)。
sudo useradd -D -e 2026-12-31
sudo useradd -D
Debian / Ubuntu の adduser コマンドでアカウントを作った場合も、作成後に chage -l で期限が付いているかを確かめておきます。
有効期限を解除する・延長する
期限を外すには -1 を指定します。
sudo chage -E -1 user1
Account expires が never に戻ります。延長するときは、新しい日付で chage -E を実行し直します。
パスワードの有効期限を設定する
パスワードを定期的に変えさせたい場合は、次のように設定します。
# 有効日数 90日、変更後 1日は再変更不可、期限の 7日前から警告
sudo chage -M 90 -m 1 -W 7 user1
# パスワードの期限切れから 14日たったらロックする
sudo chage -I 14 user1
passwd -x 90 user1 は chage -M 90 user1 と同じく、パスワードの有効日数を設定するコマンドです。アカウントの有効期限ではありません。
/etc/login.defs が効く範囲
/etc/login.defs の PASS_MAX_DAYS・PASS_MIN_DAYS・PASS_WARN_AGE は、アカウントを作るときに使われる既定値です。書き換えても、既にあるアカウントには反映されません。既存のアカウントは chage で個別に設定します。
PASS_MAX_DAYS 90
PASS_MIN_DAYS 1
PASS_WARN_AGE 7
期限付きのアカウントを一覧する
/etc/shadow の8番目の欄に値が入っているアカウントを表示し、日数を日付に直します。
sudo awk -F: '$8 != "" { print $1, $8 }' /etc/shadow | while read -r name days; do
echo "$name $(date -u -d "@$((days * 86400))" +%F)"
done
/etc/shadow はエディターで直接書き換えないでください。書式を崩すと全員がログインできなくなるおそれがあります。変更は chage・usermod・passwd で行います。
期限切れになったときの動き
- パスワードでのログインも、SSH の公開鍵でのログインも拒否される(OpenSSH の既定の構成の場合)
- 期限の時点で既にログインしているセッションは、自動では切断されない
- PAM でアカウントの状態を確かめるサービス(cron など)は、そのユーザーとして動かなくなることがある
ログを見ると、account has expired のような記録が残ります(Debian / Ubuntu は /var/log/auth.log、RHEL 系は /var/log/secure、systemd の環境では journalctl でも確認できます)。
アカウントをすぐに止めたい場合のロックとロック解除の方法は Linuxのアカウントをロック・解除する方法 で扱っています。
まとめ
- アカウントの有効期限は
chage -E YYYY-MM-DD ユーザー名で付け、chage -E -1で外す - 作成時なら
useradd -e、既存ならusermod -eでも設定できる - パスワードの有効期限(
chage -M、passwd -x)とは別物 /etc/login.defsの値は新しく作るアカウントにだけ効く- 確認は
chage -l、変更はコマンドで行い、/etc/shadowは直接編集しない