7 ファクタの構成

ファクタを使用すると、Oracle Database Vault認可を決定する複雑な属性をPL/SQLで作成して使用できます。

7.1 ファクタの概要

ファクタは、データベースのIPアドレスなど、Oracle Database Vaultが認識できる名前付き変数または属性です。

ファクタは、データベースに接続するためのデータベース・アカウントの認可や、データの可視性および管理性を制限するフィルタ・ロジックの作成などのアクティビティに使用できます。

Oracle Database Vaultには、サイトのドメイン、IPアドレス、データベースなどのコンポーネントに対する制御を設定できる様々なファクタが用意されています。独自のPL/SQL取得メソッドを使用してカスタム・ファクタを作成することもできます。ただし、ほとんどの場合に、SYS_CONTEXT PL/SQLファンクションが使用できます。これにより、データベースですぐに利用できる最も一般的に使用されるファクタに対するルールを作成します。Session_UserProxy_UserNetwork_ProtocolModuleなどのファクタは、SYS_CONTEXTファンクションから使用できます。

ファクタには、Oracle Label Securityと組み合せて使用する強力な機能があります。この機能は、コンテキストのパラメータではまだ使用できない、その他のデータベース属性のためのものです。この項では、一般に使用できるファクタを示しますが、そうしたファクタについてはルール定義でSYS_CONTEXTファンクションを使用することをお薦めします。SYS_CONTEXTでは、まだ使用できないファクタのみを作成して使用してください。

次のことに注意してください。

  • ルール・セットのルールとともにファクタを使用できます。DVFファクタ・ファンクションは、ルール式で使用できるファクタ固有のファンクションです。

  • ファクタには値(アイデンティティ)があり、それぞれのファクタ・タイプによってさらに分類されます。

  • また、Oracle Label Securityラベルを使用してファクタを統合できます。

  • Oracle Database Vaultに作成するファクタ上でレポートを実行できます。

  • CDBルートまたはアプリケーション・ルートではなく、PDBでのみファクタを作成できます。

7.2 デフォルトのファクタ

Oracle Database Vaultには一連のデフォルトのファクタが用意されています。

これらのファクタごとに、ファクタの値を取得するファンクションが関連付けられています。

独自のPL/SQL取得メソッドを使用してカスタム・ファクタを作成できます。使用できる便利なPL/SQLファンクション(デフォルト・ファクタの多くに使用される)は、SYS_CONTEXT SQLファンクションで、ユーザー・セッションに関するデータを取得します。たとえば、SYS_CONTEXTCLIENT_PROGRAM_NAME属性を使用して、データベース・セッションに使用されるプログラムの名前を検索できます。カスタム・ファクタを作成すると、デフォルト・ファクタの問合せに使用されるファンクションと同様に値を問い合せることができます。

独自のセキュリティ構成でデフォルトのファクタを使用できます。不要な場合には削除できます。(Oracle Database Vaultによる内部使用には不要です。)

デフォルト・ファクタは次のとおりです。

  • Authentication_Methodは認証方式です。次に、ユーザー・タイプの後に返される方式を続けて示します。

    • パスワードで認証されるエンタープライズ・ユーザー、ローカル・データベース・ユーザー、パスワード・ファイルを使用するSYSDBAまたはSYSOPER管理権限があるユーザー(パスワードを使用するユーザー名によるプロキシ): PASSWORD

    • Kerberosで認証されるエンタープライズ・ユーザーまたは外部ユーザー(管理権限なし): KERBEROS

    • Kerberos認証済のエンタープライズ・ユーザー(管理者権限あり): KERBEROS_GLOBAL

    • Kerberos認証済の外部ユーザー(管理者権限あり): KERBEROS_EXTERNAL

    • Transport Layer Security (TLS)で認証されるエンタープライズ・ユーザーまたは外部ユーザー(管理権限なし): SSL (Transport Layer SecurityでSecure Sockets Layerが置き換えられますが、SSL関連の設定はTransport Layer Securityで動作します。)

    • Transport Layer Securityで認証されるエンタープライズ・ユーザー (管理権限あり): SSL_GLOBAL

    • Transport Layer Securityで認証される外部ユーザー (管理権限あり): SSL_EXTERNAL

    • RADIUSで認証される外部ユーザー: RADIUS

    • OSで認証される外部ユーザー、またはSYSDBAまたはSYSOPER管理権限があるユーザー: OS

    • 証明書付きプロキシ、DN、またはパスワードを使用しないユーザー名: NONE

    • バックグラウンド・プロセス(ジョブ・キュー・セカンダリ・プロセス): JOB

    • パラレル問合せスレーブ(セカンダリ)プロセス: PQ_SLAVE

    非管理接続では、認証方法がPASSWORDKERBEROSまたはSSLの場合は、Identification_Typeファクタを使用して外部ユーザーとエンタープライズ・ユーザーを区別できます。管理接続では、PASSWORDSSL_EXTERNALおよびSSL_GLOBAL認証方式にはAuthentication_Methodファクタで十分です。

  • クライアント識別子は、DBMS_SESSION.SET_IDENTIFIERプロシージャ、Oracle Call Interface (OCI)属性OCI_ATTR_CLIENT_IDENTIFIERまたはOracle Dynamic Monitoring Service (DMS)を使用してアプリケーションによって設定された識別子です。様々なOracle Databaseコンポーネントが、この属性を使用して同じデータベース・ユーザーとして認証される軽量アプリケーション・ユーザーを識別します。

  • Client_IPはクライアントが接続されているコンピュータのIPアドレスです。

  • Database_DomainDB_DOMAIN初期化パラメータで指定されているデータベースのドメインです。

  • Database_Hostnameはインスタンスが実行されているコンピュータのホスト名です。

  • Database_Instanceは現在のインスタンスのインスタンス識別番号です。

  • Database_IPはインスタンスが実行されているコンピュータのIPアドレスです。

  • Database_NameDB_NAME初期化パラメータで指定されているデータベースの名前です。

  • DBlink_Infoはデータベース・リンク・セッションのソースです。文字列の形式は、次のとおりです。

    SOURCE_GLOBAL_NAME=dblink_src_global_name, DBLINK_NAME=dblink_name,SOURCE_AUDIT_SESSIONID=dblink_src_audit_sessionid

    詳細は、次のとおりです。

    • dblink_src_global_name: ソース・データベースの一意のグローバル名

    • dblink_name: ソース・データベースでのデータベース・リンクの名前

    • dblink_src_audit_sessionid: dblink_nameを使用してリモート・データベースへの接続を開始したソース・データベース

  • Domainは特定の機密レベルで動作するランタイム環境(ネットワーク化されたIT環境またはそのサブセットなど)の物理、構成または実装固有のファクタの名前付きコレクションです。データベースへのセキュア・アクセス・パス内にあるDatabase Vaultノードのホスト名、IPアドレスおよびデータベース・インスタンス名などのファクタを使用してドメインを識別できます。ドメインを識別するファクタ識別子の組合せを使用して、各ドメインを一意に特定できます。これらの識別ファクタやその他のファクタを使用して、ドメイン内に最大セキュリティ・ラベルを定義できます。これにより、Database Vaultセッションに関する物理ファクタに応じて、データ・アクセスやコマンドを制限できます。必要なドメインの例として、企業機密、内部パブリック、パートナ、顧客があります。

  • Enterprise_Identityはユーザーのエンタープライズ全体のアイデンティティです。

    • エンタープライズ・ユーザーの場合: Oracle Internet Directory識別名(DN)。

    • 外部ユーザーの場合: 外部アイデンティティ(Kerberosプリンシパル名、RADIUSおよびDCEスキーマ名、オペレーティング・システム・ユーザー名、証明書DN)。

    • ローカル・ユーザーとSYSDBAログインおよびSYSOPERログインの場合: NULL

    属性の値はプロキシ方式によって異なります。

    • DNによるプロキシの場合: クライアントのOracle Internet Directory DN。

    • 証明書によるプロキシの場合: 外部ユーザーではクライアントの証明書DN、グローバル・ユーザーではOracle Internet Directory DN。

    • ユーザー名によるプロキシの場合: クライアントがエンタープライズ・ユーザーの場合はOracle Internet Directory DN、クライアントがローカル・データベース・ユーザーの場合はNULL。

  • Identification_Typeはデータベースでユーザー・スキーマが作成された方法です。具体的には、CREATE USERおよびALTER USER構文のIDENTIFIED句が反映されます。次に、スキーマ作成時に使用される構文の後に返される識別タイプを続けて示します。

    • IDENTIFIED BY password: LOCAL

    • IDENTIFIED EXTERNALLY: EXTERNAL

    • IDENTIFIED GLOBALLY: GLOBAL SHARED

    • IDENTIFIED GLOBALLY AS DN: GLOBAL PRIVATE

    • GLOBAL EXCLUSIVE (排他的なグローバル・ユーザー・マッピング)

    • GLOBAL SHARED (共有ユーザー・マッピング)

    • NONE (認証なしでスキーマを作成する場合)

  • Langは既存のLANGUAGEパラメータより短い形式の言語名のISO略称です。

  • Languageはセッションで現在使用中の言語と地域、およびデータベース文字セットです。次の形式で示されます。

    language_territory.characterset
    

    たとえば:

    AMERICAN_AMERICA.WE8MSWIN1252
    
  • Machineは現在のセッションを確立したデータベース・クライアントのホスト名です。コンピュータがクライアントまたはサーバー・セッションに使用されていたかどうかを調べる必要がある場合には、この設定をDatabase_Hostnameファクタと比較して特定できます。

  • モジュールは、DBMS_APPLICATION_INFO PL/SQLパッケージまたはOCIを使用して設定されたアプリケーション名(モジュール)です。

  • Network_Protocolは接続文字列のPROTOCOL=protocol部分で指定されている、通信に使用されるネットワーク・プロトコルです。

  • Proxy_Enterprise_Identityはプロキシ・ユーザーがエンタープライズ・ユーザーである場合、Oracle Internet Directory DNです。

  • Proxy_UserSESSION_USERのかわりに現行セッションを開いたデータベース・ユーザーの名前です。

  • Session_Userは現行ユーザーが認証されたデータベース・ユーザー名です。この値は、セッションを通して同じです。

