第21回:DB作成時の初期セキュリティ設定 ~DEFAULT PROFILE と undopwd.sql (19c でファイルがなくなった際の対応方法)~

技術者向け・データベースの技術情報発信

はじめに

以下のような事象に遭遇したことはないでしょうか。

  • Oracle のデータベースユーザのパスワードがわからなくなってしまい色々と試していたらユーザがロックされてしまった
  • Oracle データベースを作成してしばらくしたら突然正しいパスワードを入れているにもかかわらず「パスワードが期限切れです。」というメッセージとともに接続できなくなってしまった

これは、Oracle データベースの PROFILE によってデフォルトで設定されている動作となります。
PROFILE には、ユーザ毎のリソース(CPU/メモリ等)を制限する機能と、ユーザのログインパスワードを制限する機能の2つがありますが、本記事では後者について解説します。

PROFILEの項目

PROFILE の内容は以下で確認することができます。

SELECT PROFILE, RESOURCE_NAME, RESOURCE_TYPE, LIMIT
FROM DBA_PROFILES
WHERE PROFILE = 'DEFAULT' AND RESOURCE_TYPE = 'PASSWORD'
ORDER BY RESOURCE_NAME ;

結果は以下のようになります。

PROFILE              RESOURCE_NAME                  RESOURCE LIMIT
-------------------- ------------------------------ -------- --------------------
DEFAULT              FAILED_LOGIN_ATTEMPTS          PASSWORD 10
DEFAULT              INACTIVE_ACCOUNT_TIME          PASSWORD UNLIMITED
DEFAULT              PASSWORD_GRACE_TIME            PASSWORD 7
DEFAULT              PASSWORD_LIFE_TIME             PASSWORD 180
DEFAULT              PASSWORD_LOCK_TIME             PASSWORD 1
DEFAULT              PASSWORD_REUSE_MAX             PASSWORD UNLIMITED
DEFAULT              PASSWORD_REUSE_TIME            PASSWORD UNLIMITED
DEFAULT              PASSWORD_VERIFY_FUNCTION       PASSWORD NULL

連続ログイン失敗時のロック

FAILED_LOGIN_ATTEMPTS の回数だけ「連続で」パスワードを間違えた場合にロックされ、そのロックは PASSWORD_LOCK_TIME の日数だけ継続されます。

デフォルトの設定の場合、10回連続で間違えると 1日(24時間) ロックとなります。

パスワード有効期限

ユーザ作成後 PASSWORD_LIFE_TIME 日経過するとパスワードが無効になります。
その後 PASSWORD_GRACE_TIME 日であれば、警告が出てログインは可能ですが、その期間内にパスワードを変えないとログイン不可となります。

アプリケーションからの接続時、このメッセージ(ORA-28002 , ORA-28001) に対するハンドリングがなされていない場合には、PASSWORD_LIFE_TIME 経過時点でエラーとして処理されてしまう可能性があります。

制限解除方法

それぞれ、以下のSQLにて制限の解除が可能です。

連続ログイン失敗時のロックを行わないようにする

ALTER PROFILE DEFAULT LIMIT
FAILED_LOGIN_ATTEMPTS UNLIMITED
PASSWORD_LOCK_TIME UNLIMITED;

パスワードの有効期限を無期限にする

ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_GRACE_TIME UNLIMITED;

上記2つの実行をした後に PROFILE を確認すると以下の通りとなります。

PROFILE              RESOURCE_NAME                  RESOURCE LIMIT
-------------------- ------------------------------ -------- --------------------
DEFAULT              FAILED_LOGIN_ATTEMPTS          PASSWORD UNLIMITED
DEFAULT              INACTIVE_ACCOUNT_TIME          PASSWORD UNLIMITED
DEFAULT              PASSWORD_GRACE_TIME            PASSWORD UNLIMITED
DEFAULT              PASSWORD_LIFE_TIME             PASSWORD UNLIMITED
DEFAULT              PASSWORD_LOCK_TIME             PASSWORD UNLIMITED
DEFAULT              PASSWORD_REUSE_MAX             PASSWORD UNLIMITED
DEFAULT              PASSWORD_REUSE_TIME            PASSWORD UNLIMITED
DEFAULT              PASSWORD_VERIFY_FUNCTION       PASSWORD NULL

Oracle 19c での undopwd.sql について

ここまでの記載を読まれた方の中には「undopwd.sql を実行すればよいのでは?」と気付かれた方もいらっしゃると思います。

Oracle18c までは Oracle をインストールしたディレクトリ/rdbms/admin の中にundopwd.sql というSQLがあらかじめ準備されており、このSQLを実行するとPASSWORD_LOCK_TIME , PASSWORD_LIFE_TIME , PASSWORD_GRACE_TIME を一括で UNLIMITED に変更することが可能でしたが、Oracle19c ではこのSQL自体が Oracle をインストールしたディレクトリから無くなっています。

Oracle18c

$ ls -l $ORACLE_HOME/rdbms/admin/undoaud.sql
-rw-r--r--. 1 oracle18 oinstall 1519 May 29  2017 /app/oracle18/product/18.1.0/dbhome_1/rdbms/admin/undoaud.sql

Oracle19c

$ ls -l $ORACLE_HOME/rdbms/admin/undoaud.sql
ls: cannot access /app/oracle19/product/19.0.0/dbhome_1/rdbms/admin/undoaud.sql: No such file or directory

まとめ

デフォルト設定の場合、データベース作成から約半年後にロックされます。
このタイミングでのロックは業務に対し大きな影響が起きることが予想されるため、設計段階でパスワードに関する PROFILE をどのように設定するかを設計し、構築時点でその設計内容を基に構築することを推奨します。

また、設計としてパスワードの有効期限を使用することとした場合には、それに合わせた運用設計も適切に実施することを推奨します。