こんにちは、カメ助(@kamesuke_blog)です。
業務でOracleDBアクセス時に「ORA-28001:パスワードが有効期限切れです。」のエラーに遭遇しました。自分なりに対処方法について調べたので共有します。
この記事はこんな人にオススメ
・Oracleのパスワード有効期限切れを解消したい
・パスワード有効期限切れにならないようにしたい
今回の記事では、2つのポイントについて具体的にわかりやすくお伝えします。
- 対処方法:Oracleのパスワード変更
- 再発防止策:Oracleのパスワード有効期限を無期限に変更
Oracleの「ORA-28001:パスワードが有効期限切れです。」のエラーに遭遇した人は、ぜひ今回の記事を参考に対応してみて下さい!
対処した環境
対処した環境は以下の通りです。
- Windows環境
- Oracleのバージョンは18c
- TESTユーザーがパスワードの有効期限切れになっている
対処方法
対処手順は以下の通りです。
以降の作業を行うための準備を行います。
DBのバージョンがOracle 12c以降の場合は、この対応が必要になります。
※Oracle 11g以前の場合は対応不要です。
ユーザのパスワードを再設定することで、有効期限を更新します。
STEP3の対応でDB接続できない場合は、アカウントがロックされているため本対応が必要です。
※STEP3の対応後にDB接続できる場合は対応不要です。
再発防止のためにパスワード有効期限を無制限にします。
コマンドプロンプトで【sqlplus】を起動・接続[1/5]
まず、「ORA-28001:パスワードが有効期限切れです。」のエラーが発生しているということは、文字の通り対象ユーザーのパスワードの有効期限が切れているためにロックがかかっている状態になっています。
そのため、DB管理者用のアカウントであるsystemユーザーでOracleにアクセスし、対象ユーザーのパスワード更新する必要があります。
まずは、OracleのDBに接続するために「SQL*PLUS」を起動しましょう。
簡単に言うと、Oracleに対して処理を実行するためのツールです。(コマンドラインで操作します。)
Oracle DBのインストール時にセットで「SQL*PLUS」もインストールされています。
具体的には、コマンドプロンプトを起動して「sqlplus」と入力します。その後、systemユーザーで接続します。
※Windows環境で説明しています。Mac環境の方はこちらを参考に「SQL*PLUS」を導入してください。
以下は実際の作業画面ですので参考にしてください。
プラガブル・データベース(PDB)への切り替え[2/5]
本項目は、Oracle12c以降のバージョンの場合に対応が必要な項目です。Oracle11g以前のバージョンの場合は対応不要ですので、「エラーでログインできないユーザのパスワードを再設定する[3/5]」に進んでください。
前提知識
前提知識として、Oracle12c以降は「マルチテナント・アーキテクチャ」というDBの中に複数のDBを持つ仕組みに変更されました。コンテナ・データベース(CDB)と呼ばれるDBの中に、複数のプラガブル・データベース(PDB)を持ちます。
CDBにはユーザーは作成できず、PDBにユーザーを作成します。
イメージとしてはこんな感じです。
上記より、Oracle12c以降のバージョンでは、最初に「CDB」に接続しているので「PDB」に切り替える必要があります。
自分は「CDB」に接続していることに気づくまでにかなりの時間を要しました(汗)。皆さんも気を付けてください。
現在の接続先が「CDB」/「PDB」を確認
前提知識より、2つのDB(「CDB」/「PDB」)が存在することが分かりましたね。そのためにまずは、現在「CDB」と「PDB」のどちらに接続しているか確認します。
SQL*PLUSで「show con_name」と入力します。
1 2 3 4 5 |
SQL> show con_name CON_NAME -------------------- CDB$ROOT |
上記のように「CDB$ROOT」と表示される場合は、コンテナ・データベース(CDB)に接続しています。
接続先を「PDB」に変更
先ほどの手順で「CDB」に接続していることが確認できました。そのため、「PDB」へ接続を変更します。
以下のコマンドで「XEPDB1」というPDBに切り替えます。
1 |
SQL> alter session set container =XEPDB1; |
確認のため、再度「show con_name」と入力します。
1 2 3 4 5 |
SQL> show con_name CON_NAME --------------------- XEPDB1 |
上記のように「XEPDB1」と表示される場合は、プラガブル・データベース(PDB)の「XEPDB1」に接続しています。
「PDB」に対象ユーザーが含まれるか確認
「PDB(XEPDB1)」に接続できていることが確認できたので、対象のユーザーが含まれているか確認します。
SQL*PLUSで以下のSQLを実行します。
1 2 3 4 5 6 7 8 9 10 |
SQL> select username from all_users order by username; USERNAME ----------------------------- GSMCATUSER GSMUSER HR … ORDDATA TEST |
「USERNAME」に対象ユーザー名(TEST)が表示されることを確認できたら、パスワードの再設定を行います。
※今回はTESTユーザーを対象として説明します。
TESTユーザのパスワードを再設定する[3/5]
「PDB」に接続し、TESTユーザーが存在することが確認できました。次は、TESTユーザーのパスワードを再設定します。
パスワードを再設定することで、有効期限切れ状態が解除されます。
SQL*PLUSにて、以下のコマンドでユーザーのパスワードを再設定ができます。
1 |
SQL> alter user [ユーザー名] identified by [パスワード]; |
TESTユーザーの場合は以下のコマンドになります。
1 |
SQL> alter user TEST identified by ********; |
設定後にTESTユーザーでOracleDBに接続できるか確認します。接続できる場合は、パスワードの有効期限を無期限にする[5/5]に進んでください。もし、接続できない場合はアカウントロックされている可能性が高いので、次の手順でアカウントがロックを解除します。
ロックされているアカウントのロックを解除する[4/5]
アカウントがロックされている場合は、以下のコマンドで対象ユーザーのロックを解除します。
1 |
SQL> alter user [ユーザー名] account unlock; |
TESTユーザーの場合は以下のコマンドになります。
1 |
SQL> alter user TEST account unlock; |
TESTユーザーでOracleDBに接続できると思いますので確認しましょう。
以上でパスワード変更の手順は終了です。引き続き、再発防止のための対応を行います。
パスワード有効期限を無期限にする[5/5]
先ほどまでの対応で「Oracleのパスワード有効期限切れ」が解消しました。しかし、そのままにしておくと180日後に再び「Oracleのパスワード有効期限切れ」が発生します。その際に、再び同じ作業を行うのは非常に面倒ですよね。
そこで、再発防止策としてパスワード有効期限を無制限にします。
パスワード有効期限の確認
まず、TESTユーザーのパスワード有効期限を確認します。SQL*PLUSにて以下のコマンドでTESTユーザーの情報を確認します。(dba_usersテーブルを参照)
1 |
SQL> select username,profile from dba_users where username = 'TEST'; |
データ取得結果
USERNAME | PROFILE |
---|---|
TEST | DEFAULT |
PROFILEは、Oracleのユーザに対して制限をかけるための設定がされたものです。
PROFILEには「パスワード」と「リソース」の2種類あります。今回は、パスワードに関するPROFILEが対象です。
TESTユーザーのPROFILEの設定値がDEFAULTになっていることが分かりました。
続いて、以下のSQLで、PROFILEがDEFAULTに設定されているパスワード有効期限を確認します。
1 |
SQL> select * from dba_profiles where resource_name = 'PASSWORD_LIFE_TIME' and profile = 'DEFAULT'; |
データ取得結果(抜粋)
PROFILE | RESOURCE_NAME | RESOURCE_TYPE | LIMIT |
---|---|---|---|
DEFAULT | PASSWORD_LIFE_TIME | PASSWORD | 180 |
データ取得結果より、「LIMIT=180」になっているので、パスワードの有効期限が180日になっていることが分かります。この値を変更することで、有効期限を変更できます。有効期限を無制限にする場合は、値に「UNLIMITED」を指定します。
パスワード有効期限を無期限に変更
パスワードの有効期限を無制限にするために、以下のSQLを実行します。
1 |
SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; |
以上でOracleのユーザーのパスワード有効期限を無制限にしました。
まとめ・考察
今回は、Oracleの「ORA-28001:パスワードが有効期限切れです。」の対処方法と再発防止方法について具体的に説明していきました。
なぜ本現象が起こるのかについて調べてみたところ、Oracle10gまではパスワードの有効期限が無期限でした。しかし、Oracle11g 以降では、パスワードの有効期限が180日がデフォルトに仕様変更されています。
そのため、元々Oracle10gでシステムを構築していたが、動作保証バージョンの更新などによってOracle11g以降にバージョンアップ後に180日経過して本現象に出くわす方が多いです。
Oracle11gでのパスワード有効期限(180日)設定について、仕様変更の背景について調べると、セキュリティ対策の一環でデフォルトのパスワード有効期限(180日)が設定されたそうです。確かに、長期間同じパスワードのままだとセキュリティの観点で非常にリスクがあります。
今回の対応のように、パスワードを無期限に設定するとセキュリティリスクが高まります。そのため、パスワードの有効期限を無期限にする場合、パスワードを推測されない堅牢なものに設定しておく必要がありますので、併せて検討してみてください。
PS:大体このエラーに遭遇するときに限って、納期間際などで時間がなかったりして焦ります(汗)
教訓:Oracleのインストール時に、パスワードの有効期限を変更しておこう!!
SQLの勉強にはこの本がオススメですよ。
コメント