7.3 ファクタの作成

通常、ファクタを作成するには、まずファクタを作成し、ファクタを編集してアイデンティティを含めます。

次の手順では、ファクタの作成方法のみを示しています。ファクタのアイデンティティの構成方法は示していません。
  1. DV_OWNERまたはDV_ADMINロールを付与されているユーザーとしてPDBに接続します。
  2. 必要に応じて、ファクタで使用するルール・セットを作成します。
    DBA_DV_RULE_SETデータ・ディクショナリ・ビューには、既存のルール・セットが示されます。
  3. DBMS_MACADM.CREATE_FACTORプロシージャを実行して、ファクタを作成します。
    たとえば:
    BEGIN
     DBMS_MACADM.CREATE_FACTOR(
      factor_name       => 'Sector2_DB', 
      factor_type_name  => 'Instance', 
      description       => 'Factor to restrict DBA access', 
      rule_set_name     => 'Limit_DBA_Access', 
      get_expr          => 'UPPER(SYS_CONTEXT(''USERENV'',''DB_NAME''))', 
      validate_expr     => 'dbavowner.check_db_access', 
      identify_by       => DBMS_MACUTL.G_IDENTIFY_BY_METHOD, 
      labeled_by        => DBMS_MACUTL.G_LABELED_BY_SELF, 
      eval_options      => DBMS_MACUTL.G_EVAL_ON_SESSION, 
      audit_options     => DBMS_MACUTL.G_AUDIT_OFF, 
      fail_options      => DBMS_MACUTL.G_FAIL_SILENTLY); 
    END;
    /

    詳細は、次のとおりです。

    • factor_nameは、最大128文字にできます(空白を使用せず、大/小文字混在)。DBA_DV_FACTORデータ・ディクショナリ・ビューには、既存のファクタがリストされます。このパラメータは必須です。
    • factor_type_nameは、最大128文字にできます(空白を使用せず、大/小文字混在)。DBA_DV_FACTOR_TYPEデータ・ディクショナリ・ビューには、既存のファクタ・タイプがリストされます。このパラメータは必須です。
      ファクタ・タイプには名前と説明があり、ファクタ分類の目的でのみ使用されます。ファクタ・タイプは、ファクタの分類に使用されるカテゴリ名です。デフォルトの物理ファクタ・タイプには、認証方式、ホスト名、ホストIPアドレス、インスタンス識別子およびデータベース・アカウント情報などが含まれます。時間や認証方式などのインストールされたファクタ・タイプに加え、アプリケーション名や証明書情報などのユーザー定義のファクタ・タイプも作成できます。特定のファクタ・タイプに関連付けられたファクタを調べる場合は、DBA_DV_FACTORビューを問い合せます。たとえば:
      SELECT NAME FROM DBA_DV_FACTOR 
      WHERE FACTOR_TYPE_NAME='Authentication Method';
    • descriptionは大/小文字の両方を使用して1024文字以内で指定できます。このパラメータは必須です。
    • rule_set_nameは、ファクタ・アイデンティティを設定する時期および方法の制御にルール・セットを使用する場合のルール・セット名です。DBA_DV_RULE_SETデータ・ディクショナリ・ビューには、ルール・セットがリストされます。このパラメータは必須です。

      この設定は、JDBC接続プールを使用するWebアプリケーションなどのデータベース・アプリケーションで、現在のデータベース・セッションに対するファクタ・アイデンティティを動的に設定する必要がある場合に特に有用です。たとえば、Webアプリケーションで、そのWebアプリケーションにログインするデータベース・アカウントの地理的位置を割り当てる場合があります。これを行うには、WebアプリケーションではJDBCコール可能文またはOracle Data Provider for .NET (ODP.NET)を使用して、PL/SQLファンクションSET_FACTORを実行できます。たとえば:

      BEGIN 
       SET_FACTOR('GEO_STATE','VIRGINIA');
      END;

      その後、GEO_STATEファクタの割当てルールを作成し、その他のファクタまたはルール式に基づいてGEO_STATEファクタの設定を許可または禁止できます。

    • get_exprは、ファクタのアイデンティティを取得する有効なPL/SQL式です。大/小文字混在で最大255文字まで使用できます。次の取得メソッドでは、ユーザー・セッションのUSERENV名前空間からデータベース名(DB_NAME)を取得することで、DB_NAMEファクタの値が設定されます。
      UPPER(SYS_CONTEXT('USERENV','DB_NAME'))
    • validate_exprは、ブール値(TRUEまたはFALSE)を返す有効なPL/SQL式であり、(GET_FACTORファンクションを使用して)取得されるファクタのアイデンティティまたは(SET_FACTORファンクションを使用して)ファクタに割り当てられる値を検証します。最大255文字、大/小文字の両方を使用できます。このパラメータは必須です。

      取得または割り当てられる値に対してメソッドがFalseと評価されると、ファクタ・アイデンティティはNULLに設定されます。この機能により、ファクタが正しく取得および設定されることがさらに確実になります。式には、パッケージ・ファンクションまたはスタンドアロン・ファンクションを含めることができます。式がschema.function_nameなどの完全修飾ファンクションであることを確認してください。完全なSQL文は含めないでください。アプリケーション・パッケージまたはファンクションを使用している場合は、オブジェクトのEXECUTE権限のあるDVSYSを指定する必要があります。

      このPL/SQL式には、次のいずれかの書式を使用できます。

      • FUNCTION IS_VALID RETURN BOOLEAN

        この書式では、ファンクション・ロジック内のDVF.F$factor_nameファンクションを使用できます。セッションによって評価されるファクタに適しています。

      • FUNCTION IS_VALID(p_factor_value VARCHAR2) RETURN BOOLEAN

        この書式では、ファクタ値が検証ファンクションに直接渡されます。これは、アクセスごとに評価するファクタに適しています。また、セッションごとに評価するファクタにも有効です。

    • identify_byは、get_exprパラメータに設定した式に基づいて、ファクタのアイデンティティを決定するために次のいずれかのオプションを指定できます。
      • DBMS_MACUTL.G_IDENTIFY_BY_CONSTANT: 定数
      • DBMS_MACUTL.G_IDENTIFY_BY_METHOD: メソッドたとえば、式でPDBのタイムゾーンを使用してPDBの日時が返されるとします: to_char(sysdate,'yyyy-mm-dd')。2022年12月15日の場合は、2022-12-15の値が返されます
      • DBMS_MACUTL.G_IDENTIFY_BY_FACTOR: ファクタこの設定は、子ファクタのアイデンティティを親ファクタにマップすることでファクタ・アイデンティティを特定します。親ファクタは、子ファクタと呼ばれる第2のファクタに基づいて値が解決されるファクタです。リレーションシップを確立するには、アイデンティティをマップします。(このオプションには、get_exprパラメータを指定する必要はありません)。
      • DBMS_MACUTL.G_IDENTIFY_BY_CONTEXT: コンテキスト
    • labeled_byでは、ファクタ・アイデンティティでOracle Label Security (OLS)ラベルを取得する方法を制御します。Oracle Label Security統合を使用している場合、このパラメータは必須です。
      • DBMS_MACUTL.G_LABELED_BY_SELFはOracle Label Securityポリシーに関連付けられているラベルから直接ファクタのアイデンティティをラベル付けします(デフォルト)。
      • DBMS_MACUTL.G_LABELED_BY_FACTORSは子ファクタ・アイデンティティのラベルからファクタ・アイデンティティ・ラベルを導出します。
    • eval_optionsは、ユーザーがログインするときにファクタを評価します。このパラメータは必須です。
      • DBMS_MACUTL.G_EVAL_ON_SESSIONは、データベース・セッションの作成時にファクタを評価します(デフォルト)。この設定は、ファクタのパフォーマンスに影響する可能性がある点に注意してください。
      • DBMS_MACUTL.G_EVAL_ON_ACCESSはファクタがアクセスされるたびにファクタを評価します。
      • DBMS_MACUTL.G_EVAL_ON_STARTUPでは、起動時にファクタを評価します。
    • audit_optionsは、従来の監査にのみ適用されます。統合監査環境には適用されません。Oracle Databaseリリース23c以降、従来の監査はサポートされなくなりました。Oracleでは、audit_optionsを使用するかわりに統合監査ポリシーを作成することをお薦めします。audit_optionsの有効なオプションは次のとおりです。
      • DBMS_MACUTL.G_AUDIT_OFF: 監査を無効にします
      • DBMS_MACUTL.G_AUDIT_ALWAYS: 常に監査します。
      • DBMS_MACUTL.G_AUDIT_ON_GET_ERROR: get_exprがエラーを戻した場合に監査します。
      • DBMS_MACUTL.G_AUDIT_ON_GET_NULL: get_exprがnullの場合に監査します。
      • DBMS_MACUTL.G_AUDIT_ON_VALIDATE_ERROR: 検証プロシージャがエラーを戻した場合に監査します。
      • DBMS_MACUTL.G_AUDIT_ON_VALIDATE_FALSE: 検証プロシージャがfalseの場合に監査します。
      • DBMS_MACUTL.G_AUDIT_ON_TRUST_LEVEL_NULL: 信頼レベルが設定されていない場合に監査します。
      • DBMS_MACUTL.G_AUDIT_ON_TRUST_LEVEL_NEG: 信頼レベルが負の場合に監査します。
    • fail_optionsでは、ファクタ・エラーのレポートのオプションを設定します。
      • DBMS_MACUTL.G_FAIL_WITH_MESSAGE: エラー・メッセージを表示します(デフォルト)。
      • DBMS_MACUTL.G_FAIL_SILENTLY: エラー・メッセージを表示しません。
    この段階で、ファクタは完成して使用できるようになります。処理の詳細化とカスタマイズのために、ファクタのアイデンティティを構成できます。

