6 PL/SQLパッケージおよびタイプでのファイングレイン・アクセスの管理

Oracle Databaseにはファイングレイン・アクセスのためのPL/SQLパッケージとタイプが用意されており、これにより外部ネットワーク・サービスやウォレットへのアクセスを制御できます。

6.1 PL/SQLパッケージおよびタイプでのファイングレイン・アクセスの管理について

PL/SQLパッケージのセットと1つの型を使用して、外部ネットワーク・サービスおよびウォレットに対するユーザー・アクセスを構成できます。

パッケージはUTL_TCPUTL_SMTPUTL_MAILUTL_HTTPUTL_INADDRDBMS_LDAPのPL/SQLパッケージ、型はHttpUriTypeです。

次の使用方法が可能です。

  • データベースから外部ネットワーク・サービスへのアクセスが必要なユーザーやロールに、ファイングレイン・アクセス・コントロールを構成します。これによって、特定のユーザー・グループは、付与されている権限に基づいて1つ以上のホスト・コンピュータに接続できます。通常、この機能は、特定のホスト・アドレスで実行されるアプリケーションへのアクセスを制御するために使用します。

  • パスワードまたはクライアント証明書認証を必要とするHTTPリクエストを処理するために、Oracleウォレットにファイングレイン・アクセス・コントロールを構成します。この機能により、Oracleウォレットに格納されているパスワードとクライアント証明書を使用するユーザーに、保護されている外部HTTPリソースにUTL_HTTPパッケージを介してアクセスする権限を付与できます。たとえば、アプリケーションで資格証明をハードコードするかわりに、ウォレットに格納されている資格証明を使用するようにアプリケーションを構成できます。

6.2 外部ネットワーク・サービスに対するファイングレイン・アクセス・コントロールについて

Oracle Application Securityアクセス制御リスト(ACL)で、外部ネットワーク・サービスに対するファイングレイン・アクセス・コントロールを実装できます。

このマニュアルでは、DBMS_NETWORK_ACL_ADMIN PL/SQLパッケージを使用してデータベース・ユーザーおよびロールのアクセス制御を構成する方法について説明します。

この機能を使用することで、データベース・ユーザーがPL/SQLネットワーク・ユーティリティ・パッケージUTL_TCPUTL_SMTPUTL_MAILUTL_HTTPUTL_INADDR、PL/SQLパッケージDBMS_LDAPDBMS_DEBUG_JDWPおよびHttpUriType型を使用して接続できる外部ネットワーク・ホストが制限されるため、ネットワーク接続のセキュリティが強化されます。この機能を使用しない場合、デフォルトでは、PL/SQLユーティリティ・パッケージは、PUBLICユーザーに付与されるEXECUTE権限付きで作成されるため、データベースへのアクセス権を獲得した侵入者が故意にネットワークを攻撃する可能性があります。これらのPL/SQLネットワーク・ユーティリティ・パッケージおよびDBMS_NETWORK_ACL_ADMINDBMS_NETWORK_ACL_UTILITYパッケージは、IPバージョン4(IPv4)アドレスとIPバージョン6(IPv6)アドレスの両方をサポートしています。このマニュアルでは、両方のバージョンに対してアクセス制御を管理する方法について説明します。Oracle DatabaseでのIPv4およびIPv6表記法の詳細は、『Oracle Database Net Services管理者ガイド』を参照してください。

関連項目:

電子メール・アラート用に外部ネットワーク・サービスへのアクセス制御を構成する例は、例: ファイングレイン監査ポリシーへの電子メール・アラートの追加を参照してください

6.3 Oracleウォレットへのアクセス制御について

リモートWebサーバーによって保護されているWebページにアクセスするときに、ユーザーはOracleウォレットに格納されているクライアント資格証明とパスワードを使用して認証を受けることができます。

Oracleウォレットでは、ユーザーのパスワードとクライアント証明書を安全に格納できます。

ウォレットに対するアクセス制御を構成するには、次のコンポーネントが必要です。

  • Oracleウォレット。Oracleウォレットは、Oracle DatabaseのmkstoreユーティリティまたはOracle Wallet Managerを使用して作成できます。HTTPリクエストでは、外部パスワード・ストアまたはウォレット内のクライアント証明書を使用してユーザーが認証されます。

  • ユーザーにウォレットの使用権限を付与するアクセス制御リスト。アクセス制御リストを構成するには、DBMS_NETWORK_ACL_ADMIN PL/SQLパッケージを使用します。

Oracleウォレットを使用すると、保護されているWebページへのアクセスに必要なパスワードとクライアント証明書を安全に格納できます。

6.4 外部ネットワーク・サービスを使用するパッケージに依存しているアップグレードされたアプリケーション

アップグレードされたアプリケーションでORA-24247ネットワーク・アクセス・エラーが発生することがあります。

Oracle Database 11gリリース1 (11.1)より前のリリースからアップグレードしているときに、アプリケーションがPL/SQLネットワーク・ユーティリティ・パッケージ(UTL_TCPUTL_SMTPUTL_MAILUTL_HTTPUTL_INADDRおよびDBMS_LDAP)またはHttpUriType型に依存している場合は、そのアプリケーションの実行を試みたときに、ORA-24247エラーが発生する可能性があります。

エラー・メッセージは次のとおりです。

ORA-24247: network access denied by access control list (ACL)

その場合は、この章に記載されている手順を使用してアプリケーションのネットワーク・アクセスを再構成してください。

関連項目:

PL/SQLネットワーク・ユーティリティ・パッケージに依存しているアプリケーションの互換性に関する問題については、『Oracle Databaseアップグレード・ガイド』を参照してください。

6.5 外部ネットワーク・サービスのアクセス制御の構成

DBMS_NETWORK_ACLパッケージは、外部ネットワーク・サービスのアクセス制御を構成します。

6.5.1 外部ネットワーク・サービスのアクセス制御の構成の構文

DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACEプロシージャを使用して、アクセス制御権限をユーザーに付与できます。

このプロシージャは、指定された権限を持つアクセス制御エントリ(ACE)を指定されたホストのACLに追加し、存在しない場合はACLを作成します。結果の構成は、作成したユーザーのスキーマでなくSYSスキーマにあります。

構文は次のとおりです。

BEGIN
 DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE (
  host         => 'host_name', 
  lower_port   => null|port_number,
  upper_port   => null|port_number,
  ace          => ace_definition); 
END;

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

  • host: ホストの名前を入力します。ホスト名またはホストのIPアドレスのいずれかです。ワイルドカードを使用して、ドメインまたはIPサブネットを指定できます。(ドメイン名でワイルドカードを使用する場合の優先順位は、複数のアクセス制御リスト割当てでのホスト・コンピュータの優先順位を参照してください。)ホストまたはドメイン名は大/小文字が区別されません。次に例を示します。

    host     => 'www.example.com',
    
    host     => '*example.com',
    
  • lower_port:(オプション)TCP接続に対するポート範囲の下限を入力します。connect権限にのみ、この設定を使用します。resolve権限には省略します。デフォルトはnullで、ポート制限がない(つまり、すべてのポートにACLが適用される)ことを意味します。ポート番号の範囲は1から65535です。

    例:

    lower_port => 80,
    
  • upper_port:(オプション)TCP接続に対するポート範囲の上限を入力します。connect権限にのみ、この設定を使用します。resolve権限には省略します。デフォルトはnullで、ポート制限がない(つまり、すべてのポートにACLが適用される)ことを意味します。ポート番号の範囲は1から65535です。

    例:

    upper_port => 3999);
    

    lower_portに値を入力してupper_portnullのままに(または省略)すると、upper_portの設定は、lower_portと同じ設定とみなされます。たとえば、lower_port80に設定し、upper_portを省略すると、このupper_portの設定は80とみなされます。

    アクセス制御リスト割当てにポート範囲が指定されている場合、アクセス制御リストのresolve権限は機能しません。

  • ace: 次の形式のXS$ACE_TYPE定数を使用して、ACEを定義します。

    ace    => xs$ace_type(privilege_list => xs$name_list('privilege'),
                          principal_name => 'user_or_role',
                          principal_type => xs$ace_type_user));
    

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

    • privilege_list: 大/小文字を区別しない1つ以上の次の権限を入力します。一重引用符で各権限を囲み、カンマ('http', 'http_proxy'など)で区切ります。

      アクセス制御を強化するために、ユーザーがUTL_HTTPHttpUriTypeUTL_SMTPまたはUTL_MAILのみを使用する場合、connect権限のかわりにhttphttp_proxyまたはsmtp権限のみ付与します。

      - http: UTL_HTTPパッケージおよびHttpUriType型を通じてホストへのHTTPリクエストを作成します

      - http_proxy: UTL_HTTPパッケージおよびHttpUriType型を通じてプロキシを介したHTTPリクエストを作成します。ユーザーがプロキシを介してHTTPリクエストを作成する場合、http権限と組み合せてhttp_proxyを含む必要があります。

      - smtp: UTL_SMTPおよびUTL_MAILパッケージを通じて、SMTPをホストに送信します

      - resolve: UTL_INADDRパッケージを通じて、ネットワーク・ホスト名またはIPアドレスを解決します

      - connect: UTL_TCPUTL_SMTPUTL_MAILUTL_HTTPおよびDBMS_LDAPパッケージまたはHttpUriType型を通じて、ホストのネットワーク・サービスに接続するユーザー権限を付与します

      - jdwp: JavaまたはPL/SQLストアド・プロシージャのJavaデバッグ・ワイヤ・プロトコル・デバッグ操作に使用されます。詳細は、Javaデバッグ・ワイヤ・プロトコル操作のネットワーク・アクセスの構成を参照してください。

    • principal_name: データベース・ユーザー名またはロールを入力します。二重引用符(たとえば、'"ACCT_MGR'"など)で入力しないかぎり、この値は大/小文字を区別しません。

    • principal_type: データベース・ユーザーまたはロールのXS_ACL.PTYPE_DBを入力します。principal_type値のデフォルトがOracle Database Real Application Securityアプリケーション・ユーザーの指定に使用されるPTYPE_XSであるため、PTYPE_DBを指定する必要があります。

関連項目:

aceパラメータ設定に含むことができる追加のXS$ACE_TYPEパラメータgrantedinvertedstart_dateおよびend_dateの詳細は、『Oracle Database Real Application Security管理者および開発者ガイド』を参照してください。

6.5.2 例: 外部ネットワーク・サービスのアクセス制御の構成

DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACEプロシージャで、外部ネットワーク・サービスのアクセス制御を構成できます。

例6-1は、ホストwww.example.comに作成されるACLのacct_mgrデータベース・ロールへのhttpおよびsmtp権限の付与方法を示しています。

例6-1 データベース・ロールの外部ネットワーク・サービスへの権限の付与

BEGIN
 DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
  host       => 'www.example.com',
  ace        =>  xs$ace_type(privilege_list => xs$name_list('http', 'smtp'),
                             principal_name => 'acct_mgr',
                             principal_type => xs_acl.ptype_db));
END;
/

6.5.3 外部ネットワーク・サービスのアクセス制御権限の取消し

外部ネットワーク・サービスのアクセス制御権限を削除できます。

  • 外部ネットワーク・サービスのアクセス制御権限を取り消すには、DBMS_NETWORK_ACL_ADMIN.REMOVE_HOST_ACEプロシージャを実行します。

関連項目:

DBMS_NETWORK_ACL_ADMIN.REMOVE_HOST_ACEプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

6.5.4 例: 外部ネットワーク・サービス権限の取消し

DBMS_NETWORK_ACL_ADMIN.REMOVE_HOST_ACEプロシージャを使用して、外部ネットワーク・サービス権限を取り消すことができます。

