5 セキュリティ
この章では、データベースとデータベース・アプリケーションに組み込むセキュリティ設計の基礎について説明します。
トピック:
5.1 権限の付与、ロール、最小限の権限によるユーザー・アクセスの有効化
この項では、権限とロールをユーザーに付与し、データへのアクセスを制限する方法について説明します。また、最小限の権限という概念の重要性についても説明し、アプリケーションへのログインを試行するユーザーを自動的にフィルタする方法としてセキュア・アプリケーション・ロールについても紹介します。
ユーザー権限とは、データの更新や削除などのアクションを実行する権利です。それらのアクションを実行する権限をユーザーに付与できます。ロールとは、グループとしてまとめられた権限の名前付きコレクションです。通常は、ユーザーがそのジョブに関連する一連のタスクを実行できるようになります。たとえばclerk
というロールでは、事務員がファイルの作成、更新および削除といった作業を実行できるようになります。clerk_mgr
ロールには、clerk
ロールが含まれるうえに、事務員の経費報告書を承認したり勤務評定を管理する権限が追加されます。
ユーザーに権限を付与する際には、最小限の権限という原則を適用します。ユーザーには、必要な権限のみを付与するようにします。可能であれば、ユーザーに権限を直接付与しないようにします。かわりに、ユーザーが必要とする一連の権限を定義したロールを作成し、ユーザーにはそのロールを付与します。たとえば、データベース・セッションにログインできるように、ユーザーfred
にCREATE SESSION
権限を付与します。ただし、UPDATE TABLE
権限など、ユーザーがジョブで必要とする権限については、こうした権限を持つロールを付与します。
指定した条件を満たしている場合、ログインを試行するユーザーにロールが自動的に付与されるようにアプリケーションを設計できます。そのためには、セキュア・アプリケーション・ロールを作成します。これは、PL/SQLのプロシージャ(または複数のプロシージャを含むPL/SQLパッケージ)に関連付けられたロールです。このプロシージャによってユーザーが検証され、検証に失敗したユーザーはログインできません。ユーザーが検証を通過した場合は、プロシージャによってユーザーはロールを付与され、アプリケーションを使用できるようになります。ユーザーは、アプリケーションにログインしている間このロールを付与されます。ユーザーがログアウトすると、ロールは取り消されます。
関連項目:
例5-1では、営業時間中(午前8時から午後5時)に特定のワークステーション群からユーザーがログインできるセキュア・アプリケーション・ロールのプロシージャを示しています。これらのチェックを通過すると、ユーザーはhr_admin
というロールを付与され、アプリケーションにログインできるようになります。
例5-1 アクセスを営業時間に制限するセキュア・アプリケーション・ロールのプロシージャ
CREATE OR REPLACE PROCEDURE hr_admin_role_check AUTHID CURRENT_USER AS BEGIN IF (SYS_CONTEXT ('userenv','ip_address') BETWEEN '192.0.2.10' and '192.0.2.20' AND TO_CHAR (SYSDATE, 'HH24') BETWEEN 8 AND 17) THEN EXECUTE IMMEDIATE 'SET ROLE hr_admin'; END IF; END; /
5.2 データベース・ログインの自動化
データベース・ログインを自動化するには、アプリケーションへのログインを試行するユーザーを検証できるPL/SQLプロシージャを実行するログイン・トリガーを作成します。ユーザーがログインすると、このトリガーが実行されます。ログイン・トリガーは、ユーザーが検証を通過しなかった場合にアラートを生成したり、エラー・メッセージを表示するなど、複数のアクションを実行できます。
例5-2に、PL/SQLプロシージャを実行する単純なログイン・トリガーを示します。
例5-2 ログイン・トリガーの作成
CREATE OR REPLACE TRIGGER run_logon_trig AFTER LOGON ON DATABASE BEGIN sec_mgr.check_user_proc; END;
関連項目:
-
CREATE TRIGGER
文に関する詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください -
データベース・セッションのアプリケーション・コンテキスト・パッケージを実行するログイン・トリガーの作成方法の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください
5.3 ファイングレイン・アクセス制御によるユーザー・アクセスの制御
アプリケーションからのデータにユーザーがアクセスするレベルを制御するには、複数の方法があります。
-
Oracle Virtual Private Database (VPD): VPDでは、データベース・アクセスを行と列のレベルで制限できるポリシーを作成できます。基本的には、VPDのセキュリティ・ポリシーが適用されている表、ビューまたはシノニムに対して発行されたSQL文に対して動的な
WHERE
句がVPDによって追加されます。たとえば、ユーザーが
SELECT * FROM OE.ORDERS
文を入力すると仮定します。VPDポリシーは、かわりにこの文を次の文に変換し、オーダーを所有する営業担当者のみがこのデータを表示できるようにします。SELECT * FROM OE.ORDERS WHERE SALES_REP_ID = SYS_CONTEXT('USERENV','SESSION_USER');
-
Oracle Data Redaction: Oracle Data Redactionは、ユーザーがデータへのアクセスを試行するとき(つまり、問合せの実行時)に、実行時のデータをマスクします。この方法は、データが常に変化する動的な本番システムで効果を発揮します。データをリダクションするときは、すべてのデータ処理が通常どおりに実行され、バックエンドの参照整合性制約が保持されます。通常、クレジット・カード番号や社会保障番号などの機密データをリダクションします。
データは次の方法でマスクできます。
-
完全なリダクション。データ全体をマスクします。たとえば、37828224という数字はゼロとして表示できます。
-
部分的なリダクション。データの一部のみをリダクションします。このタイプでは、37828224という数字を*****224として表示できます。
-
ランダム・リダクション。データはランダム化されたデータとして表示されます。この場合、37828224という数字を93204857として表示できます。
-
正規表現。検索パターンに基づいてデータをリダクションできます。完全または一部のいずれのリダクションでも正規表現を使用できます。たとえば、ドメインのみが表示されるように電子メール・アドレスのユーザー名をリダクションできます(電子メール・アドレス
jsmith@example.com
のjsmith
を[リダクション]
に置き換えて、[リダクション]@example.com
と表示するなど)。 -
リダクションなし。リダクション・ポリシーが定義された表に対する問合せの結果に影響を与えずに、ポリシーの内部動作をテストできます。このオプションを使用して、リダクション・ポリシー定義を本番環境に適用する前にテストできます。
-
-
Oracle Label Security: Oracle Label Securityを使用すると、データベース表を行レベルで保護でき、サイトのニーズに応じて行を様々なセキュリティ・レベルに割り当てることができます。非常に機密性の高いデータを含む行には
HIGHLY SENSITIVE
というラベルを割り当て、機密性がそれほど高くないデータを含む行にはSENSITIVE
というラベルを割り当てたりできます。すべてのユーザーがアクセスできる行にはPUBLIC
というラベルを割り当てます。ラベルは必要なだけ作成でき、使用する環境のセキュリティ要件に適合させることができます。たとえば、低レベル従業員のユーザー
fred
がログインすると、PUBLIC
ラベルで定義されているように、すべてのユーザーが使用できるデータのみが表示されます。ただし、そのディレクタhortensia
がログインすると、HIGHLY SENSITIVE
ラベルを割り当てられている機密データをすべて表示できます。 -
Oracle Database Vault: Oracle Database Vaultでは、データへの管理アクセスを制限できます。デフォルトでは、管理者(
SYSDBA
権限を持つユーザーSYS
など)は、データベースのデータすべてにアクセスできます。管理者は通常、パフォーマンス・チューニング、バックアップとリカバリなどのタスクを実行する必要があります。ただし、ユーザーの給与レコードにアクセスする必要はありません。Database Vaultを使用すると、管理者のアクションを制限しつつ、通常の管理アクティビティの実行を妨げないようなポリシーを作成できます。たとえば典型的なDatabase Vaultポリシーの場合、管理者は
HR.EMPLOYEES
表にアクセスして変更できません。管理者がログインできる時間の制限、使用できるコンピュータ、動的ツールを使用してデータベースにログインできるかどうかなどの制限を課す微調整済のポリシーを作成できます。さらに、管理者がポリシー違反を試行した場合にアラートを生成するポリシーを作成できます。
関連項目:
-
Oracle Virtual Private Databaseの詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください
-
Oracle Data Redactionの詳細は、『Oracle Database Advanced Securityガイド』を参照してください。
-
Oracle Label Securityの詳細は、『Oracle Label Security管理者ガイド』を参照してください。
-
Oracle Database Vaultの詳細は、『Oracle Database Vault管理者ガイド』を参照してください。
-
ファイングレイン・アクセス・コントロール機能すべてに関するチュートリアルは、『Oracle Database 2日でセキュリティ・ガイド』を参照してください
5.4 プロシージャとファンクションに対する実行者の権限と定義者の権限の使用
5.4.1 実行者の権限と定義者の権限の概要
プロシージャまたはファンクション(つまりプログラム・ユニット)を作成するときには、所有者(自分)の権限と、それを呼び出す人の権限のどちらかで実行されるように設計できます。定義者の権限は、所有者の権限を使用してプログラム・ユニットを実行し、実行者の権限は実行する人の権限を使用してプログラム・ユニットを実行します。たとえばユーザーharold
が、表orders
を更新するプロシージャを作成すると仮定します。ユーザーharold
は、このプロシージャに対するEXECUTE
権限をユーザーhazel
に付与します。harold
が定義者の権限でプロシージャを作成した場合、そのプロシージャはorders
表がharold
のスキーマにあると想定します。実行者の権限でプロシージャを作成した場合、そのプロシージャはhazel
のスキーマでorders表を検索します。
プログラム・ユニットを定義者の権限または実行者の権限として指定するには、作成文でAUTHID
句を使用します。AUTHID
句を省略すると、プログラム・ユニットは定義者の権限で作成されます。
例5-3では、CREATE PROCEDURE
文でAUTHID
句を使用して定義者の権限または実行者の権限を指定する方法を示しています。
例5-3 定義者の権限または実行者の権限でのプログラム・ユニットの作成
CREATE PROCEDURE my_def_proc AUTHID DEFINER -- Definer's rights procedure AS ... CREATE PROCEDURE my_inv_proc AUTHID CURRENT_USER -- Invoker's rights procedure AS ...
5.4.2 実行者の権限のプロシージャとファンクションを実行するユーザーの保護
実行者の権限でプログラム・ユニットを作成するときには、実行者であるユーザーに付与する権限のレベルを考慮することが重要です。ユーザーharold
はほとんど権限を持たないランクの低い従業員であり、hazel
は多くの権限を持つエグゼクティブであると仮定します。hazel
がharold
の実行者権限のプロシージャを実行すると、このプロシージャは一時的にhazel
の権限(のすべて)を継承します。ただし、このプロシージャの所有者はharold
であるため、haroldはプロシージャを変更でき、そのときharold
を昇格するようなhazel
の権限を利用していることにhazelが気付かない可能性があります。このような事態に対する安全策として、harold
の信頼性を確認できたら、実行者権限のプロシージャおよびファンクションがその実行時にhazel
の権限を使用できるように、ユーザーhazel
はharold
に権限を付与できます。そのためには、INHERIT PRIVILEGES
権限を付与する必要があります。
例5-4では、実行者ユーザーであるhazel
がユーザーharold
にINHERIT PRIVILEGES
権限を付与する方法を示しています。
例5-4 プログラム・ユニットへのINHERIT PRIVILEGES作成権限の付与
GRANT INHERIT PRIVILEGES ON hazel TO harold;
harold
が信頼できないと判明した場合、hazel
はharoldのINHERIT PRIVILEGES
権限を取り消すことができます。
ユーザーSYS
やSYSTEM
などの管理者はINHERIT ANY PRIVILEGES
権限を持つため、これらのユーザーの実行者権限プロシージャは、どの実行者ユーザーの権限にもアクセスできます。ANY
権限と同様、この権限は信頼できるユーザーにのみ付与してください。
5.4.3 Javaストアド・プロシージャでのデフォルト権限の処理方法
デフォルトで、Javaクラス・スキーマ・オブジェクトは、設計者の権限ではなく実行者の権限で実行されます。Javaスキーマ・オブジェクトを定義者の権限で実行する場合には、loadjava
ツールを使用してロードするときに-definer
オプションを指定します。
例5-5では、loadjava
コマンドで-definer
オプションを使用する方法を示しています。
例5-5 定義者の権限でのJavaクラスのロード
loadjava -u joe -resolve -schema TEST -definer ServerObjects.jar
Password: password
-definer
オプションは、個々のクラスで使用できます。定義者が異なれば、権限も異なる可能性があります。目的の結果を得られるように、-definer
オプションは慎重に適用してください。これにより、必要以上の権限でクラスが実行されないようにできます。
5.5 アプリケーションに対する外部プロシージャの管理
セキュリティ上の理由から、Oracleの外部プロシージャはOracle Databaseから物理的に独立したプロセスで実行されます。外部プロシージャを呼び出すと、Oracle Databaseはデータベース・インスタンスのリスナーを起動したユーザーのオペレーティング・システム権限を使用してextproc
オペレーティング・システム・プロセス(エージェント)を作成します。
extproc
エージェントは、指定したオペレーティング・システムの資格証明として実行するように構成できます。この機能を使用するには、extproc
プロセスに関連付ける資格証明を定義し、それによって偽装ユーザーを認証(指定されたユーザー資格証明のかわりに実行)してから、ユーザー定義の共有ライブラリをロードしてファンクションを実行します。extproc
ユーザー資格証明を構成するには、PL/SQLパッケージDBMS_CREDENTIAL
とPL/SQL文CREATE LIBRARY
を使用します。
5.6 ユーザー・アクティビティの監査
データベースにおける特定のアクションを監査する監査ポリシーを作成できます。Oracle Databaseは次に、これらのアクションを監査証跡に記録します。データベースは必ずなんらかのアクションを監査し、それも監査証跡に書き込みます。作成する監査ポリシーは、特定のユーザーごとにすべてのアクションを監査するような単純なポリシーでも、特定の条件をテストして条件違反がある場合にアラートを電子メールで送信するような複雑なポリシーでもかまいません。
Oracle Databaseをインストールするとき、データベースの監査方法を選択できます。
-
統合監査: 統合監査では、すべての監査証跡が1つの監査証跡に書き込まれ、
V$UNIFIED_AUDIT_TRAIL
およびGV$UNIFIED_AUDIT_TRAIL
の動的ビューによって表示されます。この監査証跡は、Oracle Database固有のアクションのみでなく、Oracle Real Application Security、Oracle Recovery Manager、Oracle Database Vault、Oracle Label Securityの各環境で実行されるアクションも対象にします。これらのソースからの監査レコードが、一貫した統一フォーマットで表示されます。名前付きの監査ポリシーを作成し、必要に応じてその有効/無効を切り替えることができます。統合監査を使用する場合は、データベースをそれに移行する必要があります。 -
統合監査と、リリース12cより前の監査の混在: ほとんどの場合、このオプションでリリース12cより前の監査を使用できるようになり、監査レコードは独自のフォーマットを使用して別の場所に書き込まれます。この場合でも、マルチテナント環境での監査の使用など、リリース12cの機能は使用できます。このタイプの監査は、新規データベースとアップグレードしたデータベースのどちらでもデフォルトです。
どちらの場合も、データベースをOracle Database 12cリリース1 (12.1.0.1)にアップグレードするとき、前のリリースからの監査レコードは維持されます。全面的に統合監査に移行する場合は、以前のレコードをアーカイブしてから、監査証跡をパージできます。移行が完了すると、新しい監査レコードは統合監査証跡に書き込まれるようになります。
関連項目:
-
統合監査とリリース12cより前の監査の詳細な比較は、『Oracle Databaseセキュリティ・ガイド』を参照してください
-
統合監査への移行の詳細は、Oracle Databaseアップグレード・ガイドを参照してください。