7.4 ファクタへのアイデンティティの追加

新しいファクタを作成したら、ファクタにアイデンティティを追加できます。

7.4.1 ファクタ・アイデンティティについて

アイデンティティは、IP_Addressファクタ・アイデンティティの192.0.2.4などファクタの実際の値です。

特定のデータベース・セッションのファクタ・アイデンティティは、DBMS_MACADM.CREATE_FACTORプロシージャのget_exprパラメータ(ファクタ・アイデンティティの取得)およびidentify_byパラメータ(ファクタ・アイデンティティの決定)を使用して、実行時に割り当てます。次のような場合には、さらにアイデンティティを構成できます。

  • ファクタの既知のアイデンティティを定義する場合

  • ファクタ・アイデンティティに信頼レベルを追加する場合

  • ファクタ・アイデンティティにOracle Label Securityラベルを追加する場合

  • アイデンティティ・マップを使用して子ファクタによりファクタ・アイデンティティを解決する場合

7.4.2 ファクタの識別の動作

ファクタ・アイデンティティはファクタの実際の値です(IP_Addressタイプを使用するファクタのIPアドレスなど)。

取得メソッドやアイデンティティ・マップ・ロジックに応じて、1つのファクタに複数のアイデンティティが存在する場合もあります。たとえば、Oracle Real Application Clusters環境ではDatabase_Hostnameなどのファクタには、複数のアイデンティティが存在することがあります。データベース環境では、Client_IPのようなファクタには複数のアイデンティティが存在する場合があります。取得メソッドはデータベース・セッションに基づいているため、これらのタイプのファクタの取得メソッドでは異なる値が返される場合があります。複数のレポートを使用してファクタ・アイデンティティ構成を追跡できます。

次のようにしてファクタの割当てを構成できます。

  • データベース・セッションの確立時にファクタを割り当てます。

  • 個々のリクエストを構成してファクタのアイデンティティを取得します。

Oracle Label Security統合を使用すると、Oracle Label Securityラベルでアイデンティティをラベル付けできます。また、アイデンティティに信頼レベルを割り当てることもできます。信頼レベルは、同じファクタの別のアイデンティティと比較した信頼の度合いを示す数値です。一般に、信頼レベルの数値が高く設定されているほど信頼の度合いも高くなります。信頼レベルの数値が負の場合は信頼できません。

データベース・セッション内では、Oracle Database Vault、および次のようなDVFスキーマ(ファクタ値を取得するファンクションを含む)に存在するパブリックからアクセス可能なPL/SQLファンクションのあるアプリケーションで、ファクタに割り当てられたアイデンティティを使用できます。

dvf.f$factor_name

これにより、(PL/SQL、SQL、Oracle仮想プライベート・データベース、トリガーなどを使用して)Oracleデータベース内からファクタのアイデンティティにグローバルにアクセスできます。たとえば、SQL*Plusでは次のようにします。

CONNECT sec_admin_owen@pdb_name
Enter password: password	

SELECT DVF.F$DATABASE_IP FROM DUAL;

次のような出力が表示されます。

SELECT DVF.F$DATABASE_IP FROM DUAL;

F$DATABASE_IP
-------------------------------------------------------------
192.0.2.1

GET_FACTORファンクションを使用して、パブリック・アクセスが可能になっているファクタのアイデンティティを見つけることもできます。たとえば:

SELECT GET_FACTOR('DATABASE_IP') FROM DUAL;

次のような出力結果が表示されます。

GET_FACTOR('DATABASE_IP')
-------------------------------------------------------------
192.0.2.1

7.4.3 信頼レベルについて

信頼レベルを使用することにより、信頼できるかどうかの尺度を示す数値を割り当てることができます。

信頼値1は信頼度が低いことを意味します。値が大きければ信頼度も高くなります。負の値またはゼロは信頼できないことを意味します。ファクタ取得メソッドにより返されたファクタ・アイデンティティがアイデンティティに定義されていない場合は、Oracle Database Vaultによりそのアイデンティティに自動的に負の信頼レベルが割り当てられます。

実行時にファクタ・アイデンティティの信頼レベルを特定するために、DVSYSスキーマのGET_TRUST_LEVELおよびGET_TRUST_LEVEL_FOR_IDENTITYファンクションを使用できます。

たとえば、Networkという名前のファクタを作成したとします。Networkファクタに次のようなアイデンティティを作成できます。

  • Intranet (信頼レベル10)

  • VPN (仮想プライベート・ネットワーク)(信頼レベル5)

  • Public (信頼レベル1)

ポリシー決定の基準を信頼レベルに置くルール式(またはカスタム・アプリケーション・コード)を作成できます。たとえば、GET_TRUST_LEVELファンクションを次のように使用して、5より大きい信頼レベルを検出できます。

GET_TRUST_LEVEL('Network') > 5

または、次のようにDBA_DV_IDENTITYデータ・ディクショナリ・ビューでSELECT文を使用して、信頼レベルが5以上のNetworkファクタを検出できます。

SELECT VALUE, TRUST_LEVEL FROM DBA_DV_IDENTITY 
   WHERE TRUST_LEVEL >= 5 
   AND FACTOR_NAME='Network'

次のような出力が表示されます。

F$NETWORK GET_TRUST_LEVEL('NETWORK')
------------------------------------
VPN                                5
INTRANET                          10

前の例では、VPNのNetworkファクタ・アイデンティティは信頼されており(値が5)、INTRANETドメインのアイデンティティはより信頼度の高い10です。

7.4.4 ラベル・アイデンティティについて

ファクタ・アイデンティティにOracle Label Security(OLS)ラベルを割り当てることができます。

