Oracle データベースでは、デフォルトでパスワードに180 日の有効期限が設定されています。期限が切れると ORA-28001: the password has expired が発生し、ログインできなくなります。
本番環境ではセキュリティ上必要な設定ですが、開発・検証環境では頻繁なパスワード変更が煩雑になるため、有効期限を無制限(UNLIMITED)にしたいケースがあります。
本記事では、パスワード有効期限の確認・変更方法、ORA-28001 / ORA-28002 の対処、開発用カスタムプロファイルの作成、そして本番環境でのセキュリティ考慮まで解説します。
この記事でわかること
・パスワード有効期限の現在の設定を確認する方法
・PASSWORD_LIFE_TIME を UNLIMITED に変更する方法
・ORA-28001 / ORA-28002 の発生メカニズムと復旧手順
・開発用カスタムプロファイルの作成
・パスワード関連パラメータ(GRACE_TIME / REUSE_TIME / REUSE_MAX 等)の意味
・本番環境で有効期限を無制限にするリスク
・パスワード有効期限の現在の設定を確認する方法
・PASSWORD_LIFE_TIME を UNLIMITED に変更する方法
・ORA-28001 / ORA-28002 の発生メカニズムと復旧手順
・開発用カスタムプロファイルの作成
・パスワード関連パラメータ(GRACE_TIME / REUSE_TIME / REUSE_MAX 等)の意味
・本番環境で有効期限を無制限にするリスク
パスワード有効期限の現在の設定を確認する
SQL(プロファイルのパスワード設定を確認)
-- DEFAULT プロファイルのパスワード関連設定 SELECT resource_name, limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_type = 'PASSWORD' ORDER BY resource_name;
デフォルトの結果例(Oracle 11g 以降):
| RESOURCE_NAME | LIMIT | 意味 |
|---|---|---|
| PASSWORD_LIFE_TIME | 180 | パスワードの有効期間(日) |
| PASSWORD_GRACE_TIME | 7 | 期限切れ後の猶予期間(日)。警告が出るがログイン可 |
| PASSWORD_REUSE_TIME | UNLIMITED | 同じパスワードを再利用できるまでの日数 |
| PASSWORD_REUSE_MAX | UNLIMITED | 同じパスワードを再利用できるまでの変更回数 |
| PASSWORD_LOCK_TIME | 1 | ロックアウト期間(日) |
| FAILED_LOGIN_ATTEMPTS | 10 | ロックまでのログイン失敗回数 |
| PASSWORD_VERIFY_FUNCTION | NULL | パスワード複雑性チェック関数 |
SQL(各ユーザーのプロファイルと期限状態を確認)
-- ユーザーごとのプロファイルとアカウント状態
SELECT username, profile, account_status, expiry_date,
lock_date
FROM dba_users
WHERE username NOT IN ('SYS','SYSTEM','ANONYMOUS','XDB')
ORDER BY expiry_date;
-- account_status の値:
-- OPEN: 正常
-- EXPIRED: パスワード期限切れ
-- EXPIRED(GRACE): 猶予期間中
-- LOCKED: ロック中
-- EXPIRED & LOCKED: 期限切れ + ロック
ORA-28001 / ORA-28002 の発生メカニズム
| エラー | 状態 | 発生タイミング | ログイン |
|---|---|---|---|
| ORA-28002 | パスワードは猶予期間内に期限切れになります | PASSWORD_LIFE_TIME 経過後、GRACE_TIME 内 | 可能(警告が表示される) |
| ORA-28001 | パスワードが期限切れです | GRACE_TIME も経過 | 不可 |
タイムラインのイメージ:
| 日数 | 状態 | 動作 |
|---|---|---|
| 0〜180 日 | 有効期間内 | 通常ログイン可能 |
| 181〜187 日 | 猶予期間(GRACE_TIME=7) | ORA-28002 警告 + ログイン可能 |
| 188 日〜 | 期限切れ | ORA-28001 でログイン不可 |
ORA-28001 が発生した場合の復旧手順
SQL(期限切れユーザーの復旧)
-- (1) DBA または SYS でログイン -- sqlplus / as sysdba -- (2) パスワードを再設定(同じパスワードでも可) ALTER USER hr IDENTIFIED BY new_password; -- (3) アカウントがロックされている場合はアンロック ALTER USER hr ACCOUNT UNLOCK; -- (4) 状態を確認 SELECT username, account_status, expiry_date FROM dba_users WHERE username = 'HR'; -- account_status = OPEN, expiry_date = 180 日後 であれば復旧完了
パスワードを再設定しても有効期限はリセットされるだけ
ALTER USER … IDENTIFIED BY でパスワードを変更すると、有効期限が「今日 + PASSWORD_LIFE_TIME」にリセットされます。根本的に期限切れを防ぎたい場合は、次のセクションでPASSWORD_LIFE_TIME を UNLIMITED に変更してください。
ALTER USER … IDENTIFIED BY でパスワードを変更すると、有効期限が「今日 + PASSWORD_LIFE_TIME」にリセットされます。根本的に期限切れを防ぎたい場合は、次のセクションでPASSWORD_LIFE_TIME を UNLIMITED に変更してください。
パスワード有効期限を UNLIMITED に変更する
方法(1): DEFAULT プロファイルを変更する
SQL(DEFAULT プロファイルの変更: 全ユーザーに影響)
-- DEFAULT プロファイルの PASSWORD_LIFE_TIME を UNLIMITED に変更 ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; -- 確認 SELECT resource_name, limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_LIFE_TIME'; -- LIMIT = UNLIMITED -- 既に期限切れのユーザーはパスワード再設定も必要 ALTER USER hr IDENTIFIED BY current_password;
DEFAULT プロファイルの変更は全ユーザーに影響する
DEFAULT プロファイルを使っている全ユーザーの有効期限が UNLIMITED になります。本番と開発が同じ DB インスタンスの場合、本番ユーザーのセキュリティが低下するリスクがあります。特定ユーザーだけ変更したい場合は、次のカスタムプロファイルを使ってください。
DEFAULT プロファイルを使っている全ユーザーの有効期限が UNLIMITED になります。本番と開発が同じ DB インスタンスの場合、本番ユーザーのセキュリティが低下するリスクがあります。特定ユーザーだけ変更したい場合は、次のカスタムプロファイルを使ってください。
方法(2): カスタムプロファイルを作成する(推奨)
SQL(開発用プロファイルの作成と適用)
-- 開発用プロファイルを作成(パスワード期限なし)
CREATE PROFILE dev_profile LIMIT
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_GRACE_TIME UNLIMITED
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS UNLIMITED
PASSWORD_LOCK_TIME UNLIMITED;
-- 特定ユーザーにプロファイルを適用
ALTER USER hr PROFILE dev_profile;
ALTER USER dev_user PROFILE dev_profile;
-- 確認
SELECT username, profile FROM dba_users WHERE username IN ('HR', 'DEV_USER');
-- 既に期限切れの場合はパスワード再設定も必要
ALTER USER hr IDENTIFIED BY current_password;
カスタムプロファイルのメリット
・DEFAULT プロファイルを変更しないため、他ユーザーに影響しない
・開発用(dev_profile)と本番用(prod_profile)を分けて管理できる
・プロファイルの切り替えで設定を一括変更できる
本番環境では DEFAULT プロファイルを変更せず、カスタムプロファイルで制御するのがベストプラクティスです。
・DEFAULT プロファイルを変更しないため、他ユーザーに影響しない
・開発用(dev_profile)と本番用(prod_profile)を分けて管理できる
・プロファイルの切り替えで設定を一括変更できる
本番環境では DEFAULT プロファイルを変更せず、カスタムプロファイルで制御するのがベストプラクティスです。
方法(3): 本番用プロファイルの作成(セキュリティ重視)
SQL(本番用プロファイル: 90 日期限 + 強度チェック)
-- 本番用プロファイル(セキュリティ強化)
CREATE PROFILE prod_profile LIMIT
PASSWORD_LIFE_TIME 90 -- 90 日で期限切れ
PASSWORD_GRACE_TIME 7 -- 7 日間の猶予
PASSWORD_REUSE_TIME 365 -- 1 年間は同じパスワード再利用不可
PASSWORD_REUSE_MAX 12 -- 12 回変更するまで再利用不可
FAILED_LOGIN_ATTEMPTS 5 -- 5 回失敗でロック
PASSWORD_LOCK_TIME 1/24 -- 1 時間ロック(1/24 日)
PASSWORD_VERIFY_FUNCTION ORA12C_STRONG_VERIFY_FUNCTION; -- 複雑性チェック
ALTER USER prod_user PROFILE prod_profile;
パスワード関連パラメータの一覧
| パラメータ | デフォルト | 説明 |
|---|---|---|
| PASSWORD_LIFE_TIME | 180 | パスワードの有効期間(日)。UNLIMITED で無期限 |
| PASSWORD_GRACE_TIME | 7 | 期限切れ後にパスワード変更なしでログインできる猶予期間(日) |
| PASSWORD_REUSE_TIME | UNLIMITED | 以前のパスワードを再利用できるまでの日数 |
| PASSWORD_REUSE_MAX | UNLIMITED | 以前のパスワードを再利用できるまでのパスワード変更回数 |
| FAILED_LOGIN_ATTEMPTS | 10 | 連続ログイン失敗でアカウントをロックする回数 |
| PASSWORD_LOCK_TIME | 1 | ロック後の自動解除までの日数(1/24 = 1 時間) |
| PASSWORD_VERIFY_FUNCTION | NULL | パスワード複雑性チェック関数。NULL = チェックなし |
REUSE_TIME と REUSE_MAX は両方 UNLIMITED だと再利用制限なし
両方が UNLIMITED の場合、以前と同じパスワードをすぐに再設定できます。本番環境では片方または両方に制限を設定し、パスワードの使い回しを防止してください。
両方が UNLIMITED の場合、以前と同じパスワードをすぐに再設定できます。本番環境では片方または両方に制限を設定し、パスワードの使い回しを防止してください。
Oracle バージョン別のデフォルト値
| バージョン | PASSWORD_LIFE_TIME デフォルト | 備考 |
|---|---|---|
| 10g | UNLIMITED | デフォルトで無期限 |
| 11g | 180 | 11g から 180 日がデフォルトに変更 |
| 12c | 180 | 統合監査環境では ORA12C_VERIFY_FUNCTION が推奨 |
| 19c | 180 | 同上 |
| 21c / 23c | 180 | 同上 |
10g → 11g 以降にアップグレードすると有効期限が有効化される
10g では PASSWORD_LIFE_TIME = UNLIMITED がデフォルトでしたが、11g 以降は 180 日に変更されました。アップグレード後にユーザーが突然 ORA-28001 になるのはこれが原因です。アップグレード前にプロファイルの設定を確認してください。
10g では PASSWORD_LIFE_TIME = UNLIMITED がデフォルトでしたが、11g 以降は 180 日に変更されました。アップグレード後にユーザーが突然 ORA-28001 になるのはこれが原因です。アップグレード前にプロファイルの設定を確認してください。
実務パターン集
パターン(1): 開発環境の全ユーザーを一括で UNLIMITED にする
SQL
-- 開発用プロファイルを作成
CREATE PROFILE dev_unlimited LIMIT
PASSWORD_LIFE_TIME UNLIMITED
FAILED_LOGIN_ATTEMPTS UNLIMITED;
-- DEFAULT プロファイルの全ユーザーを一括変更
BEGIN
FOR rec IN (
SELECT username FROM dba_users
WHERE profile = 'DEFAULT'
AND account_status NOT LIKE '%LOCKED%'
AND username NOT IN ('SYS','SYSTEM','ANONYMOUS','XDB','DBSNMP','AUDSYS')
) LOOP
EXECUTE IMMEDIATE 'ALTER USER ' || rec.username || ' PROFILE dev_unlimited';
END LOOP;
END;
/
パターン(2): 期限切れユーザーを一括復旧する
SQL
-- EXPIRED 状態のユーザーを一覧 SELECT username, account_status, expiry_date FROM dba_users WHERE account_status LIKE '%EXPIRED%' ORDER BY expiry_date; -- 一括でパスワードを再設定 + アンロック -- 注意: パスワードは個別に設定する必要がある ALTER USER hr IDENTIFIED BY temp_password ACCOUNT UNLOCK; ALTER USER dev_user IDENTIFIED BY temp_password ACCOUNT UNLOCK;
パターン(3): アプリケーション接続ユーザーの期限切れ防止
SQL
-- アプリケーション接続用ユーザー専用プロファイル
CREATE PROFILE app_service_profile LIMIT
PASSWORD_LIFE_TIME UNLIMITED -- 期限なし
FAILED_LOGIN_ATTEMPTS 10 -- ブルートフォース対策は維持
PASSWORD_LOCK_TIME 1/24; -- 1 時間ロック
ALTER USER app_user PROFILE app_service_profile;
-- アプリケーションユーザーは人間がログインしないため
-- パスワード期限は不要だが、ロック設定は維持する
本番環境で UNLIMITED にするリスク
| リスク | 詳細 | 緩和策 |
|---|---|---|
| パスワード漏洩の長期化 | 漏洩したパスワードが無期限で有効 | 定期的な手動変更を運用ルールで強制 |
| コンプライアンス違反 | PCI DSS / SOX / ISMS ではパスワードの定期変更が要求される | 要件に合った PASSWORD_LIFE_TIME を設定(90 日等) |
| 監査指摘 | セキュリティ監査で UNLIMITED 設定が指摘される | 本番は期限あり、開発のみ UNLIMITED に分離 |
| 退職者のアカウント放置 | 期限切れが通知されないため放置されやすい | アカウント棚卸しの定期実施 |
本番環境では UNLIMITED を避ける
本番環境ではパスワード有効期限(90 日〜180 日)を設定し、定期的なパスワード変更を強制することがセキュリティの基本です。UNLIMITED は開発・検証環境、またはアプリケーション接続用ユーザーに限定してください。
本番環境ではパスワード有効期限(90 日〜180 日)を設定し、定期的なパスワード変更を強制することがセキュリティの基本です。UNLIMITED は開発・検証環境、またはアプリケーション接続用ユーザーに限定してください。
よくある質問
QALTER PROFILE DEFAULT LIMIT … を実行した後、すぐに反映されますか?
Aはい、即時反映されます。DB の再起動は不要です。ただし、既に EXPIRED 状態のユーザーは
ALTER USER ... IDENTIFIED BY ... でパスワードを再設定するまでログインできません。Qパスワードを変更せずに有効期限だけリセットしたいのですが
AOracle の仕様上、パスワードの再設定なしに有効期限だけをリセットすることはできません。
ALTER USER ... IDENTIFIED BY 同じパスワード で同じパスワードを再設定すれば期限はリセットされますが、PASSWORD_REUSE 制限がある場合は拒否されます。根本的にはプロファイルの PASSWORD_LIFE_TIME を UNLIMITED に変更するのが確実です。Q特定のユーザーだけ有効期限を変更できますか?
Aはい。カスタムプロファイルを作成して特定ユーザーに適用します。
DEFAULT プロファイルを変更せずに済むため、他ユーザーに影響しません。
CREATE PROFILE my_profile LIMIT PASSWORD_LIFE_TIME UNLIMITED;ALTER USER target_user PROFILE my_profile;DEFAULT プロファイルを変更せずに済むため、他ユーザーに影響しません。
QEXPIRED(GRACE) 状態のユーザーはログインできますか?
Aログインできますが、ORA-28002 の警告メッセージが表示されます。猶予期間(PASSWORD_GRACE_TIME、デフォルト 7 日)内にパスワードを変更しないと、完全に EXPIRED になり ORA-28001 でログインできなくなります。
QPASSWORD_VERIFY_FUNCTION とは何ですか?
Aパスワードの複雑性チェック関数です。長さ・大文字小文字・数字・特殊文字の要件を検証します。Oracle が提供する関数(
ORA12C_VERIFY_FUNCTION / ORA12C_STRONG_VERIFY_FUNCTION)を使うか、独自の PL/SQL 関数を作成できます。NULL(デフォルト)の場合はチェックなしで任意のパスワードが設定可能です。QSYS / SYSTEM ユーザーもパスワード期限の対象ですか?
Aはい。SYS / SYSTEM も DEFAULT プロファイルが適用されるため、PASSWORD_LIFE_TIME の対象です。ただし
SYSDBA 権限でのログイン(sqlplus / as sysdba)はパスワード認証をバイパスするため、期限切れでもログイン可能です。通常のパスワード認証(sqlplus sys/password)は期限切れの影響を受けます。まとめ
パスワード有効期限の設定の要点をまとめます。
| やりたいこと | SQL |
|---|---|
| 現在の設定を確認 | SELECT resource_name, limit FROM dba_profiles WHERE profile=’DEFAULT’ AND resource_type=’PASSWORD’ |
| DEFAULT プロファイルの期限を UNLIMITED に | ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED |
| 特定ユーザーだけ UNLIMITED に | CREATE PROFILE dev LIMIT PASSWORD_LIFE_TIME UNLIMITED; ALTER USER u PROFILE dev |
| 期限切れユーザーの復旧 | ALTER USER u IDENTIFIED BY pw ACCOUNT UNLOCK |
| ユーザーの期限状態を確認 | SELECT username, account_status, expiry_date FROM dba_users |
| 本番用プロファイル(90 日期限) | CREATE PROFILE prod LIMIT PASSWORD_LIFE_TIME 90 PASSWORD_GRACE_TIME 7 … |
プロファイルの全パラメータの詳細は「ユーザープロファイル完全ガイド」、ユーザーの作成と権限付与は「ユーザー作成と権限付与の完全ガイド」も併せて参照してください。