例6-2は、外部ネットワーク権限の取消し方法を示しています。

例6-2 外部ネットワーク・サービス権限の取消し

BEGIN
 DBMS_NETWORK_ACL_ADMIN.REMOVE_HOST_ACE (
  host       => 'www.example.com',
  lower_port => 80,
  upper_port => upper_port => 3999,
  ace        => xs$ace_type(privilege_list => xs$name_list('http', 'smtp'),
                            principal_name => 'acct_mgr',
                            principal_type => xs_acl.ptype_db),
  remove_empty_acl => TRUE);
END;
/

ここで、remove_empty_aclTRUE設定は、ACEの削除時に空になる場合にACLを削除します。

6.6 Oracleウォレットへのアクセス制御の構成

Oracleウォレットに対するファイングレイン・アクセス・コントロールにより、パスワードや証明書を必要とするネットワーク・サービスへのアクセスをユーザーに提供できます。

6.6.1 Oracleウォレットへのアクセス制御の構成について

アクセス制御を構成して、パスワードおよびクライアント証明書にアクセス権を付与できます。

これらのパスワードとクライアント証明書はOracleウォレットに格納されます。アクセス制御を構成すると、PL/SQLネットワーク・ユーティリティ・パッケージを使用するときに外部ネットワーク・サービスに対してユーザーが自身を証明できるようになります。

これにより、ユーザーは、パスワードまたは証明書IDが必要なネットワーク・サービスへのアクセスを取得できます。

6.6.2 ステップ1: Oracleウォレットの作成

Oracleウォレットでは標準およびPKCS11の両タイプのウォレットを使用できるほか、自動ログイン・ウォレットにすることもできます。

  1. ウォレットを作成するには、mkstoreコマンドライン・ユーティリティまたはOracle Wallet Managerユーザー・インタフェースを使用します。

    ウォレットにパスワードを格納するには、mkstoreユーティリティを使用する必要があります。

  2. ウォレットがファイルにエクスポートされていることを確認します。

  3. ウォレットを作成したディレクトリをノートにとっておきます。このディレクトリ・パスは、このセクションの手順の終了後に必要になります。

6.6.3 ステップ2: Oracleウォレットのアクセス制御権限の構成

ウォレットを作成した後、ウォレットのアクセス制御権限を構成できます。

  • DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACEプロシージャを使用して、ウォレット・アクセス制御権限を構成します。

DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACEプロシージャの構文は次のとおりです。

BEGIN
 DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE (
  wallet_path => 'directory_path_to_wallet',
  ace         => xs$ace_type(privilege_list => xs$name_list('privilege'),
                             principal_name => 'user_or_role',
                             principal_type => xs$ace_type_user));
END;

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

  • wallet_path: ステップ1: Oracleウォレットの作成で作成したウォレットを含むディレクトリへのパスを入力します。ウォレットのパスを指定する際は、絶対パスを使用し、ディレクトリ・パスの前にfile:を入れる必要があります。$ORACLE_HOMEなどの環境変数を使用したり、file:の後およびパス名の前にスペースを挿入することはできません。例:

    wallet_path   => 'file:/oracle/wallets/hr_wallet',
    
  • ace: XS$ACE_TYPE定数を使用して、ACLを定義します。例:

      ace         =>  xs$ace_type(privilege_list => xs$name_list(privilege),
                                 principal_name => 'hr_clerk',
                                 principal_type => xs_acl.ptype_db);
    

    ここでは、xs$ace_typeを使用してウォレット権限を入力する場合、privilegeが次のいずれかである必要があります(これらの権限名のアンダースコアの使用に注意してください)。

    • use_client_certificates

    • use_passwords

    これらのパラメータの詳細は、外部ネットワーク・サービスのアクセス制御の構成の構文aceパラメータの説明を参照してください。ウォレットには、use_client_certificatesまたはuse_passwords権限を指定する必要があります。

関連項目:

aceパラメータ設定に含むことができる追加のXS$ACE_TYPEパラメータgrantedinvertedstart_dateおよびend_dateの詳細は、『Oracle Database Real Application Security管理者および開発者ガイド』を参照してください。

6.6.4 ステップ3: パスワードとクライアント証明書を使用するHTTPリクエストの作成

UTL_HTTPパッケージでウォレット情報を格納したHTTPリクエスト・オブジェクトを作成し、クライアント証明書またはパスワードを使用して認証できます。

6.6.4.1 パスワードとクライアント証明書を使用するHTTPリクエストの作成

UTL_HTTPパッケージは、SQLとPL/SQLからHypertext Transfer Protocol (HTTP)のコールアウトを行います。

  • UTL_HTTP PL/SQLパッケージを使用して、HTTPリクエストとそのレスポンスで個別に使用されるリクエスト・コンテキスト・オブジェクトを作成します。

例:

DECLARE
 req_context UTL_HTTP.REQUEST_CONTEXT_KEY;
 req         UTL_HTTP.REQ;
BEGIN
 req_context := UTL_HTTP.CREATE_REQUEST_CONTEXT (
              wallet_path          => 'file:path_to_directory_containing_wallet',
              wallet_password      => 'wallet_password'|NULL);
 req := UTL_HTTP.BEGIN_REQUEST( 
              url                  => 'URL_to_application',
              request_context      => 'request_context'|NULL);
 ...
