passwd / chage 入門 - パスワードと有効期限を管理する

passwd / chage 入門 - パスワードと有効期限を管理する

この記事で解決できること

  • passwdchage役割の違い が分かる
  • パスワード変更・アカウントロック・状態確認を迷わず実行できる
  • パスワードの 有効期限(パスワードエイジング) をポリシーどおりに設定できる
  • /etc/shadow を読んで 現状を即把握 できる

結論(実務の型)

  • パスワードの値そのもの(変更・ロック・削除)→ passwd
  • 期限・経過日数のルール(最長/最短/警告/失効)→ chage
  • どちらも書き込み先は同じ /etc/shadow。他人のアカウント操作は root(sudo)が必要

前提(対象環境)

  • OS:Ubuntu / 一般的な Linux(shadow-utils)
  • 他ユーザーの操作は sudo 前提
  • ローカルアカウント(/etc/shadow 管理)が対象。LDAP / AD 連携環境は対象外

passwd と chage は何が違うのか?

結論: passwd はパスワードの「値」を、chage はパスワードの「期限ルール」を操作する。対象はどちらも同じ /etc/shadow の別フィールド。

/etc/shadow の 1 行はコロン区切りの 9 フィールドで構成される。両コマンドが触る場所を分けて理解すると混乱しない。

alice:$6$xxxx...:19876:7:90:7:30:20089:
  │     │         │     │  │  │  │   │
  │     │         │     │  │  │  │   └ (8) アカウント失効日(1970-01-01からの日数)
  │     │         │     │  │  │  └ (7) 失効後の猶予日数(inactive)
  │     │         │     │  │  └ (6) 期限切れ警告日数(warn)
  │     │         │     │  └ (5) 最長有効日数(max)
  │     │         │     └ (4) 変更後の最短経過日数(min)
  │     │         └ (3) 最終パスワード変更日(1970-01-01からの日数)
  │     └ (2) ハッシュ化パスワード
  └ (1) ユーザー名
  • passwd → 第 2 フィールド(ハッシュ)を書き換える
  • chage → 第 3〜8 フィールド(経過日数・期限)を書き換える

日付フィールドは「1970-01-01 からの経過日数」で保存される。人が読む形式は chage -l が変換してくれる(後述)。

パスワードを変更するには?

結論: 自分のパスワードは passwd だけで変更する。他人のパスワードは sudo passwd ユーザー名 で root 権限が必要。

自分のパスワード

$ passwd

現在のパスワードを 1 回、新しいパスワードを 2 回入力する。入力中は画面に何も表示されない(仕様)。

他人のパスワード(管理者)

$ sudo passwd alice

現在のパスワードを聞かれず、新しいパスワードを 2 回入力するだけで設定できる。

新規ユーザーに初期パスワードを設定したら、次のログイン時に本人へ強制変更させるのが定石。passwd --expire alice(後述の chage -d 0 と同義)で実現する。

アカウントをロック・状態確認するには?

結論: passwd -l でロック、passwd -u で解除、passwd -S で状態を 1 行で確認する。ロックはハッシュ先頭に ! を付けてパスワード認証を無効化する。

状態確認

$ sudo passwd -S alice
alice P 06/05/2026 0 99999 7 -1

2 列目の意味:

  • P:使用可能なパスワードあり
  • L:ロック中
  • NP:パスワード未設定

ロックと解除

# パスワード認証を無効化(退職者・休眠アカウント等)
$ sudo passwd -l alice

# 解除
$ sudo passwd -u alice

passwd -l はパスワード認証を止めるだけ。SSH 鍵認証は止まらない。完全に締め出すにはアカウント失効(chage -E または usermod -L + シェル無効化)を併用する。

パスワードの有効期限はどう確認するのか?

結論: chage -l ユーザー名 で、最終変更日・次回失効日・各種ポリシーを人が読める形式で一覧表示する。

$ sudo chage -l alice
Last password change                                    : Jun 05, 2026
Password expires                                        : Sep 03, 2026
Password inactive                                       : Oct 03, 2026
Account expires                                         : never
Minimum number of days between password change          : 7
Maximum number of days between password change          : 90
Number of days of warning before password expires       : 7
  • Password expires:このパスワードが使えなくなる日(最終変更日 + max)
  • Password inactive:失効後さらに猶予が切れてアカウントが使えなくなる日(+ inactive)
  • Account expires:アカウント自体が無効になる日(-E で設定)

パスワードの有効期限はどう設定するのか?

結論: chage -M で最長日数、-m で最短日数、-W で警告日数、-I で失効猶予を設定する。複数オプションは 1 コマンドにまとめられる。

主なオプション

オプション 意味
-M 最長有効日数(これを超えると失効) -M 90
-m 変更後に再変更できるまでの最短日数 -m 7
-W 失効前の警告日数 -W 7
-I 失効後アカウント無効化までの猶予日数 -I 30
-E アカウント失効日(YYYY-MM-DD) -E 2026-12-31
-d 最終変更日の上書き -d 0

まとめて設定

$ sudo chage -M 90 -m 7 -W 7 -I 30 alice

「90 日で失効、変更後 7 日は再変更不可、7 日前から警告、失効後 30 日でアカウント無効」というポリシーになる。

次回ログイン時に強制変更させる

$ sudo chage -d 0 alice

最終変更日を「エポック当日」に戻すことで「すぐ期限切れ」扱いとなり、次回ログイン時にパスワード変更を強制できる。

対話形式で 1 項目ずつ設定したい場合は引数なしの sudo chage alice を実行する。現在値が [ ] 内に表示され、Enter で据え置きできる。

アカウントの失効日を設定するには?

結論: chage -E 日付 でアカウント自体の失効日を設定する。期限契約のユーザーや一時アカウントの自動無効化に使う。

# 2026-12-31 でアカウントを失効させる
$ sudo chage -E 2026-12-31 alice

# 失効を解除(無期限に戻す)
$ sudo chage -E -1 alice

-E はパスワード失効(-M)とは独立している。契約満了で確実にログインを止めたい場合は -M(パスワード期限)ではなく -E(アカウント期限)を使う。

よくある事故と切り分け

結論: 「変更できない」「即ログインできなくなった」の多くは、min 日数・-d 0・失効日設定の誤りが原因。chage -l で現状を必ず確認する。

すぐにパスワードを変えられない

You must wait longer to change your password

-m(最短日数)が効いている。管理者なら sudo passwd で即変更できる。

設定直後にログインできなくなった

chage -d 0-M/-I の組み合わせで「即失効 + 猶予 0」になっていないか確認する。

$ sudo chage -l alice

root のパスワードは期限管理しない

システムアカウントや root にエイジングを掛けると締め出し事故につながる。ポリシー適用は 対話ログインする一般ユーザーに限定 する。

やってはいけないこと

  • root やサービスアカウントへ安易にエイジング適用
  • chage -Epasswd -l を混同(前者はアカウント、後者はパスワード)
  • 設定後に chage -l で確認せず放置

まとめと次に読む