簡単に説明すると、ラベルはデータベース表の行に権限を割り当てるために行の識別子の役割を果します。DBMS_MACADM.CREATE_FACTORプロシージャまたはDBMS_MACADM.UPDATE_FACTORプロシージャでは、labeled_byパラメータの設定によって、ファクタにDBMS_MACUTL.G_LABELED_BY_SELFDBMS_MACUTL.G_LABELED_BY_FACTORSのどちらのラベルを付けるかが決まります。labeled_byDBMS_MACUTL.G_LABELED_BY_SELFに設定すると、ファクタ・アイデンティティにOLSのラベルを関連付けできます。labeled_byDBMS_MACUTL.G_LABELED_BY_FACTORSに設定すると、Oracle Database Vaultでは、子のファクタ・アイデンティティのラベル付けからファクタ・アイデンティティ・ラベルを導出します。ラベルのある子ファクタ・アイデンティティが複数ある場合は、適用可能なファクタのOracle Label Securityポリシーに関連付けられているOLSアルゴリズムを使用して、Oracle Database Vaultによりラベルがマージされます。

7.4.5 ファクタ・アイデンティティの作成および構成

既存のファクタに対するファクタ・アイデンティティを作成および構成できます。

  1. DV_OWNERまたはDV_ADMINロールを付与されているユーザーとしてPDBに接続します。
  2. DBMS_MACADM.CREATE_IDENTITYプロシージャを実行します。
    たとえば:
    BEGIN
     DBMS_MACADM.CREATE_IDENTITY(
      factor_name  => 'Sector2_ClientID', 
      value        => 'intranet', 
      trust_level  => 5); 
    END;
    /

    詳細は、次のとおりです。

    • factor_nameは、既存のファクタの名前です。DBA_DV_FACTORデータ・ディクショナリ・ビューには、ファクタがリストされます。
    • valueはファクタの値(大/小文字混在で最大1024文字)です。たとえば、IP_Addressファクタのアイデンティティは、192.0.2.12というIPアドレスになります。
    • trust_levelは同じファクタの別のアイデンティティと比較した信頼の度合いを示します。一般に、信頼レベルの数値が高く設定されているほど信頼の度合いも高くなります。信頼レベル10は、非常に信頼度が高いことを表します。信頼レベルの数値が負の場合は信頼できません。
      • 10は、信頼度が非常に高いことを示します。
      • 5は、信頼できることを示します。
      • 1は、信頼度が低いことを表します。
      • -1は、信頼できないことを示します。
      • NULLは、未定義の信頼レベルを表します(デフォルト)
作成したファクタ・アイデンティティは、既存のファクタが2つあるアイデンティティ・マップで使用できます。

7.4.6 他のファクタを使用するアイデンティティを構成するためのアイデンティティ・マップの使用方法

アイデンティティ・マッピングを使用してファクタのグループを使用すると、アイデンティティ値を管理できます。

7.4.6.1 アイデンティティ・マッピングについて

ファクタ・アイデンティティを作成する間に、そのアイデンティティをマップできます。

アイデンティティ・マッピングは、他(子)のファクタを使用してファクタを識別するプロセスです。これはファクタの組合せをファクタの論理アイデンティティに変換する方法です。また、連続するアイデンティティ値(温度など)や連続しない大きなアイデンティティ値(IPアドレスの範囲など)を論理セットに変換する方法でもあります。アイデンティティのマッピングにおける構成の問題を確認するには、「アイデンティティ構成の問題」レポートを実行します。

親ファクタの別のアイデンティティを構成ファクタの別のアイデンティティにマップできます。たとえば、INTRANETアイデンティティは192.0.2.1から192.0.2.24の範囲のIPアドレスにマップします。REMOTEアイデンティティは、192.0.2.1から192.0.2.24の範囲のアドレスを除くIPアドレスにマップします。

アイデンティティ・マップに基づいて、セキュリティ・ポリシーを作成できます。たとえば、企業ネットワーク(INTRANET)内から接続している従業員とは対照的に、VPN (REMOTE)経由で接続している従業員には少ない権限を定義できます。

アイデンティティ・マッピングの変更が必要な場合は、アイデンティティ・マップを削除してから再作成する必要があります。

7.4.6.2 ファクタへのアイデンティティのマッピング

2つのファクタに親子関係を作成すると、ファクタにアイデンティティをマップできます。

  1. DV_OWNERまたはDV_ADMINロールを付与されているユーザーとしてPDBに接続します。
  2. マッピングに使用する予定のファクタとファクタ・アイデンティティが作成されていることを確認します。
    DBA_DV_FACTORデータ・ディクショナリ・ビューには、既存のファクタがリストされます。DBA_DV_IDENTITYデータ・ディクショナリ・ビューには、既存のファクタ・アイデンティティがリストされます。
  3. DBMS_MACADM.CREATE_IDENTITY_MAPプロシージャを実行して、アイデンティティ・マップを作成します。
    たとえば:
    BEGIN
     DBMS_MACADM.CREATE_IDENTITY_MAP(
      identity_factor_name  => 'Sector2_ClientID',
      identity_factor_value => 'intranet', 
      parent_factor_name    => 'HQ_ClientID', 
      child_factor_name     => 'Div1_ClientID', 
      operation             => '<', 
      operand1              => '192.0.2.50', 
      operand2              => '192.0.2.100');
    END;
    /

    詳細は、次のとおりです。

    • identity_factor_nameは、アイデンティティ・マップに使用するファクタです。
    • identity_factor_valueは、アイデンティティマップの評価がTRUEの場合にファクタに想定される値です。
    • parent_factor_nameは、マップが関連する親ファクタ・リンクです。DBA_DV_IDENTITY_MAPデータ・ディクショナリ・ビューには、既存の親子ファクタ・マッピングがリストされます。
    • child_factor_nameは、マップが関連する子ファクタ・リンクです。
    • operationは、アイデンティティ・マップの関係演算子です(たとえば、<>=betweenなどがあります)。
    • operand1は関係演算子の左オペランドであり、入力する下限値を表します。
    • operand2は関係演算子の右オペランドであり、入力する上限値を表します。

    たとえば、子ファクタの設定がClient_IPoperationの設定がbetweenoperand1の設定が192.0.2.1、およびoperand2の設定が192.0.2.24というシナリオについて考えてみます。この場合、クライアントIPアドレスが192.0.2.1から192.0.2.24の指定されたアドレスの範囲内である場合は、親ファクタが事前に定義されたアイデンティティ(INTRANETなど)と評価されます。

  4. このプロセスを繰り返して、親ファクタ・アイデンティティの構成ファクタをさらに追加します。

    たとえば、ProgramファクタがOracle General Ledgerに解決され、Client_IP192.0.2.1から192.0.2.24の間の場合には、値ACCOUNTING-SENSITIVEに解決するようNetworkファクタを構成できます。そのため、IPアドレスが192.0.2.12のクライアント上で稼働している、認可済の経理金融アプリケーション・プログラムがデータベースにアクセスすると、NetworkファクタはACCOUNTING-SENSITIVEに解決されます。Networkの値がACCOUNTING-SENSITIVEのデータベース・セッションには、Networkの値がINTRANETのデータベース・セッションよりも多くのアクセス権があります。

7.4.6.3 アイデンティティ・マップの削除

2つのファクタ間の親子関係を削除するには、アイデンティティ・マップを削除する必要があります。

  1. DV_OWNERまたはDV_ADMINロールを付与されているユーザーとしてPDBに接続します。
  2. DBA_DV_FACTOR_LINKデータ・ディクショナリ・ビューを問い合せて、親子マッピングに使用されているファクタを調べます。
    たとえば:
    SELECT PARENT_FACTOR_NAME, CHILD_FACTOR_NAME FROM DBA_DV_FACTOR_LINK;
    
    PARENT_FACTOR_NAME             CHILD_FACTOR_NAME
    ------------------------------ ------------------------------
    Domain                         Database_Instance
    Domain                         Database_IP
    Domain                         Database_Hostname
  3. DBA_DV_IDENTITY_MAPデータ・ディクショナリ・ビューを問い合せて、削除するマッピングの定義を調べます。
  4. マッピングの定義に基づいて、DBMS_MACADM.DELETE_IDENTITY_MAPプロシージャを実行します。
    たとえば:
    BEGIN
     DBMS_MACADM.DELETE_IDENTITY_MAP(
      identity_factor_name  => 'intranet-factor',
      identity_factor_value => 'intranet', 
      parent_factor_name    => 'Domain', 
      child_factor_name     => 'Database_IP', 
      operation             => 'between', 
      operand1              => '192.0.2.22', 
      operand2              => '192.0.2.99');
    END;
    /

7.4.7 ファクタ・アイデンティティの変更

