第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 をどのように設定するかを設計し、構築時点でその設計内容を基に構築することを推奨します。
また、設計としてパスワードの有効期限を使用することとした場合には、それに合わせた運用設計も適切に実施することを推奨します。