END;

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

  • req_context: UTL_HTTP.CREATE_REQUEST_CONTEXT_KEYデータ型を使用して、リクエスト・コンテキスト・オブジェクトを作成します。このオブジェクトには、Oracle Databaseがリクエスト・コンテキストの識別に使用する、ランダムに生成された数値キーが格納されています。UTL_HTTP.CREATE_REQUEST_CONTEXTファンクションは、リクエスト・コンテキスト自体を作成します。

  • req: UTL_HTTP.REQデータ型を使用して、HTTPリクエストを開始するためのオブジェクトを作成します。このオブジェクトは後で、パスワードで保護されたWebページにアクセスするために、ウォレットからユーザー名とパスワードを設定する際に参照します。

  • wallet_path: ウォレットが格納されているディレクトリのパスを入力します。このパスは、前のセクションのステップ2: Oracleウォレットのアクセス制御権限の構成でアクセス制御リストを作成したときに指定したパスと同じであることを確認してください。ディレクトリ・パスの前にfile:を含める必要があります。$ORACLE_HOMEなどの環境変数を使用しないでください。

    例:

    wallet_path          => 'file:/oracle/wallets/hr_wallet',
    
  • wallet_password: ウォレットを開くためのパスワードを入力します。デフォルトはNULLで、自動ログイン・ウォレットに使用します。例:

    wallet_password      => 'wallet_password');
    
  • url: ウォレットを使用するアプリケーションのURLを入力します。

    例:

    url                  => 'www.hr_access.example.com',
    
  • request_context: このセクションの前の方で作成したリクエスト・コンテキスト・オブジェクトの名前を入力します。このオブジェクトにより、ウォレットは同一データベース・セッション内の他のアプリケーションとは共有されなくなります。

    例:

    request_context      => req_context);
6.6.4.2 他のアプリケーションとセッションを共有している場合に、リクエスト・コンテキストを使用してウォレットを保留

他のアプリケーションとデータベース・セッションを共有している場合は、リクエスト・コンテキストを使用してウォレットを保留にする必要があります。

アプリケーションがデータベース・セッションを排他的に使用している場合は、UTL_HTTP.SET_WALLETプロシージャを使用してデータベース・セッションでウォレットを保留できます。

  • UTL_HTTP.SET_WALLETプロシージャを使用して、ウォレットを保有するようにリクエストを構成します。

例:

DECLARE
 req         UTL_HTTP.REQ;
BEGIN
 UTL_HTTP.SET_WALLET(
              path          => 'file:path_to_directory_containing_wallet',
              password      => 'wallet_password'|NULL);
 req := UTL_HTTP.BEGIN_REQUEST( 
              url           => 'URL_to_application');
 ...
END;

要求された保護されているURLが、認証にユーザー名とパスワードを必要とする場合は、SET_AUTHENTICATION_FROM_WALLETプロシージャを使用してウォレットからユーザー名とパスワードを設定して認証します。

6.6.4.3 認証にクライアント証明書のみを使用

ユーザーに対してACLウォレットで適切な権限が付与されているかぎり、ユーザーの認証にクライアント証明書のみを使用できます。

要求された保護されているURLが、認証にクライアント証明書のみを必要とする場合、BEGIN_REQUESTファンクションはウォレットに割り当てられているACLでユーザーにuse_client_certificates権限が付与されているものとみなして、ウォレットから必要なクライアント証明書を送信します。

認証はリモートWebサーバーで成功し、ユーザーはGET_RESPONSEファンクションを使用してHTTP応答を取得できます。

6.6.4.4 認証にパスワードを使用

要求したURLが保護されていてユーザー名とパスワードの認証を要求される場合は、ウォレットからユーザー名とパスワードを設定して認証します。

例:

DECLARE
 req_context UTL_HTTP.REQUEST_CONTEXT_KEY;
 req         UTL_HTTP.REQ;
BEGIN
...
 UTL_HTTP.SET_AUTHENTICATION_FROM_WALLET(
  r               => HTTP_REQUEST,
  alias           => 'alias_to_retrieve_credentials_stored_in_wallet',
  scheme          => 'AWS|Basic', 
  for_proxy       => TRUE|FALSE);
END;

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

  • r: 前のセクションで作成したUTL_HTTP.BEGIN_REQUESTプロシージャで定義したHTTPリクエストを入力します。例:

    r               => req,
    
  • alias: Oracleウォレットに格納されているユーザー名とパスワード資格証明を識別および取得するための別名を入力します。たとえば、このユーザー名とパスワード資格証明を識別するための別名がhr_accessであるとします。

    alias           => 'hr_access',
    
  • scheme: 次のいずれかを入力します。

    • AWS: Amazon Simple Storage Service(S3)スキームを指定します。このスキームは、Amazon.comのWebサイトへのアクセスを構成する場合にのみ使用します。(この設定の詳細は、Amazonにお問い合せください。)

    • Basic: HTTP basic認証を指定します。デフォルトはBasicです。

    例:

    scheme          => 'Basic',
    
  • for_proxy: HTTP認証情報がWebサーバーではなくHTTPプロキシ・サーバーへのアクセス用かどうかを指定します。デフォルトはFALSEです。

    例:

    for_proxy       => TRUE);
    

ウォレットのユーザー名とパスワードを使用するには、ウォレットに割り当てられているACLでユーザーにuse_passwords権限が付与されている必要があります。

6.6.5 Oracleウォレットのアクセス制御権限の取消し

Oracleウォレットのアクセス制御権限を取り消すことができます。

  • ウォレットのアクセス制御リスト(ACL)のアクセス制御エントリ(ACE)から権限を取り消すには、DBMS_NETWORK_ACL_ADMIN.REMOVE_WALLET_ACEプロシージャを実行します。

例:

BEGIN
 DBMS_NETWORK_ACL_ADMIN.REMOVE_WALLET_ACE (
  wallet_path   => 'file:/oracle/wallets/hr_wallet',
  ace           =>  xs$ace_type(privilege_list => xs$name_list(privilege),
                             principal_name => 'hr_clerk',
                             principal_type => xs_acl.ptype_db),
  remove_empty_acl  => TRUE);
END;
/

この例では、remove_empty_aclTRUE設定により、ウォレットACEの削除時に空になる場合にACLが削除されます。

6.7 外部ネットワーク・サービスのアクセス制御の構成の例

1つのロールとネットワーク接続など、様々な状況に適したアクセス制御を構成できます。

6.7.1 例: 1つのロールおよびネットワーク接続のアクセス制御の構成

DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACEプロシージャで、1つのロールおよびネットワーク接続のアクセス制御を構成できます。

例6-3は、1つのロール(acct_mgr)のアクセス制御を構成し、このロールにwww.us.example.comホストにアクセスするhttp権限を付与する方法を示しています。権限は、2013年1月1日に期限切れになります。

例6-3 1つのロールおよびネットワーク接続のアクセス制御の構成

BEGIN
 DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
  host       => 'www.us.example.com',
  lower_port => 80,
  ace        =>  xs$ace_type(privilege_list => xs$name_list('http'),
                           principal_name => 'acct_mgr',
                           principal_type => xs_acl.ptype_db,
                           end_date => TIMESTAMP '2013-01-01 00:00:00.00 -08:00');
END;
/

6.7.2 例: ユーザーとロールに対するアクセス制御の構成

DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACEで、1つのユーザーおよびロールの権限を拒否または付与するアクセス制御を構成できます。

その後、DBA_HOST_ACESデータ・ビュー・ディクショナリを問い合せて、権限付与に関する情報を確認できます。

例6-4では、データベース・ロール(acct_mgr)に付与しますが、ロールを持つ場合でも特定のユーザー(psmith)を拒否します。ACEが指定された順序で評価されるため、順序は重要です。この場合、拒否ACE(granted => false)を最初に追加する必要があり、追加しないとユーザーを拒否できません。

例6-4 ユーザーおよびロールに対する付与および拒否を使用したアクセス制御リストの構成

BEGIN
 DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
  host       => 'www.us.example.com',
  lower_port => 80,
  upper_port => 80,
  ace        =>  xs$ace_type(privilege_list => xs$name_list('http'),
                             principal_name => 'psmith',
                             principal_type => xs_acl.ptype_db,
                             granted        => false));

 DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
  host       => 'www.us.example.com',
  lower_port => 80,
  upper_port => 80,
  ace        =>  xs$ace_type(privilege_list => xs$name_list('http'),
                             principal_name => 'acct_mgr',
                             principal_type => xs_acl.ptype_db,
                             granted        => true));
END; 

6.7.3 例: DBA_HOST_ACESビューを使用した付与権限の表示

DBA_HOST_ACEデータ・ディクショナリ・ビューにはユーザーに付与されている権限が表示されます。

例6-5は、前述のアクセス制御リストで付与された権限をDBA_HOST_ACESデータ・ディクショナリ・ビューに表示する方法を示しています。

例6-5 DBA_HOST_ACESビューを使用した付与権限の表示

SELECT PRINCIPAL, PRIVILEGE, GRANT_TYPE FROM DBA_HOST_ACE WHERE PRIVILEGE = 'HTTP';

PRINCIPAL    PRIVILEGE  GRANT_TYPE
------------ ---------- --------------------
PSMITH       HTTP       FALSE
ACCT_MGR     HTTP       TRUE

6.7.4 例: 非共有ウォレットのパスワードを使用するACLアクセスの構成

DBMS_NETWORK_ACL_ADMINおよびUTL_HTTP PL/SQLパッケージで、非共有ウォレットのパスワードを使用してACLアクセスを構成できます。

例6-6では、人事部門の2つのロール、hr_clerkhr_managerによるウォレットへのアクセスを構成しています。これらのロールは、use_passwords権限を使用して、ウォレットに格納されているパスワードにアクセスします。この例では、ウォレットは同一データベース・セッション内の他のアプリケーションとは共有されません。

例6-6 非共有ウォレットのパスワードを使用するACLアクセスの構成

/* 1. At a command prompt, create the wallet. The following example uses the 
      user name hr_access as the alias to identify the user name and password 
      stored in the wallet. You must use this alias name when you call the
      SET_AUTHENTICATION_FROM_WALLET procedure later on. */ 
$ mkstore -wrl $ORACLE_HOME/wallets/hr_wallet -create
Enter password: password
Enter password again: password
$ mkstore -wrl $ORACLE_HOME/wallets/hr_wallet -createCredential hr_access hr_usr 
Your secret/Password is missing in the command line
Enter your secret/Password: password
Re-enter your secret/Password: password
Enter wallet password: password

/* 2. In SQL*Plus, create an access control list to grant privileges for the 
      wallet. The following example grants the use_passwords privilege to the
      hr_clerk role.*/ 
BEGIN
 DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE (
  wallet_path => 'file:/oracle/wallets/hr_wallet',
  ace         => xs$ace_type(privilege_list => xs$name_list('use_passwords'),
                             principal_name => 'hr_clerk',
                             principal_type => xs_acl.ptype_db));
END;
/

/* 3. Create a request context and request object, and then set the authentication 
      for the wallet. */
DECLARE
  req_context  UTL_HTTP.REQUEST_CONTEXT_KEY;
  req          UTL_HTTP.REQ;

BEGIN
 req_context := UTL_HTTP.CREATE_REQUEST_CONTEXT(
     wallet_path          => 'file:/oracle/wallets/hr_wallet',
     wallet_password      => NULL,
     enable_cookies       => TRUE,
     max_cookies          => 300,
     max_cookies_per_site => 20);
  req := UTL_HTTP.BEGIN_REQUEST(
     url                  => 'www.hr_access.example.com',
     request_context      => req_context);
  UTL_HTTP.SET_AUTHENTICATION_FROM_WALLET(
     r                    => req,
     alias                => 'hr_access'),
     scheme               => 'Basic', 
     for_proxy            => FALSE);
END;
/

6.7.5 例: 共有データベース・セッションに使用するウォレットのACLアクセスの構成

DBMS_NETWORK_ACL_ADMINおよびUTL_HTTP PL/SQLパッケージで、共有データベース・セッションに使用するウォレットのACLアクセスを構成できます。

例6-7は、ウォレットを共有データベース・セッションに使用するように構成し、現在のデータベース・セッション内のすべてのアプリケーションがこのウォレットへのアクセス権を持ちます。