DBMS_MACADM.UPDATE_IDENTITYプロシージャを使用すると、ファクタ・アイデンティティを変更できます。

  1. DV_OWNERまたはDV_ADMINロールを付与されているユーザーとしてPDBに接続します。
  2. ファクタ・アイデンティティを検索して、その定義を確認します。
    たとえば:
    SELECT * FROM DBA_DV_IDENTITY ORDER BY FACTOR_NAME; 
  3. DBMS_MACADM.UPDATE_IDENTITY文を実行します。
    たとえば:
    BEGIN
     DBMS_MACADM.UPDATE_IDENTITY(
      factor_name  => 'Sector2_ClientID', 
      value        => 'intranet', 
      trust_level  => 7); 
    END;
    /

7.4.8 ファクタ・アイデンティティの削除

ファクタ・アイデンティティの削除前に、そのアイデンティティへの参照を削除する必要があります。

  1. DV_OWNERまたはDV_ADMINロールを付与されているユーザーとしてPDBに接続します。
  2. DBA_DV_IDENTITYデータ・ディクショナリ・ビューを問い合せて、削除するファクタ・アイデンティティを見つけます。
    たとえば:
    SELECT * FROM DBA_DV_IDENTITY ORDER BY FACTOR_NAME;
  3. DBMS_MACADM.DELETE_IDENTITYプロシージャを実行します。
    パラメータのfactor_namevalueは必須です。たとえば:
    BEGIN
     DBMS_MACADM.DELETE_IDENTITY(
      factor_name => 'Sector2_ClientID', 
      value       => 'intranet'); 
    END;
    /

7.5 ファクタの変更

DBMS_MACADM.UPDATE_FACTORプロシージャを使用すると、ファクタの定義を変更できます。

  1. DV_OWNERまたはDV_ADMINロールを付与されているユーザーとしてPDBに接続します。
  2. ファクタを検索して、その定義を確認します。
    たとえば:
    SELECT * FROM DBA_DV_FACTOR ORDER BY NAME; 
  3. DBMS_MACADM.UPDATE_FACTOR文を実行します。
    たとえば:
    BEGIN
     DBMS_MACADM.UPDATE_FACTOR(
      factor_name       => 'Sector2_DB', 
      factor_type_name  => 'Instance', 
      description       => 'Factor to restrict DBA access in Sector2_DB', 
      rule_set_name     => 'Limit_DBA_Access', 
      get_expr          => 'UPPER(SYS_CONTEXT(''USERENV'',''DB_NAME''))', 
      validate_expr     => 'dbavowner.check_db_access', 
      identify_by       => DBMS_MACUTL.G_IDENTIFY_BY_METHOD, 
      labeled_by        => DBMS_MACUTL.G_LABELED_BY_SELF, 
      eval_options      => DBMS_MACUTL.G_EVAL_ON_ACCESS, 
      audit_options     => DBMS_MACUTL.G_AUDIT_OFF, 
      fail_options      => DBMS_MACUTL.G_FAIL_WITH_MESSAGE); 
    END;
    /

    ファクタを更新した後、従来の監査セット(audit_options)がある場合、従来の監査はリリース23c以降でサポートされなくなるため、この監査は無効になります。DBMS_MACUTL.G_AUDIT_OFF設定のみがaudit_optionsパラメータに使用できます。ファクタを監査するには、統合監査を使用する必要があります。ファクタの統合監査ポリシーを作成する方法の例は、『Oracle Databaseセキュリティ・ガイド』を参照してください。

7.6 ファクタの削除

ファクタを削除する前に、そのファクタへの参照を削除する必要があります。

  1. DV_OWNERまたはDV_ADMINロールを付与されているユーザーとしてPDBに接続します。
  2. DBA_DV_FACTORデータ・ディクショナリ・ビューを問い合せて、削除するファクタの名前を見つけます。
    SELECT NAME FROM DBA_DV_FACTOR ORDER BY NAME;
  3. DBA_DV_FACTOR_LINKデータ・ディクショナリ・ビューを問い合せて、そのファクタが親ファクタまたは子ファクタであるかどうかを調べます。
    たとえば、Sector2_DBという名前のファクタがあるとします。
    SELECT PARENT_FACTOR_NAME, CHILD_FACTOR_NAME 
    FROM DBA_DV_FACTOR_LINK
    WHERE PARENT_FACTOR_NAME = 'Sector2_DB'
    OR CHILD_FACTOR_NAME = 'Sector2_DB';
  4. ファクタが親ファクタまたは子ファクタの場合は、ファクタ・リンクを削除します。
    たとえば:
    BEGIN
     DBMS_MACADM.DELETE_FACTOR_LINK(
      parent_factor_name => 'Sector2_DB', 
      child_factor_name  => 'Div1_ClientID'); 
    END;
    /
  5. DBA_DV_IDENTITY_MAPデータ・ディクショナリ・ビューを問い合せて、そのファクタを使用する可能性のあるアイデンティティ・マップの定義を探します。
    たとえば:
    SELECT * FROM DBA_DV_IDENTITY_MAP
    WHERE FACTOR_NAME = 'Sector2_DB';
  6. DBMS_MACADM.DELETE_IDENTITY_MAPを実行して、アイデンティティ・マップを削除します。
    たとえば:
    BEGIN
     DBMS_MACADM.DELETE_IDENTITY_MAP(
      identity_factor_name  => 'Sector2_DB',
      identity_factor_value => 'intranet', 
      parent_factor_name    => 'HQ_ClientID', 
      child_factor_name     => 'Div1_ClientID', 
      operation             => '<', 
      operand1              => '192.0.2.10', 
      operand2              => '192.0.2.15');
    END;
    /
  7. DBA_DV_IDENTITYデータ・ディクショナリ・ビューを問い合せて、ファクタがファクタ・アイデンティティを参照しているかどうかを調べます。
    ファクタの名前と値を問い合せます。たとえば:
    SELECT VALUE FROM DBA_DV_IDENTITY 
    WHERE FACTOR_NAME = 'Sector2_DB'
  8. DBMS_MACADM.DELETE_IDENTITYプロシージャを実行して、ファクタの参照を削除します。
    パラメータのfactor_namevalueはどちらも必須です。たとえば:
    BEGIN
     DBMS_MACADM.DELETE_IDENTITY(
      factor_name => 'Sector2_DB', 
      value       => 'intranet'); 
    END;
    /
  9. DBMS_MACADM.DELETE_FACTORを実行して、ファクタを削除します。
    たとえば:
    EXEC DBMS_MACADM.DELETE_FACTOR('Sector2_DB');

7.7 ファクタの動作

セッションが確立されると、Oracle Database Vaultではファクタが処理されます。

7.7.1 セッション確立時のファクタの処理

セッションが開始した時刻に基づいて、Oracle Database Vaultではファクタが評価されます。

データベース・セッションが確立されると、次のアクションが発生します。

  1. 各データベース・セッションの開始時に、Oracle Database Vaultは、データベース・インスタンス内のデフォルトおよびユーザー作成のすべてのファクタの評価を開始します。

    適用可能な場合、評価はセッションの通常のデータベース認証、およびOracle Label Securityセッション情報の初期化後に開始されます。

  2. ファクタの評価段階において、ファクタ初期化プロセスがメソッドまたは定数によって識別されるすべてのファクタの取得メソッドを実行し、セッションのファクタ・アイデンティティを解決します。

    ファクタのエラー・オプション設定は、ファクタ初期化プロセスには影響しません。

  3. ファクタに検証メソッドが定義されている場合は、Oracle Database Vaultによりその検証メソッドが実行され、ファクタのアイデンティティ(値)が検証されます。検証メソッドが失敗するかFalseが返された場合、ファクタのアイデンティティは未定義(NULL)です。

  4. ファクタにアイデンティティが定義されている場合、Oracle Database Vaultは定義されているアイデンティティに基づいてファクタの信頼レベルを解決します。ファクタのアイデンティティが定義済のアイデンティティのリストに定義されている場合、Oracle Database Vaultは構成されている信頼レベルを割り当てます。そうでない場合は-1が設定されます。ファクタにアイデンティティが定義されていない場合、信頼レベルは未定義(NULL)になります。

  5. ファクタ評価、ファクタ検証および信頼レベル解決の結果により、Database Vaultはファクタ監査構成の指示に従って評価の詳細を監査します。

  6. メソッドまたは定数によって識別されるすべてのファクタの評価が完了すると、ファクタ構成アイデンティティに定義されているアイデンティティ・マップを使用して、その他のファクタによって識別されるファクタが解決されます。

    ファクタ構成アイデンティティの評価順序は、アイデンティティ値のASCIIソートにより決まります。Oracle Database Vaultは、アルファベット順で最初にソートされたアイデンティティ・マップを使用して評価します。ファクタTESTXおよびYというアイデンティティがあるとします。さらに、アイデンティティXおよびYに、ファクタABCのアイデンティティに依存するアイデンティティ・マップがある場合、次のマップが行われます。

    • A=1およびB=1のときはXがマップされます。

    • A=1B=1およびC=2のときはYがマップされます。

    この場合、最初に評価されるのはXです。Yは評価されませんが、TESTファクタの成功に必要な条件にCのマップが一致した場合はどうなるでしょうか。Xの前にYをマップして、ABおよびCが最初に評価されるように、逆にマップする必要があります。逆にマップするには、YVという名前(またはXの前にソートされるアルファベット値)に変更します。これにより適切に解決されます。

    このアルゴリズムはASCIIソートの順序が適切な場合に機能し、アイデンティティは同レベルの同じ番号のファクタをマップします。

  7. ファクタの初期化が終了すると、Oracle Database VaultのOracle Label Securityとの統合が行われます。

