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 は直接編集しない

お気軽にご相談ください

お見積りへ お問い合わせへ
▲