例6-7 共有データベース・セッションに使用するウォレットのACLアクセスの構成

/* Follow these steps:
   1. Use Oracle Wallet Manager to create the wallet and add the client
      certificate.  

   2. In SQL*Plus, configure access control to grant privileges for the wallet.
      The following example grants the use_client_certificates privilege 
      to the hr_clerk and hr_mgr roles. */ 
BEGIN
 DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE (
  wallet_path => 'file:/oracle/wallets/hr_wallet',
  ace         => xs$ace_type(privilege_list => xs$name_list('use-client_certificates'),
                             principal_name => 'hr_clerk',
                             principal_type => xs_acl.ptype_db));

 DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE (
  wallet_path => 'file:/oracle/wallets/hr_wallet',
  ace         => xs$ace_type(privilege_list => xs$name_list('use_client_certificates'),
                             principal_name => 'hr_mgr',
                             principal_type => xs_acl.ptype_db));
END;
/
COMMIT;

/* 3. Create a request object to handle the HTTP authentication for the wallet.*/
DECLARE
  req  UTL_HTTP.req;
BEGIN
  UTL_HTTP.SET_WALLET(
   path            => 'file:/oracle/wallets/hr_wallet',
   password        => NULL);
 req := UTL_HTTP.BEGIN_REQUEST(
   url             => 'www.hr_access.example.com',
   method          => 'POST',
   http_version    => NULL,
   request_context => NULL);
END;
/

6.8 ネットワーク・ホスト・コンピュータのグループの指定

ネットワーク・ホスト・コンピュータのグループを指定するには、ワイルドカードを使用できます。

  • アクセス制御リストをネットワーク・ホスト・コンピュータのグループに割り当てるには、アスタリスク(*)ワイルドカード文字を使用します。

たとえば、ドメインに属しているホスト・コンピュータには*.example.comを入力し、IPサブネットに属しているIPv4アドレスには192.0.2.*を入力します。アスタリスク・ワイルドカードは、最初(ドメインのピリオド(.)の前)または最後(IPサブネットのピリオド(.)の後)に配置する必要があります。たとえば、*.example.comは有効ですが、*example.com*.example.*は無効です。ワイルドカード文字の使用は、同じホスト・コンピュータに割り当てられている複数のアクセス制御リストの優先順位に影響を与えることに注意してください。IPv6アドレスには、ワイルドカード文字を使用できません。

クラスレス・ドメイン間ルーティング(CIDR)表記法では、インターネット上でのIPパケット・ルーティングにおけるIPv4アドレスとIPv6アドレスの分類が定義されています。DBMS_NETWORK_ACL_ADMINパッケージは、IPv4アドレスとIPv6アドレスの両方に対してCIDR表記法をサポートしています。このパッケージでは、IPv4射影IPv6アドレスまたはサブネットは、IPv4ネイティブ・アドレスまたはサブネットと同等であるとみなします。たとえば、::ffff:192.0.2.1192.0.2.1と同等で、::ffff:192.0.2.1/120192.0.2.*と同等です。

6.9 複数のアクセス制御リスト割当てでのホスト・コンピュータの優先順位

ドメインに割り当てられているアクセス制御リストの優先順位は、サブ・ドメインに割り当てられているアクセス制御リストの優先順位よりも低くなります。

ホスト・コンピュータとそのドメインに割り当てられている複数のアクセス制御リストでは、ホスト・コンピュータに割り当てられているアクセス制御リストが、ドメインに割り当てられているアクセス制御リストよりも優先されます。

ドメインに割り当てられているアクセス制御リストの優先順位は、サブ・ドメインに割り当てられているアクセス制御リストの優先順位よりも低くなります。たとえば、ホストserver.us.example.comに割り当てられているアクセス制御リストが、そのドメインに割り当てられている他のアクセス制御リストに先行して最初に選択されます。追加のアクセス制御リストがサブ・ドメインに割り当てられていた場合、優先順位は次のようになります。

  1. server.us.example.com

  2. *.us.example.com

  3. *.example.com

  4. *.com

  5. *

同様に、IPアドレス(IPv4とIPv6の両方)とIPアドレスが所属するサブネットに割り当てられている複数のアクセス制御リストでは、IPアドレスに割り当てられているアクセス制御リストが、サブネットに割り当てられているアクセス制御リストよりも優先されます。サブネットに割り当てられているアクセス制御リストの優先順位は、サブネットに含まれる小さいサブネットに割り当てられているアクセス制御リストの優先順位よりも低くなります。

たとえば、IPアドレス192.0.2.3に割り当てられているアクセス制御リストが、そのIPアドレスが所属するサブネットに割り当てられている他のアクセス制御リストに先行して最初に選択されます。追加のアクセス制御リストがサブネットに割り当てられていた場合、優先順位は次のようになります。

  1. 192.0.2.3 (または ::ffff:192.0.2.3)

  2. 192.0.2.3/31 (または ::ffff:192.0.2.3/127)

  3. 192.0.2.3/30 (または ::ffff:192.0.2.3/126)

  4. 192.0.2.3/29 (または ::ffff:192.0.2.3/125)

  5. ...

  6. 192.0.2.3/24 (または ::ffff:192.0.2.3/120または192.0.2.*)

  7. ...

  8. 192.0.2.3/16 (または ::ffff:192.0.2.3/112または192.0.*)

  9. ...

  10. 192.0.2.3/8 (または ::ffff:192.0.2.3/104または192.*)

  11. ...

  12. ::ffff:192.0.2.3/95

  13. ::ffff:192.0.2.3/94

  14. ...

  15. *

6.10 ポート範囲指定によるアクセス制御リスト割当てでのホストの優先順位

アクセス制御リスト内のホストの優先順位は、ポート範囲の使用の影響を受けます。