このプロセスが終了すると、Oracle Database Vaultはコマンド・ルールがCONNECTイベントと関連付けられていることを確認します。ルール・セットがCONNECTイベントと関連付けられている場合は、ルール・セットが評価されます。ルール・セットがFalseと評価されるかエラーが戻されると、セッションは終了します。セッションが終了する前に、ルール・セットに関連付けられた監査またはコール・ハンドラが実行されます。

7.7.2 取得メソッドの動作

「取得メソッド」により、ファクタの識別がメソッドまたは定数によって行われるファクタが識別されます。

ファクタの識別がファクタによって行われる場合、Oracle Database Vaultはアイデンティティ・マップによってファクタを識別します。独自のPL/SQL取得メソッドを作成するか、Oracle Database Vaultに用意されているファンクションを使用できます。Oracle Database Vaultには、取得メソッドの作成に使用できるファクタ固有のユーティリティ・ファンクションと一般的なユーティリティ・ファンクションが用意されています。

取得メソッドの例として、Oracle Database Vaultが提供するデフォルトのファクタも参照してください。

get_exprパラメータは、次のDBMS_MACADM.CREATE_FACTORまたはDBMS_MACADM.CREATE_UPDATEの設定をidentify_byパラメータに選択すると必須になります。

  • DBMS_MACUTL.G_IDENTIFY_BY_METHOD: get_exprパラメータにメソッドを入力します。

  • DBMS_MACUTL.G_IDENTIFY_BY_CONSTANT: get_exprパラメータに定数を入力します。

ファクタ・アイデンティティとして返される値は、VARCHAR2文字列またはこの型に変換可能である必要があります。

式には、パッケージ・ファンクションまたはスタンドアロン・ファンクションを含めることができます。式がschema.function_nameなどの完全修飾ファンクションであることを確認してください。完全なSQL文は含めないでください。アプリケーション・パッケージまたはファンクションを使用している場合は、オブジェクトのEXECUTE権限のあるDVSYSを指定する必要があります。

次の書式を使用してファンクション・シグネチャを記述します。

FUNCTION GET_FACTOR RETURN VARCHAR2

7.7.3 ファクタの取得

データベース・セッション内のファクタは、DVFファクタ・ファンクションまたはGET_FACTORファンクションを使用していつでも取得できます。

使用可能なファクタのリストを検索するには、DBA_DV_FACTORデータ・ディクショナリ・ビューを問い合せます。

例7-1に、GET_FACTORファンクションの使用例を示します。

例7-1 GET_FACTORを使用したファクタの取得

SELECT GET_FACTOR('client_ip') FROM DUAL;

DVFファクタ・ファンクションまたはGET_FACTORから取得されたファクタ値は、次に示す方法で使用できます。

  • Oracle Database Vaultルール式

  • Oracle Database Vault環境のすべてのデータベース・セッションで使用可能なカスタム・アプリケーション・コード

DBMS_MACADM.CREATE_FACTORまたはDBMS_MACADM.UPDATE_FACTOReval_optionsパラメータでファクタ評価をDBMS_MACUTL.G_EVAL_ON_SESSIONに設定していると、Oracle Database Vaultは確立したセッション・コンテキストから値を取得します。詳細は、「セッション確立時のファクタの処理」を参照してください。

「セッション確立時のファクタの処理」で説明されているように、ファクタ評価をDBMS_MACUTL.G_EVAL_ON_ACCESSに設定した場合は、ファクタが取得されるたびに、Oracle Database Vaultによりステップ2からステップ5(またはステップ6)が実行されます。

ファクタにエラー・オプションを定義し、エラーが発生した場合には、エラー・メッセージが表示されます。

7.7.4 ファクタの設定

データベース・セッション中はいつでもファクタにアイデンティティを割り当てられますが、ファクタ割当てルール・セットがTrueと評価される場合にかぎります。

SET_FACTORファンクションを使用することにより、アプリケーション・コード内でこれを実行できます。Javaコードでは、JDBCクラスjava.sql.CallableStatementを使用してこの値を設定できます。たとえば:

java.sql.Connection connection ; 
...
java.sql.CallableStatement statement = 
   connection.prepareCall("{call SET_FACTOR('FACTOR_X', ?)}");
statement.setString(1, "MyValue");
boolean result = statement.execute();
...

Oracle Data Provider for .NET(ODP.NET)を使用して記述されたアプリケーションなど、Oracle PL/SQLファンクションの実行が可能なアプリケーションは、このプロシージャを使用できます。

この概念は、ファクタ値の設定時期をルール・セットで制御する機能が追加された標準のOracle DBMS_SESSION.SET_IDENTIFIERプロシージャに似ています。ルール・セットの評価がTrueの場合、「セッション確立時のファクタの処理」のステップ2から5が実行されます。

ファクタに割当てルール・セットを関連付けていない、またはルール・セットでFalse(またはエラー)が返された場合、SET_FACTORファンクションを使用してファクタを設定しようとすると、Oracle Database Vaultによってエラー・メッセージが送信されます。

7.7.5 ファクタの監査の動作

統合監査が有効になっているかどうかは、監査がファクタに対してどのように処理されるかに影響します。

従来の非統合監査環境では、Oracle Database Vaultは、監査証跡をDVSYS.AUDIT_TRAIL$表に書き込みます。従来の監査は、Oracle Databaseリリース23c以降ではサポートされなくなったことに注意してください。

統合監査が有効な場合、この設定では監査レコードは取得されません。かわりに、この情報を取得する統合監査ポリシーを作成できます。

ファクタの監査レポートを使用して、生成された監査レコードを表示できます。また、一度に複数の監査オプションを選択できます。各オプションはビット・マスクに変換され、集計の動作を決定するために追加されます。ファクタにエラーがないかぎり、監査のパフォーマンスへの影響はほとんどありません。

7.8 チュートリアル: データベースへの非定型ツール・アクセスの阻止

このチュートリアルでは、ファクタを使用して非定型ツール(SQL*Plusなど)がデータベースにアクセスできないようにする方法を示します。

7.8.1 このチュートリアルについて

多くのデータベース・アプリケーションには、ユーザーのアクションを明示的に制御する機能が含まれています。

ただし、非定型問合せツール(SQL*Plusなど)には、これらの制御機能がないことがあります。このため、ユーザーは非定型ツールを使用して、通常はデータベース・アプリケーションで実行できないアクションを、データベースで実行できる場合があります。Oracle Database Vaultのファクタ、ルール・セットおよびコマンド・ルールを組み合せて使用すると、非定型問合せツールによるデータベースへの不正アクセスを阻止できます。

次のチュートリアルでは、ユーザーHRがSQL*Plusを使用しないようにします。これを実現するには、SYS_CONTEXT SQLファンクションのUSERENVネームスペースのCLIENT_PROGRAM_NAME属性を使用して、Oracle Databaseの現在のインスタンスへのアクセスに使用されるアプリケーションの名前を検索するOracle Database Vaultルールを作成します。次に、新しいルールを使用するルール・セットと、ルール・セットに関連付けられるCONNECT SQL文のコマンド・ルールを作成します。

7.8.2 ステップ1: HRユーザー・アカウントの有効化

このチュートリアルでOracle Database Vaultコンポーネントをテストするときは、後でHRアカウントを使用する必要があります。

  1. DV_ACCTMGRロールを付与されているユーザーとして、PDBにログインします。
  2. HRアカウントのステータスを確認します。
    SELECT USERNAME, ACCOUNT_STATUS FROM DBA_USERS WHERE USERNAME = 'HR';
    
  3. HRが無効になり、ロックされている場合、次の文を入力してアクティブにします。
    ALTER USER HR ACCOUNT UNLOCK IDENTIFIED BY password;

    passwordを、ユーザーのプロファイルのパスワードの複雑度要件を満たすパスワードに置き換えます。

