【Oracle】パスワードの有効期限を無制限にする方法|PASSWORD_LIFE_TIME・ORA-28001 対処・プロファイル設定・本番のセキュリティ考慮まで解説

【Oracle】パスワードの有効期限を無制限にする方法|PASSWORD_LIFE_TIME・ORA-28001 対処・プロファイル設定・本番のセキュリティ考慮まで解説 Oracle

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 等)の意味
・本番環境で有効期限を無制限にするリスク
スポンサーリンク

パスワード有効期限の現在の設定を確認する

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 に変更してください。

パスワード有効期限を 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 インスタンスの場合、本番ユーザーのセキュリティが低下するリスクがあります。特定ユーザーだけ変更したい場合は、次のカスタムプロファイルを使ってください。

方法(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 プロファイルを変更せず、カスタムプロファイルで制御するのがベストプラクティスです。

方法(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 の場合、以前と同じパスワードをすぐに再設定できます。本番環境では片方または両方に制限を設定し、パスワードの使い回しを防止してください。

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 になるのはこれが原因です。アップグレード前にプロファイルの設定を確認してください。

実務パターン集

パターン(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 は開発・検証環境、またはアプリケーション接続用ユーザーに限定してください。

よくある質問

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はい。カスタムプロファイルを作成して特定ユーザーに適用します。
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 …

プロファイルの全パラメータの詳細は「ユーザープロファイル完全ガイド」、ユーザーの作成と権限付与は「ユーザー作成と権限付与の完全ガイド」も併せて参照してください。