Oracle 11gのパスワード大文字・小文字の区別

Oracle Databaseは11gから、パスワード文字列の大文字と小文字をデフォルトで区別する仕様になった。セキュリティの観点で考えればこれは当然好ましい仕様ではあり、Oracle社もこの動作をそのまま変更せず使用することを推奨している。ただ、実際のシステム開発・構築の現場では既存のアプリケーションでパスワード文字列がハードコードされている場合があったり、クラサバ型システムにおいて多数のクライアント端末に大/小文字を区別されずに設定されたパスワードがある場合など、Oracle側でパスワードの大/小文字区別をすることが必ずしも嬉しくないケースもある。今回はそんな場合の対処方法に関する備忘録。

まず、Oracle 11gにおけるパスワード大/小文字を区別に関わる要素としては、Oracleのパスワードファイル(orapwファイル)と初期化パラメータ「SET SEC_CASE_SENSITIVE_LOGON」の2つとなる。一般ユーザの場合には初期化パラメータのみで問題ないが、SYSDBA、SYSOPERの特権ユーザの場合には、初期化パラメータの変更だけでは不十分なため、パスワードファイルでの対応も必要になる。では、具体的な手順を以下にまとめていく。

【手順1】パスワードファイルの確認と再作成
パスワード・ファイルを使用している場合は、IGNORECASEパラメータを「Y」に設定して作成したことを確認する。パスワードファイルのIGNORECASEパラメータにより、後述で変更する初期化パラメータ SEC_CASE_SENSITIVE_LOGON の設定値は上書きされる。デフォルトでは、IGNORECASEはパスワードの大/小文字を区別することを意味する「N」に設定される。要するに、OraleデフォルトのDBA認証方式であるパスワードファイル認証を使う場合には、SYSDBA・SYSOPERの特権ユーザに対するパスワード文字列の大/小文字区別をしないように設定するにはパスワードファイルのIGNORECASEパラメータを Y に設定する方法しかない、ということ。

既存のパスワードファイルがIGNORECASE=Nで作成されている場合は、既存のファイルを削除し、新たにパスワードファイルを作成することでファイルを置換すればよい。手順は以下の通り。

  1. V$PWFILE_USERSビューを問い合せて、どのユーザーがSYSDBAまたはSYSOPER権限を持っているかを確認
  2. データベースを停止する
  3. 既存のパスワード・ファイルを削除
  4. ORAPWDユーティリティを使用し、IGNORECASE=Yでパスワード・ファイルを新規作成
    例)ORAPW FILE=PWDORCL.ora IGNORECASE=Y
  5. 必要に応じ、SYSDBA・SYSOPER特権をユーザーに追加(SYSで接続しDB起動後にコマンド実行)
    例)SQL> GRANT SYSDBA TO oe;

【手順2】初期化パラメータの変更
続いて、ALTER SYSTEM文で初期化パラメータSEC_CASE_SENSITIVE_LOGONの値を変更(デフォルトはTRUE)。

SQL> ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE
このパラメータの変更で、11g環境で作成された全てのユーザーについて、パスワード文字列の大/小文字の区別が行われなくなる。前述のパスワードファイルの部分を省略すると、SYSDBA/SYSOPER権限のユーザーを除く一般ユーザーのみ大/小文字の区別が行われない状態となるので注意すること。

【補足】下位バージョンから移行したユーザーの扱い
最後に、11g以前のバージョンの環境で利用されていたユーザーがある場合に、環境移行によりどのような影響が出るかについても触れておく。10gまでは、パスワードは大/小文字が区別されなかった。このため、下位バージョンの環境から11g環境へユーザーアカウントをインポートした場合、そのアカウントの大/小文字が区別されないパスワードは、ユーザーがパスワードを変更するまで大/小文字が区別されないことになる。SYSDBAまたはSYSOPER権限が付与されているアカウントは、パスワード・ファイルにインポートされる。以前のリリースからのユーザー・アカウントのパスワードを変更すると、そのパスワードは大/小文字が区別されるようになる。

大/小文字の区別があるパスワード、または大/小文字の区別がないパスワードが設定されているユーザーを検索するには、DBA_USERSビューを確認すればよい。このビューのPASSWORD_VERSIONS列に、以下の例のようにパスワードが作成されたリリースが示される。


SQL> SELECT USERNAME,PASSWORD_VERSIONS FROM DBA_USERS;

USERNAME PASSWORD_VERSIONS
------------------------------ -----------------
JONES 10G 11G
ADAMS 10G 11G
CLARK 10G 11G
PRESTON 11G
BLAKE 10G

アカウントjones、adamsおよびclarkのパスワードは、最初にリリース10gで作成され、その後、11gで再設定されている。大/小文字の区別が有効になっている場合、これらのパスワードは、prestonのパスワードと同様に大/小文字が区別される。しかし、blakeのアカウントはリリース10g基準のままであるため、システムグローバルに大/小文字の区別を行う設定がなされた環境であっても、区別はされない。この場合は、セキュリティ強化のために、大/小文字が区別されるようにパスワードの再設定することが推奨される。