7.8.3 ステップ2: ファクタの作成

HRアカウントがアクティブであることを確認後、ファクタを作成します。

  1. DV_OWNERまたはDV_ADMINロールを付与されているユーザーとしてPDBに接続します。
  2. SYS_CONTEXTファンクションとファンクションregexp_likeを組み合せて、CLIENT_PROGRAM_NAME属性の任意の場所でSQL*Plusを識別する柔軟なルールを作成します。
    次の問合せは、CLIENT_PROGRAM_NAME属性の出力と、使用されるクライアントがSQL*Plusの場合の1の値を示します。
    column client_program_name format a40
    SELECT SYS_CONTEXT('USERENV', 'CLIENT_PROGRAM_NAME') 
    CLIENT_PROGRAM_NAME, REGEXP_LIKE(SYS_CONTEXT('USERENV', 'CLIENT_PROGRAM_NAME') ,'sqlplus','i') 
    USING_SQLPLUS FROM DUAL;

    出力は次のようになります。

    CLIENT_PROGRAM_NAME                      USING_SQLPLUS
    ---------------------------------------- -------------
    sqlplus@nemosity (TNS V1-V3)             TRUE                
    

    次の問合せでは、使用されるクライアントがSQL*Plusでない場合、CLIENT_PROGRAM_NAME属性の出力および0の値が表示されます。問合せで変更された唯一のコードは、REGEX_LIKEファンクションの前にNOTという単語が追加されたことと、列の別名がUSING_SQLPLUSではなくnot_using_sqlplusになったことに注意してください。

    SELECT SYS_CONTEXT('USERENV', 'CLIENT_PROGRAM_NAME') CLIENT_PROGRAM_NAME, NOT REGEXP_LIKE(SYS_CONTEXT('USERENV', 'CLIENT_PROGRAM_NAME') ,'sqlplus','i') NOT_USING_SQLPLUS FROM DUAL;

    次のような出力が表示されます。

    CLIENT_PROGRAM_NAME                      NOT_USING_SQLPLUS
    ---------------------------------------- -----------------
    sqlplus@nemosity (TNS V1-V3)             FALSE
    
  3. ファクタを作成します。
    BEGIN
     DBMS_MACADM.CREATE_FACTOR(
      factor_name       => 'is_sqlplus',
      factor_type_name  => 'Application',
      description       => 'Returns TRUE if the client program name that connects to the database contains sqlplus',
      rule_set_name     => NULL,
      validate_expr     => NULL,
      get_expr          => 'REGEXP_LIKE(SYS_CONTEXT(''USERENV'', ''CLIENT_PROGRAM_NAME'') ,''sqlplus'',''i'')',
      identify_by       => DBMS_MACUTL.G_IDENTIFY_BY_METHOD,
      labeled_by        => DBMS_MACUTL.G_LABELED_BY_SELF,
      eval_options      => DBMS_MACUTL.G_EVAL_ON_SESSION,
      audit_options     => DBMS_MACUTL.G_AUDIT_OFF,
      fail_options      => DBMS_MACUTL.G_FAIL_SILENTLY);
    END;
    /
    

    詳細は、次のとおりです。

    • factor_type_nameは、これがアプリケーション・ベース・ファクタであることを指定します。

    • get_exprは、ファクタの式を定義します。この式は、USERENV名前空間とCLIENT_PROGRAM_NAME属性を使用してSYS_CONTEXTファンクションをコールして、Oracle Databaseにログインしているプログラムを検索します。

    • identify_byは、メソッドによってファクタを識別します。

    • labeled_byは、Oracle Label Securityポリシーに関連付けられているラベルから直接ファクタのアイデンティティをラベル付けします(デフォルト)。

    • eval_optionsは、データベース・セッションの作成時にファクタを評価します。

    • audit_optionsは無効です。監査レコードは統合監査証跡に書き込まれ、UNIFIED_AUDIT_TRAILデータ・ディクショナリ・ビューで表示できます。

    • fail_silentlyは、ファクタのエラー・メッセージを表示しません。

7.8.4 ステップ3: ルール・セットとルールの作成

ファクタを作成後、ファクタと連携するルール・セットおよびルールを作成します。

  1. Limit SQL*Plus Accessルール・セットを次のように作成します。
    BEGIN
     DBMS_MACADM.CREATE_RULE_SET(
      rule_set_name    => 'Limit SQL*Plus Access',
      description      => 'Limits access to SQL*Plus for Apps Schemas',
      enabled          => DBMS_MACUTL.G_YES,
      eval_options     => DBMS_MACUTL.G_RULESET_EVAL_ANY,
      audit_options    => DBMS_MACUTL.G_RULESET_AUDIT_OFF,
      fail_options     => DBMS_MACUTL.G_RULESET_FAIL_SHOW,
      fail_message     => 'SQL*Plus access not allowed for Apps Schemas',
      fail_code        => 20461,
      handler_options  => DBMS_MACUTL.G_RULESET_HANDLER_OFF,
      handler          => NULL,
      is_static        => FALSE);
    END;
    /

    詳細は、次のとおりです。

    • fail_messageは、ルール・セット基準が満たされない場合にユーザーに返されるカスタマイズされたエラー・メッセージです。

    • fail_optionsfail_messageによって設定されたエラー・メッセージおよびfail_codeによって設定されたエラー・コードを有効にして、エラーの場合に表示します。

    • is_staticは、ユーザー・セッション中にルール・セットを1度評価します。その後、値は再利用されます。

  2. 新しいファクタを確認します。
    SELECT DVF.F$IS_SQLPLUS FROM DUAL;

    出力は次のようになります。

    F$IS_SQLPLUS
    ----------------------------------------
    TRUE
  3. 次のルールを作成します。
    BEGIN
     DBMS_MACADM.CREATE_RULE(
      rule_name    => 'Prevent HR Schema Access to SQL*Plus',
      rule_expr    => 'DVF.F$IS_SQLPLUS = ''FALSE''');
    END;
    /
    
  4. ルールをLimit SQL*Plus Accessルール・セットに追加します。
    BEGIN
     DBMS_MACADM.ADD_RULE_TO_RULE_SET(
      rule_set_name => 'Limit SQL*Plus Access',
      rule_name     => 'Prevent HR Schema Access to SQL*Plus',
      rule_order    => 1);
    END;
    /

    プロシージャが機能するには、rule_order設定が必要です。

7.8.5 ステップ4: CONNECTコマンド・ルールの作成

CONNECTコマンド・ルールは、CONNECT SQL文を制御します。

このコマンド・ルールは、コマンドラインまたはSQL*Plusへのアクセスにサイトで使用されるその他のツールからSQL*Plusにログインする場合にも適用されます。

  • CONNECTコマンド・ルールを次のように作成します。

    BEGIN
     DBMS_MACADM.CREATE_COMMAND_RULE(
      command         => 'CONNECT',
      rule_set_name   => 'Limit SQL*Plus Access',
      object_owner    => 'HR',
      object_name     => '%',
      enabled         => DBMS_MACUTL.G_YES);
    END;
    /
    

詳細は、次のとおりです。

  • rule_set_nameは、Limit SQL*Plus Accessルール・セットとCONNECTコマンド・ルールを関連付けます。

  • コマンド・ルールがHRにのみ適用されるように、object_ownerHRに設定されます。

  • コマンド・ルールがすべてのオブジェクトに適用されるように、object_name%に設定されます。

  • enabledはコマンド・ルールをただちに使用できるように有効化します。

7.8.6 ステップ5: 非定期ツール・アクセス制限のテスト

Oracle Database Vaultの変更を有効にするために、SQL*Plusセッションを再起動する必要はありません。

  1. SQL*Plusで、ユーザーHRとしてPDBへの接続を試行します。
    CONNECT HR@pdb_name
    Enter password: password

    次の出力が表示されます。

    ERROR:
    ORA-47306: 20461: SQL*Plus access not allowed for Apps Schemas

    ユーザーHRは、SQL*Plusの使用を阻止されます。

  2. ここで、ユーザーSYSTEMとして接続を試行します。
    CONNECT SYSTEM@pdb_name
    Enter password: password
    Connected.

    ユーザーSYSTEMはデータベース・インスタンスにログインできる必要があります。SYS、Database Vault所有者アカウントおよびDatabase Vaultアカウント・マネージャ・アカウントもログインできます。

テストが失敗した場合