ポート範囲の指定があるアクセス制御リストがホスト・コンピュータ、ドメインまたはIPサブネットに割り当てられている場合、そのアクセス制御リストは、同じホスト、ドメインまたはIPサブネットに割り当てられているポート範囲の指定がないアクセス制御リストよりも優先されます。

たとえば、server.us.example.comのポート80から99のいずれかのポートへのTCP接続があるとします。ポート範囲外のserver.us.example.comに割り当てられている他のアクセス制御リストに先行して、server.us.example.comでポート80から99に割り当てられているアクセス制御リストが最初に選択されます。

6.11 ネットワーク・ホストへのユーザー・アクセスに影響を与える権限割当てのチェック

管理者とユーザーは、どちらもネットワーク接続およびドメイン権限をチェックできます。

6.11.1 ネットワーク・ホストへのユーザー・アクセスに影響を与える権限割当てについて

OracleにはDBA向けのデータ・ディクショナリ・ビューが用意されており、権限の割当てに関する情報を確認できます。

データベース管理者は、DBA_HOST_ACESデータ・ディクショナリ・ビューを使用して、アクセス制御リストでデータベース・ユーザーまたはロールに対して付与または拒否したネットワーク権限を問い合せ、それらの権限が特定の期間のみ有効かどうかを問い合せることができます

現時点でユーザーに権限が付与されているかどうか、ユーザーに割り当てられているロール、アクセス制御エントリの順序などを判断するために、ビューで提供される情報を使用したデータの組合せが必要になる場合があります。

データベース管理者権限のないユーザーには、アクセス制御リストにアクセスしたり、DBMS_NETWORK_ACL_ADMINの各ファンクションを起動する権限はありません。ただし、データベース管理者権限のないユーザーは、USER_HOST_ACESデータ・ディクショナリ・ビューを問い合せて各自の権限をチェックすることはできます。

データベース管理者とユーザーは、次のDBMS_NETWORK_ACL_UTILITYファンクションを使用して、2つのホスト、ドメインまたはサブネットが同じかどうか、あるいはホスト、ドメインまたはサブネットが他のホスト、ドメインまたはサブネットと同じ、または他のホスト、ドメインまたはサブネットに含まれるかどうか、を判断します。

  • EQUALS_HOST: 2つのホスト、ドメインまたはサブネットが同じかどうかを示す値を戻します。

  • CONTAINS_HOST: ホスト、ドメインまたはサブネットが他のホスト、ドメインまたはサブネットと同じかどうか、または他のホスト、ドメインまたはサブネットに含まれるかどうかを示す値を示します。また、ACL割当てのために、含まれているドメインまたはサブネットの相対的な優先順位も示します。

IPv6アドレスを使用しない場合、データベース管理者およびユーザーは、次のDBMS_NETWORK_ACL_UTILITYファンクションを使用して、ホストが所属しているドメインまたはIPv4サブネットのリストを生成し、ホストの割当てに従って優先順位別にアクセス制御リストをソートできます。

  • DOMAINS: アクセス制御リストが、指定のネットワーク・ホスト、サブドメインまたはIPサブネットに対する権限に影響を与える可能性があるドメインまたはIPサブネットのリストを戻します。

  • DOMAIN_LEVEL: 指定のホストのドメイン・レベルを戻します。

6.11.2 ユーザーのネットワーク接続およびドメインに対する権限のチェック方法

データベース管理者は、DBA_HOST_ACESデータ・ディクショナリ・ビューを問い合せて、特定のユーザーまたはロールに付与された権限を確認できます。

DBA_HOST_ACESビューには、ネットワーク接続またはドメインへのアクセスを決定するアクセス制御リストが表示され、各アクセス制御リストについて、ユーザーのアクセス権限が付与されている(GRANTED)か、拒否されている(DENIED)か、あるいは適用外(NULL)かを確認できます。このビューの問合せを実行できるのは、データベース管理者のみです。

6.11.3 例: 管理者によるユーザー・ネットワーク・アクセス制御権限のチェック

DBA_HOST_ACESデータ・ディクショナリ・ビューでは、ユーザーのネットワーク・アクセス制御権限をチェックできます。

例6-8は、ユーザーprestonによるwww.us.example.comへの接続について、データベース管理者がユーザーの権限をチェックする方法を示しています。

この例では、ユーザーprestonにはwww.us.example.comで見つかったすべてのネットワーク・ホスト接続の権限が付与されました。ところが、prestonはポート80でのホスト接続へのアクセス権を付与されたが、ポート3000-3999でのホスト接続へのアクセス権を拒否されたと仮定します。この場合は、ポート80でのホスト接続のためにアクセス制御を構成し、ポート3000-3999でのホスト接続のために別個のアクセス制御構成を行う必要があります。

例6-8 管理者によるユーザー・ネットワーク・アクセス制御権限のチェック

SELECT HOST, LOWER_PORT, UPPER_PORT,
       ACE_ORDER, PRINCIPAL, PRINCIPAL_TYPE,
       GRANT_TYPE, INVERTED_PRINCIPAL, PRIVILEGE,
       START_DATE, END_DATE
  FROM (SELECT ACES.*,
DBMS_NETWORK_ACL_UTILITY.CONTAINS_HOST('www.us.example.com', HOST) PRECEDENCE
          FROM DBA_HOST_ACES ACES)
 WHERE PRECEDENCE IS NOT NULL
 ORDER BY PRECEDENCE DESC,
          LOWER_PORT NULLS LAST,
          UPPER_PORT NULLS LAST,
          ACE_ORDER;
HOST               LOWER_PORT UPPER_PORT ACE_ORDER PRINCIPAL PRINCIPAL_TYPE   GRANT_TYPE INVERTED_PRINCIPAL PRIVILEGE START_DATE END_DATE
------------------ ---------- ---------- --------- --------- ---------------- ---------- ------------------ --------- ---------- --------
www.us.example.com         80        80          1 PRESTON DATABASE USER      GRANT      NO                 HTTP
www.us.example.com         80        80          2 SEBASTIAN DATABASE USER    GRANT      NO                 HTTP
*.us.example.com                                 1 ACCT_MGR DATABASE USER     GRANT      NO                 CONNECT
*                                                1 HR_DBA DATABASE USER       GRANT      NO                 CONNECT
*                                                1 HR_DBA DATABASE USER       GRANT      NO                 RESOLVE 

