※ 本記事は2017年5月31日に公開されたものです。

セキュリティ関連の初期化パラメータの説明の6回目です。
長かったこのシリーズもいよいよ最終回です。

 

11gR1から追加されたパラメータです。正常でないパケットを受け取った時の挙動を設定します。11gのデフォルト値はCONTINUEで、継続して正常なパケットを待ち続ける動作です。この状態ではデータベースサーバーは不正なパケットによってサービス妨害(DoS)攻撃を受ける可能性があります。12cからはデフォルト値が(DROP,3)に変更になりました。この場合、累積3つ正常でないパケットを受信すると、接続を強制的に切断します。サービス妨害(DoS)攻撃からサーバーを保護できますが、ネットワークが不安定な環境など、正規の通信でもパケットが壊れてしまった場合などは、強制切断されますのでトランザクションの再実行が必要などアプリケーションに影響がでる可能性もあります。通信が安定している環境では、12cのデフォルト値を利用することを推奨します。詳細は「不正パケット受信後のサーバー実行の制御」も併せてご確認ください。

11gR1から追加されたパラメータです。正常でないパケットを受け取った時の挙動を設定します。デフォルト値はTRACEでデバッグをおこなうための詳細なトレースファイルが出力されます。不正なパケットが多くトレースファイルがストレージを圧迫することがなければ、デフォルトの値を利用することを推奨します。詳細は「プロトコル・エラーによってデータベースで受信した不正パケット」も併せてご確認ください。

11gR1から追加されたパラメータです。認証中のクライアントに対してデータベースの詳細なバージョンを戻さないように設定できます。デフォルト値はFALSEで詳細なバージョン(PSRレベル)を戻しません。特別な理由がない限りはデフォルトの設定を利用することを推奨します。なお、SQL*Plusでは未認証時にデータベースのバージョンをクライアントに表示しない(認証が成功して初めて接続したデータベースのバージョンを表示する)ため、簡単にこのパラメータによる挙動の変更を確認することはできませんでした。詳細は「データベース・バージョン・バナーの表示構成」も併せてご参照ください。

Oracle Databaseでは、表に対してSELECT権限を持っていなくても、UPDATE、DELETE権限を持っている場合、UPDATE、DELETE文のWHERE句やSET句の中で暗黙的に表を参照することができました。しかし、この仕様はSQLの標準であるSQL92から外れていました。今までのオラクルのポリシーを適用するか、SQL92の標準に従うかをこのパラメータで制御できます。12cR2からデフォルト値がTRUEに変更になりました。設定がTRUEの場合、UPDATEやDELETEのWHERE句やSET句で表を参照する場合にはSELECT権限も併せて持つことが必要になります。12cR1までのデフォルト値であるFALSEの場合にはSELECT権限がなくてもUPDATEやDELETEのWHERE句やSET句で表を参照することができます。以下に簡単な例を示します。
まず、住所録を格納したAPP.ADDRBOOK表があるとします。表の定義は以下の通りです。

SQL> desc app.addrbook
 名前                     NULL?    型
 ------------------------ -------- ----------------
 ID                       NOT NULL NUMBER
 KANA_NAME                         VARCHAR2(64)
 SEX                               VARCHAR2(8)
 PHONE                             VARCHAR2(16)
 MAIL                              VARCHAR2(64)
 ZIP                               VARCHAR2(8)
 ADDRESS                           VARCHAR2(128)
 BIRTHDAY                          VARCHAR2(16)

ユーザーはこの表に対して、SELECT権限は持っていないが、UPDATE権限を持っているとします。そのため、APP.ADDRBOOK表に対するSELECT文は権限不足エラーとなります。

SQL> select * from app.addrbook;
select * from app.addrbook
                  *
行1でエラーが発生しました。:
ORA-01031: 権限が不足しています。


ここで、以下のようなUPDATE文を発行してみます。

SQL> update app.addrbook set KANA_NAME='' where SEX='男';

57行が更新されました。

SQL92_SECURITY=FALSEの設定の場合、このSQL文は正常に実行できます。
ユーザーはAPP.ADDRBOOK表のデータを検索する権限はありませんが、この表には男性のデータが57件入っていることは分かってしまします。WHERE句でさらに条件を絞った問い合わせを実行することでどのようなデータが表に格納されているか推測することができてしまいます。これが推測攻撃と呼ばれるものです。SQL92_SECURITYをTRUEに設定しておけば、このようなUPDATE文をエラーで実行できないようにすることができます。
検索はできないようにしたいけど、更新はできるようにしたいというような特別な要件がない場合には、12cR2からのデフォルトのTRUEを設定することを推奨します。

12cR1で新しく追加されたパラメータですが、12cR2で非推奨となり、下位互換のために残されているパラメータです。
12cR1では、監査レコードはCommon Logging Infrastructure(CLI0の仕組みであるSGAキューを利用していました。このパラメータはそのキューのサイズを指定するものでしたが、12cR2からはデータベースの異常終了時の監査レコードのロスト防止とパフォーマンス向上のエンハンスのためSGAキューを利用しないようになりました。12cR2ではこのパラメータが設定されていないことを確認してください。

UTL_FILEなどのPL/SQLパッケージプロシージャでファイルをI/Oするディレクトリを指定するパラメータですが、12cR2から非推奨となりました。このパラメータで指定したディレクトリのファイルはすべてのデータベースユーザーからPL/SQLパッケージプロシージャ経由で読み書き可能となりますので、注意が必要です。利便性のために「*(アスタリスク、すべてのディレクトリでファイルI/O許可)」の設定をしているシステムをよく見かけますが、最悪データファイルを上書きされ、データベースが破壊されてしまう危険性もありますので、指定するディレクトリには細心の注意が必要です。なお、UTL_FILEの代わりにデータベースユーザーごとに読み取り、書き込みなどの権限を詳細に設定できるディレクトリオブジェクトを利用するようにしてください。なお、古くは9iR2のマニュアルでも「UTL_FILE_DIRでなくCREATE DIRECTORY機能を使用してください」という記載があります。

  • _TRACE_FILES_PUBLIC

SQLトレースなどのダンプのOSファイルのパーミッションはデフォルトではOSグループ以外のユーザー(others)からは読み書きできないようになっています。これはトレースファイルの中にデータベースの攻撃に利用できる情報やデータ自体が含まれている可能性があるからです。ただし、このパラメータを明示的にTRUEに設定することで、利便性のためにすべてのOSユーザーからトレースファイルにアクセスできるようにすることができます。特別な要件がない場合にはパラメータを設定しないようにしてください。

初期化パラメータを見るだけでも、Oracle Databaseがバージョンが上がるごとに新しいセキュリティ機能が追加されたり、より安全な初期設定に変更されてきていることが分かります。Oracle Databaseのバージョンアップは機能追加や性能向上だけではなく、セキュリティの向上にも寄与しています。

「もくじ」にもどる