SYSTEMとして(またはルール式で指定されているその他の管理ユーザーのいずれかとして)データベース・インスタンスにログインできない場合、SQL*Plusは使用できません。DV_OWNERロールを持つユーザーは、Oracle Database Vault接続コマンド・ルールから免除されます。

この問題は、次の方法で対処できます。

  1. DV_OWNERまたはDV_ADMINロールを付与されているユーザーとして、データベース・インスタンスにログインします。
  2. 次の文を入力して、CONNECTコマンド・ルールを削除します。
    EXEC DBMS_MACADM.DELETE_COMMAND_RULE ('CONNECT', 'HR', '%');

    Oracle Database Vaultを無効にしても、そのPL/SQLパッケージとDatabase Vault Administratorはまだ使用できます。

  3. エラーがあるかどうかポリシー・コンポーネントを確認し、エラーを修正します。CONNECTコマンド・ルールを再作成し、テストします。

7.8.7 ステップ6: このチュートリアルのコンポーネントの削除

コンポーネントが不要になった場合、このチュートリアルで作成したコンポーネントを削除できます。

  1. DV_OWNERまたはDV_ADMINロールを付与されているユーザーとしてPDBに接続します。
  2. CONNECTコマンド・ルールを削除します。
    EXEC DBMS_MACADM.DELETE_COMMAND_RULE ('CONNECT', 'HR', '%');
  3. Limit SQL*Plus Accessルール・セットを削除します。
    EXEC DBMS_MACADM.DELETE_RULE_SET('Limit SQL*Plus Access');
  4. ルールを削除します。
    EXEC DBMS_MACADM.DELETE_RULE('Prevent HR Schema Access to SQL*Plus');
  5. Client_Prog_Nameファクタを削除します。
    EXEC DBMS_MACADM.DELETE_FACTOR('IS_SQLPLUS');
  6. 必要に応じて、DBV_ACCTMGRロールを付与されているユーザーとしてHRアカウントをロックします。
    ALTER USER HR ACCOUNT LOCK;

7.9 ファクタ設計のガイドライン

Oracleでは、ファクタ設計のガイドラインを提供しています。

  • セキュリティまたは外部システムからのセッションに関するその他のコンテキスト情報を統合するには、UTL_TCPUTL_HTTPDBMS_LDAPおよびDBMS_PIPEなどのOracleユーティリティ・パッケージを使用できます。

  • identify_byパラメータがDBMS_MACUTL.G_IDENTIFY_BY_FACTORに設定されている場合は、取得メソッドを指定(DBMS_MACADM.CREATE_FACTORまたはDBMS_MACADM.UPDATE_FACTORget_exprパラメータを使用)しないでください。取得メソッドは、ファクタがDBMS_MACUTL.G_IDENTIFY_BY_CONSTANTまたはDBMS_MACUTL.G_IDENTIFY_BY_METHODに設定されている場合にのみ必要です。

  • ファクタに割当てルール・セットがある場合は、検証メソッドの使用を検討します。これにより、無効なアイデンティティが発行されないことを検証できます。

  • 指定されている値は、クライアント・ソフトウェアが信頼されていて、クライアント・ソフトウェアからの通信チャネルが安全であることがわかっている場合にのみ信頼できるため、クライアント指定のProgram、OS Userおよびその他のファクタは注意して使用します。

  • 時間ベースのファクタなど、取得メソッドから返された値が同じセッション内のある呼出しから次の呼出しに変わる可能性がある場合は、DBMS_MACUTL.G_EVAL_ON_ACCESSの評価オプションeval_optionsのみを指定してください。

  • 従来のSQLおよびPL/SQLの最適化技術を使用して、ファクタ取得メソッドに使用されるファンクションの内部ロジックを最適化します。

  • 取得メソッドによって返される離散値がわかっている場合は、各値にアイデンティティを定義し、信頼レベルを割り当てられるようにします。ファクタに基づくアプリケーション・ロジックに信頼レベルを使用するにつれ、信頼レベルによりファクタに値が追加されます。

  • 通常、より多くのファクタに基づくセキュリティ・ポリシーは、少ないファクタに基づくセキュリティ・ポリシーよりも強力です。別のファクタによって識別される新しいファクタを作成し、アイデンティティ・マップを使用してファクタの組合せを論理グループに保存できます。これにより、ファクタをOracle Label Securityラベルと統合する際の、親ファクタのラベル付けもより簡単になります。

  • Oracle Label Securityを統合しているときには、一般に、labeled_byパラメータがDBMS_MACUTL.G_LABELED_BY_SELFに設定されているファクタの方が、DBMS_MACUTL.G_LABELED_BY_FACTORSのラベルが付けられたファクタよりも、構成やデバッグが簡単になります。

  • 1つ以上のセキュリティ、エンドユーザーまたは環境属性を関連付けられたデータベース・セッションで使用できるように、それらの属性を渡すデータベース・クライアント・アプリケーションを設計できます。これを行うには、属性ごとに1つのファクタを作成し、割当てルール・セットを使用してこれらの属性が割り当てられる場合(特定のWebアプリケーションを指定された名前付きアプリケーション・サーバー・コンピュータで使用するときのみ、など)を制御します。この方法で使用されるOracle Database Vaultファクタは、OracleプロシージャDBMS_SESSION.SET_IDENTIFIERに非常によく似ていますが、設定可能な場合を制御する機能も含まれています。

7.10 ファクタのパフォーマンスへの影響

ファクタの複雑さは、Oracleデータベース・インスタンスのパフォーマンスに影響します。

各ファクタには、検証メソッドや信頼レベルのような処理される要素があります。セッションによって評価されるDatabase_HostnameおよびProxy_Userのようなファクタの場合は、Oracle Database Vaultによりセッションの初期化中にこのプロセスが実行され、その値に対する後続のリクエスト用に結果がキャッシュされます。

デフォルトのファクタは、典型的なセキュリティ・ポリシーで使用される可能性が高いためキャッシュされます。ただし、ルール・セットやその他のコンポーネントなどで5つのファクタしか使用しない場合、別のことに使用できるリソースが残りのファクタにより消費されます。このような場合は、不要なファクタを削除する必要があります。(Oracle Database Vaultでは、これらのファクタを内部的に使用しないため、不要な場合は削除できます。)

ユーザー数が多い場合やアプリケーション・サーバーで接続の作成や切断を頻繁に行う場合、使用されるリソースがシステムのパフォーマンスに影響を与える可能性があります。不要なファクタは削除できます。

システム・パフォーマンスを確認するには、Oracle Enterprise Manager(Oracle Databaseと一緒にデフォルトでインストールされるOracle Enterprise Manager Cloud Controlを含む)、自動ワークロード・リポジトリ(AWR)およびTKPROFなどのツールを実行します。

7.11 ファクタに関連するレポートおよびデータ・ディクショナリ・ビュー

Oracle Enterprise ManagerとOracle Database Vaultを一緒に使用すると、ファクタとそれらのアイデンティティの分析に役立つレポートおよびデータ・ディクショナリ・ビューが提供されます。

表7-1では、Oracle Database Vaultレポートを示します。

表7-1 ファクタおよびアイデンティティに関連するOracle Enterprise Managerレポート

レポート 説明

「ファクタの監査」レポート

評価に失敗したファクタの検出など、ファクタが監査されます。

「ファクタ構成の問題」レポート

無効なルール・セットまたは不完全のルール・セットなどの構成問題の表示、またはファクタに影響を与える可能性のある問題の監査が行われます。

「アイデンティティのないファクタ」レポート

アイデンティティが割り当てられていないファクタが表示されます。

「アイデンティティ構成の問題」レポート

無効なラベル・アイデンティティがあるファクタ、またはアイデンティティがマップされていないファクタが表示されます。

「ルール・セット構成の問題」レポート

ルールが定義されていないか、有効ではなく、それらを使用するファクタに影響を与える可能性があるルール・セットが表示されます。

表7-2に、既存のファクタおよびファクタ・アイデンティティに関する情報を提供するデータ・ディクショナリ・ビューを示します。

表7-2 ファクタおよびファクタ・アイデンティティに使用されるデータ・ディクショナリ・ビュー

データ・ディクショナリ・ビュー 説明

DBA_DV_FACTOR

現行のデータベース・インスタンス内の既存のファクタが表示されます。

DBA_DV_FACTOR_LINK

子ファクタの関連によりアイデンティティが決定される各ファクタの関係が表示されます。

DBA_DV_FACTOR_TYPE

システムで使用されているファクタ・タイプの名前および説明が表示されます。

DBA_DV_IDENTITY

各ファクタのアイデンティティが表示されます。

DBA_DV_IDENTITY_MAP

各ファクタのアイデンティティのマップが表示されます。