6.11.4 ユーザーによる各自のネットワーク接続およびドメインに対する権限のチェック方法

ユーザーはUSER_HOST_ACESデータ・ディクショナリ・ビューを問い合せて、自分のネットワークおよびドメインの権限を調べることができます。

USER_HOST_ACESビューはPUBLICであるため、すべてのユーザーが問い合せることができます。

このビューでは、アクセス制御リストはユーザーに表示されません。このビューでユーザーの権限ステータスが判定され(GRANTEDまたはDENIED)、NULLの場合、ユーザーはアクセス制御リストが自分に適用されないときは知る必要がないため、除外されます。言い換えるとOracle Databaseが提示するのは、Oracle Databaseによってアクセス権が明示的に付与または拒否されるネットワーク・ホスト上のユーザーのみです。そのため出力には、データベース管理者固有のDBA_HOST_ACESビューからの出力に見られる*.example.comおよび*は表示されません。

6.11.5 例: ユーザーによるネットワーク・アクセス制御権限のチェック

USER_HOST_ACESデータ・ディクショナリ・ビューには、ホスト・コンピュータのネットワーク・アクセス制御権限が表示されます。

例6-9は、ユーザーprestonが、www.us.example.comへの接続について、自分の権限をチェックする方法を示しています。

例6-9 ユーザーによるネットワーク・アクセス制御権限のチェック

SELECT HOST, LOWER_PORT, UPPER_PORT, PRIVILEGE, STATUS
  FROM (SELECT ACES.*,
DBMS_NETWORK_ACL_UTILITY.CONTAINS_HOST('www.us.example.com', HOST) PRECEDENCE
          FROM USER_HOST_ACES ACES)
 WHERE PRECEDENCE IS NOT NULL
 ORDER BY PRECEDENCE DESC,
          LOWER_PORT NULLS LAST,
          UPPER_PORT NULLS LAST;
 
HOST               LOWER_PORT UPPER_PORT PRIVILEGE STATUS
------------------ ---------- ---------- --------- -------
www.us.example.com         80        80  HTTP      GRANTED 

6.12 Javaデバッグ・ワイヤ・プロトコル操作のネットワーク・アクセスの構成

Java PL/SQLプロシージャをデバッグするには、jdwp ACL権限を付与されていることが必要です。

SQL Developer、JDeveloperまたはOracle Developer Tools For Visual Studio (ODT)などのJavaデバッグ・ワイヤ・プロトコル(JDWP)ベースのデバッガを通じて、データベースのJavaおよびPL/SQLプロシージャをデバッグする場合、jdwp ACL権限を付与して、特定のホストのデバッガにデータベース・セッションを接続する必要があります。

DEBUG CONNECT SESSIONシステム権限と組み合せたjdwp権限が必要です。

jdwp ACL権限が付与されていない場合、リモート・ホストからJavaおよびPL/SQLストアド・プロシージャをデバッグしようとするときに、次のエラーが表示される可能性があります。

ORA-24247: network access denied by access control list (ACL)
ORA-06512: at "SYS.DBMS_DEBUG_JDWP", line line_number
  • JDWP操作のネットワーク・アクセスを構成するには、DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACEプロシージャを使用します。

次の例は、JDWP操作のネットワーク・アクセスの構成方法を示しています。

BEGIN
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
    host         => 'host',
    lower_port   => null|port_number,
    upper_port   => null|port_number,
    ace => xs$ace_type(privilege_list => xs$name_list('jdwp'),
                       principal_name => 'username',
                       principal_type => xs_acl.ptype_db));
END;
/

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

  • hostは、ホスト名、ドメイン名、IPアドレスまたはサブネットのいずれかです。

  • port_numberでは、ポートの範囲を指定できます。ポートを使用する場合、lower_portおよびupper_port値を省略します。

  • 引用符で囲まれていないかぎり(たとえば、principal_name => '"PSMITH"'など)、usernameは大/小文字を区別しません。

関連項目:

6.13 ユーザー・アクセス用に構成されたアクセス制御リストのデータ・ディクショナリ・ビュー

Oracle Databaseでは、既存のアクセス制御リストに関する情報の検索に使用できるデータ・ディクショナリ・ビューが提供されています。

表6-1に、これらのビューを示します。

表6-1 アクセス制御リストに関する情報を表示するデータ・ディクショナリ・ビュー

ビュー 説明

DBA_HOST_ACES

ネットワーク・ホストに定義されたネットワーク権限が表示されます。このビューのSELECT権限は、SELECT_CATALOG_ROLEロールのみに付与されます。

DBA_WALLET_ACES

ウォレット・パス、ACE順序、開始時間と終了時間、付与タイプ、権限およびプリンシパルの情報がリストされます

DBA_WALLET_ACLS

ウォレットに対するアクセス制御リスト割当てが表示されます。このビューのSELECT権限は、SELECT_CATALOG_ROLEロールのみに付与されます。

DBA_HOST_ACLS

ネットワーク・ホストに対するアクセス制御リスト割当てが表示されます。このビューのSELECT権限は、SELECT_CATALOG_ROLEロールのみに付与されます。

USER_HOST_ACES

現行ユーザーがネットワーク・ホストにアクセスするためのネットワーク権限のステータスが表示されます。このビューのSELECT権限はPUBLICに付与されます。

USER_WALLET_ACES

ウォレットのコンテンツにアクセスするため、現在のユーザーのウォレット権限のステータスが表示されます。このビューのSELECT権限はPUBLICに付与されます。

関連項目:

これらのビューの詳細は、『Oracle Databaseリファレンス』を参照してください。