ヘッダーをスキップ
Oracle® XML DB開発者ガイド
11gリリース2 (11.2)
B70200-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

27 リポジトリのアクセス制御

Oracle Databaseでは、データベース・ユーザーが行レベルおよび列レベルでセキュアにアクセスできるなど、従来型のデータベース・セキュリティが提供されています。また、Oracle XML DBリポジトリ内のリソースに対するファイングレイン・アクセス制御も提供されています。この章では、後者について説明します。アクセス制御リスト(ACL)の作成、設定、変更方法、およびACLセキュリティと他のOracle Databaseセキュリティ・メカニズムとの相互作用の方法も説明します。

この章の内容は次のとおりです。


関連項目:


アクセス制御の概念

この項では、アクセス制御の用語および概念について説明します。ここで説明するエンティティ(ユーザー、ロール、プリンシパル、権限、アクセス制御リスト(ACL)およびアクセス制御エントリ(ACE))はそれぞれ、XML文書またはフラグメントとして宣言的に実装されます。

セキュアな認可を行うためには、どのユーザー、アプリケーションまたは関数が、どのような種類の操作を実行するために、どのデータにアクセスできるかを定義することが必要です。つまり、(1)どのユーザーが(2)どの操作を(3)どのデータに対して実行できるか、という3つの局面があります。この3つの局面をそれぞれ、(1)プリンシパル、(2)権限、(3)オブジェクトと呼びます。プリンシパルは、ユーザーまたはロールです。

プリンシパルと権限(局面1と2)は、アクセス制御リストを定義することにより、宣言的に関連付けられます。その後、これらは3番目の局面であるデータに、様々な方法で宣言的または手続き的に関連付けられます。たとえば、Oracle XML DBリポジトリのリソースまたは表データを保護するには、PL/SQLプロシージャDBMS_XDB.setACLを使用して、それを制御するACLを設定します。

プリンシパル: ユーザーまたはロール

ファイングレイン・データベース・アクセス制御との関連において、プリンシパルはユーザーまたはロールです。ユーザーは、データベース内の情報にアクセスする個人またはアプリケーションです。ロールは、ユーザーまたは他のロールで構成されますが、この再帰は循環型にできません。最終的には、各ロール(つまり各プリンシパル)はユーザーのセットに対応します。

ユーザーは、アクセス制御の目的で要素userを持つXMLフラグメントで表されます。ロールは、要素roleを持つフラグメントで表されます。

Oracle Databaseでは、プリンシパルとして次のものをサポートしています。

  • データベース・ユーザーおよびデータベース・ロールデータベース・ユーザーは、データベース・スキーマまたはユーザー・アカウントと呼ばれることもあります。個人またはアプリケーションはデータベースにログオンするとき、データベース・ユーザー(スキーマ)およびパスワードを使用します。データベース・ロールは、データベース・ユーザー、アプリケーションまたは他のデータベース・ロールに付与できるデータベース権限のセットに対応しています(「データベース・ロールによるデータベース権限のユーザーへのマップ」 — を参照)。

  • LDAPユーザーおよびLDAPユーザー・グループ。LDAPプリンシパルの使用方法の詳細は、「Oracle XML DBのLDAPとの統合」を参照してください。

この章で「ユーザー」または「ロール」のように何も付かない語が使用されている場合、その語はすべてのタイプのユーザーまたはロールに適用されます。タイプを区別することが重要な場合は、「データベース」または「LDAP」という語が付いています。

データベース・ロールによるデータベース権限のユーザーへのマップ

データベース・ユーザーに権限を付与できるのと同様、データベース・ロールにも権限が付与されます。データベース・ロールは、データベース権限をデータベース・ユーザー(およびアプリケーション)にマップするための媒介として機能します。つまり、ロールに権限が付与されてから、そのロールがユーザーに付与されます(それによりユーザーに権限が付与されます)。ユーザーのグループと、それらのユーザーに付与された権限のグループとの違いは、データベース・ロールの概念においては少しあいまいです。データベース・ロールによって、ユーザーにマップされた権限をグループ化したり、権限がマップされたユーザーをグループ化したりすることもできるためです。マッピングは、ロールを定義してユーザーに付与することにより行われます。従来のデータベース用語では、ロールを、それに割り当てられた権限のセットと同じものとして考えます。

ファイングレイン・アクセス制御の関連においては、別のメカニズムであるアクセス制御リスト(ACL)が、権限をユーザーにマップする媒介として使用されます。ロールは単なるユーザーのセットです。この場合、権限をユーザーおよびロールに関連付ける操作はデータベース権限ではありません。この操作は、ACLのランタイム評価やACL競合の解消とともに、宣言的なACLエントリです。

混同しないように、この用語の違いに注意してください。権限をユーザーにマップする手段として、アクセス制御では(1)プリンシパル、(2)権限、(3)ACLとして分類されている機能のいくつかは、データベース・ロールではまとめられています。アクセス制御の用語においては、ロールはユーザーとともにプリンシパルとして分類されます。これに対し、従来のデータベース用語においては、ロールは権限のセットとして分類されます。

プリンシパルDAV::owner

プリンシパルDAV::ownerを特定のOracle XML DBリポジトリと組み合せて使用して、リソース所有者を参照できます。リソースの所有者は、リソースのプロパティの1つです。通常、リソースの所有者は特別な権限を持っているため、プリンシパルDAV::ownerを使用すると、プリンシパル間でのACLの共有が簡単になります。

権限

権限とは、プリンシパルに対して付与または拒否される特定の権限です。権限は、集約権限または基本権限になります。

  • 集約権限: 他の権限が含まれる権限。

  • 基本権限: 他の権限は含まれない権限。それ以上分割できません。

集約権限は、権限の数が多くなった場合の操作性を簡略化し、ACLクライアント間の相互運用性を高めます。「権限」を参照してください。

集約権限はそのまま保持され、対応する基本(リーフ)権限に分割されません。WebDAVの用語において、Oracle Databaseの集約権限は抽象的でありません。つまり、集約権限は、それらのコンポーネントのコピーではなく、そのコンポーネント権限へのポインタのセットとして機能します。したがって、コンポーネントの定義が変更された場合でも、集約権限は常に最新の状態を保持します。

プリンシパルに付与された権限のセットによって、プリンシパルが保護するデータに対して特定の操作を実行できるかどうかが制御されます。たとえば、プリンシパル(データベース・ユーザー)HRが特定のリソースに対してread操作を実行するには、読取り操作の前にHRに読取り権限が付与されている必要があります。

アクセス制御エントリ(ACE)

アクセス制御エントリ(ACE)とは、アクセス制御リスト(ACL)内のエントリであるXML要素(ace)のことです。ACEは、特定のプリンシパル(ユーザーまたはロール)によるリポジトリ・リソースまたはその他のデータベース・データへのアクセスを許可または拒否します。ACE自身は、保護対象のデータを指定しません。この指定はACEおよびACLの外側で、ACLをターゲット・データに関連付けることによって行われます。その関連付けを行う方法として、PL/SQLプロシージャDBMS_XDB.setACLを使用する方法があります。

「ACLおよびACEの評価」を参照してください。

Oracle XML DB ACEは、プリンシパルの権限を付与または拒否します。ace要素は、次を含みます。

  • 操作grant: true(grant)またはfalse(deny)アクセスのいずれか。

  • 有効なプリンシパル(要素principal)またはプリンシパルの完了済リスト(要素invert)のいずれか。

  • 権限: 特定のプリンシパルに対して付与または拒否される権限のセット(要素privilege)。

  • プリンシパル書式(オプション): プリンシパルの書式。LDAPの識別名(DN)、短縮名(データベース・ユーザー/ロールまたはLDAPのニックネーム)またはLDAP GUID。デフォルト値はshort nameです。プリンシパル名がデータベース・ユーザーとLDAPニックネームの両方に一致している場合は、LDAPのニックネームを示すとみなされます。

  • コレクション(オプション): プリンシパルがユーザーのコレクション(LDAPグループまたはデータベース・ロール)であるか、単一のユーザー(LDAPまたはデータベース・ユーザー)であるかどうかを指定するBOOLEAN属性。

  • 開始日と終了日(オプション): ACEが有効な期間を定義する属性。「ACE妥当性の期間」を参照してください。

例27-1に、プリンシパルDAV::ownerに権限DAV::allを付与する単純なACEを示します。つまり、ACLが適用されるリソースの所有者にすべての権限を付与します。

例27-1 権限を付与する単純なアクセス制御エントリ(ACE)

<ace>
  <grant>true</grant>
  <principal>DAV::owner</principal>
  <privilege>
    <DAV::all/>
  </privilege>
</ace>

アクセス制御リスト(ACL)

アクセス制御リスト(ACL)とは、アクセス制御エントリ(ACE)のリストです。デフォルトでは、リスト内の順序に意味があります(「ACLおよびACEの評価」を参照)。例27-2に、例27-1のACEのみを含む単純なACLを示します。

例27-2 権限を付与する単純なアクセス制御リスト(ACL)

<acl description="myacl"
     xmlns="http://xmlns.oracle.com/xdb/acl.xsd"
     xmlns:dav="DAV:"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.oracle.com/xdb/acl.xsd
                         http://xmlns.oracle.com/xdb/acl.xsd">
  <ace>
    <grant>true</grant>
    <principal>dav:owner</principal>
    <privilege>
      <dav:all/>
    </privilege>
  </ace>
</acl>

リポジトリ操作のためのデータベース権限

表27-1に、Oracle XML DBリポジトリのリソースに対するいくつかの一般的な操作に必要なデータベース権限を示します。必要な権限列に示された権限の他に、そのリソースが属するフォルダおよびその親フォルダすべて(ルート・フォルダまで)に対するresolve権限が必要です。

表27-1 Oracle XML DBリソースの操作に必要なデータベース権限

操作 説明 必要な権限

CREATE

フォルダFに新しいリソースを作成します。

フォルダFに対するupdateおよびlink

DELETE

フォルダFからリソースRを削除します。

Rに対するupdateおよびunlink-from、フォルダFに対するupdateおよびunlink

UPDATE

リソースRのコンテンツまたはプロパティを更新します。

Rに対するupdate

GET

FTPまたはHTTP(S)によるリソースRの取出し。

Rに対するread-propertiesread-contents

SET_ACL

リソースRのACLを設定します。

Rに対するDAV:write-acl

LIST

フォルダFのリソースをリストします。

フォルダFに対するread-properties、フォルダFのリソースに対するread-properties。ユーザーがread-properties権限を所有しているリソースのみがリストされます。



関連項目:

アップグレードの際のデータベース・アクセス権限の処理の詳細は、「既存のOracle XML DBのインストールのアップグレード」を参照してください。

権限

この項では、Oracle Databaseで提供されている権限について説明します。権限には、WebDAV名前空間であるDAV:脚注1を使用する標準WebDAV権限、およびOracle XML DB ACL名前空間であるhttp://xmlns.oracle.com/xdb/acl.xsd(事前定義された接頭辞xdbが付く)を使用するオラクル固有権限があります。


関連項目:

RFC 3744: 2004年5月の「Web Distributed Authoring and Versioning (WebDAV) Access Control Protocol」の「IETF Network Working Group Request For Comments #3744」を参照してください。

基本権限

表27-2に基本権限を示します。

表27-2 基本権限

基本権限 説明 データベースでの操作

DAV::lock

WebDAVロックを使用してリソースをロックします。

UPDATE

DAV::read-current-user-privilege-set

リソースのDAV::current-user-privilege-setプロパティにアクセスします。

なし

DAV::take-ownership

リソースの所有権を取得します。

なし

DAV::unlock

WebDAVロックを使用してロックされたリソースのロックを解除します。

UPDATE

DAV::write-content

リソースのコンテンツを変更します。

UPDATE

DAV::write-properties

リソースのプロパティを変更します。リソースをロックまたはロック解除します。変更可能なプロパティには、AuthorDisplayNameLanguageCharacterSetContentTypeSBResExtraOwnerOwnerIDCreationDateModification DateACLACLOIDLock、およびLocktokenが含まれます。

UPDATE

xdb:link

リソースからのリンクの作成を可能にします。

INSERT

xdb:link-to

リソースへのリンクの作成を可能にします。

なし

xdb:read-acl

リソースのACLを読み取ります。

SELECT

xdb:read-contents

リソースのコンテンツを読み取ります。

SELECT

xdb:read-properties

リソースのプロパティを読み取ります。

SELECT

xdb:resolve

フォルダを検索します(フォルダの場合のみ)。

SELECT

xdb:unlink

リソースからのリンクの削除を可能にします。

DELETE

xdb:unlink-from

リソースへのリンクの削除を可能にします。

なし

xdb:update-acl

リソースのACLのコンテンツを変更します。

UPDATE

xdb:write-acl-ref

リソースのACLOIDを変更します。

UPDATE


集約権限

表27-3に、集約権限、およびそれらを構成する基本権限を示します。

表27-3 集約権限

集約権限 コンポーネントの基本権限

DAV:all

すべての基本DAV権限

xdb:all

すべての基本DAV権限(xdb:link-toを含む)

DAV::bind

xdb:link

DAV::unbind

xdb:unlink

DAV::read

xdb:read-propertiesxdb:read-contentsxdb:resolve

DAV::read-acl

xdb:read-acl

DAV::write

DAV::write-contentDAV::write-propertiesxdb:linkxdb:unlinkxdb:unlink-from

DAV::write-acl

xdb:write-acl-refxdb:update-acl

DAV::update

DAV::write-contentDAV::write-properties

xdb:update

DAV::write-propertiesDAV::write-content


ACLおよびACE

アクセス制御リスト(ACL)は、Javaなどの言語やMicrosoft Windowsなどのオペレーティング・システムで使用される、標準のセキュリティ・メカニズムです。ACLは、WebDAV標準の一部でもあります。ACLは、リソースを保護するために使用されます。Oracle Databaseの場合、Oracle XML DBリポジトリ内のリソース(ファイルおよびフォルダ)のいずれかです。

リポジトリのリソースには、WebDAVを使用してアクセスできます。リソースを保護するACLは、WebDAV ACLとして機能します。各リポジトリ・リソースは、ACLによって保護されます。リソースを保護するACLは、リソースのアクセス方法(WebDAV、SQL、またはその他の方法)にかかわらず適用されます。

Oracle XML DBリポジトリに新しいリソースが作成されると、デフォルトでは、親フォルダのACLを使用してリソースが保護されます。リソースの作成後に、新しいACLを設定できます。

Oracle Database内のACLは、/sys/schemas/PUBLIC/xmlns.oracle.com/xdb/acl.xsdのOracle XML DBリポジトリにあるOracle Database ACL XMLスキーマに基づいて検証されるXML文書です。ACL自体はリポジトリ内にリソースとして格納され、管理されます。

ACLで保護されたデータに対してプリンシパルが操作を実行する前に、保護されたデータに対するユーザー権限が確認されます。確認される権限は、実行される操作によって異なります。

集約権限は、他の権限で構成されます。ACLが保存されると、そのACLが参照する集約権限は、それらのコンポーネント権限へのポインタのセットとなります。

すべてのACLは、データベース・ユーザーXDBが所有するXDB$ACLという表に格納されます。この表は、XML Schemaに基づくXMLType表です。したがって、この表のすべての行(つまり各ACL)に、OBJECT_IDという名前の列としてアクセスできるシステム生成のオブジェクトID(OID)があります。

Oracle XML DBリポジトリのすべてのリソースには、ACLOIDという名前のプロパティがあります。ACLOIDには、リソースを保護するACLのOIDが格納されます。ACL自身はリソースであり、ACL(たとえば/sys/acls/all_all_acl.xml)のXMLRefプロパティは、ACLの内容を含む表XDB$ACL内の行に対するREFです。これらの2つのプロパティが、Oracle XML DBリソースを格納する表XDB$RESOURCEと表XDB$ACLをリンクしています。


関連項目:


システムACL

一部のACLは事前定義されており、Oracle Databaseで提供されています。これらのACLはシステムACLと呼ばれます。

自己保護型のACL(それ自体の内容によって保護されるACL)は1つしかありません。これはブートストラップACLと呼ばれるシステムACLであり、Oracle XML DBリポジトリの/sys/acls/bootstrap_acl.xmlにあります。ブートストラップACLは、すべてのユーザーにREAD権限を付与します。また、ブートストラップACLは、データベース・ロールXDBADMIN (Oracle XML DB ADMIN)およびDBAFULL ACCESS権を付与します。データベース・ロールXDBADMINは特に、グローバルXML Schemaの登録を必要とするユーザーに役立ちます。

この他に、次のようなACLがあります。いずれもブートストラップACLにより保護されています。

  • all_all_acl.xml: すべての権限をすべてのユーザーに付与します。

  • all_owner_acl.xml: すべての権限をリソースの所有者に付与します。

  • ro_all_acl.xml: read権限をすべてのユーザーに付与します。

システムACLは、ファイル・ネーミング規則<privilege>_<users>_acl.xmlを使用します。ここで<privilege>は付与される権限を示し、<users>はリソースへのアクセスを許可されるユーザーを示します。独自のACLを定義する場合は、任意の名前を使用できます。

ACLおよびACEの評価

プリンシパルが、1つ以上のACLによって保護されたリポジトリ・リソースへのアクセスを許可される前に、権限が確認されます。この確認は、そのプリンシパルのACLの保護を順に評価することによって行われます。このようなACLごとに、プリンシパルに適用されるACEが順に検査されます。

1つのACEが現行ユーザーになんらかの権限を付与し、他のACEがユーザーに対してその権限を拒否すると、競合が発生します。同一のプリンシパルに対するACE間の競合を管理する方法は2つあります。

  • ace-orderと呼ばれるデフォルトの動作では、指定されたプリンシパルに対して発生する最初のACEのみが使用されます。そのプリンシパルに対する追加のACEは無効です。この場合、ACEの順序に意味があります

  • ただし、deny-trumps-grantという代替の動作を使用するようにデータベースを構成できます。この場合、特定のプリンシパルに対して子denyを持つACEはいずれも、そのプリンシパルに対してgrantの子を持つ他のACEの有無にかかわらず、そのプリンシパルへの権限を拒否します。この場合、denyは常にgrantよりも優先され、ACEの順序は関係ありません

構成ファイルxdbconfig.xml内の構成パラメータacl-evaluation-methodace-orderまたはdeny-trumps-grantのいずれかに設定し、ACL評価の動作を構成できます。デフォルトの構成ファイルではace-methodが指定されますが、メソッドが指定されない場合に使用される要素acl-evaluation-methoddeny-trumps-grantです。


注意:

Oracle Database 11gリリース1より前のリリースでは、ACL評価動作は、deny-trumps-grantの1つのみが利用可能でした(ただし、構成ファイル内では指定されません)。

ace-orderをデフォルト動作として使用するように変更すると、データベースのバージョン間でのアップグレードおよびダウングレードに重大な影響を及ぼします。「既存のOracle XML DBのインストールのアップグレード」を参照してください。


ACL検証

ACLは作成されると、ACL用のXML Schemaに基づいて検証され、いくつかの正確性テスト(ACEの開始日と終了日が時間的に矛盾していないことの確認など)が実行されます。ACLの作成時に、ACL間のリレーションについての完全チェックは行われません。たとえば、親ACLが存在しているかどうか、およびそれらが正しいかどうかはチェックされません。(「ACL継承」を参照してください。)

このようなACLの正確性に関する完全なチェックをACL妥当性チェックと呼びます。これをXML Schemaの妥当性と混同しないでください。ACLが(ACLとして)有効になるためには、同時にXML Schemaでも有効である必要がありますが、その逆は言えません。

プリンシパルに操作を行うための適切な権限があるかどうかをチェックするためにACLが評価されるたびに、完全なACL妥当性チェックが実行時に行われます。このチェックによりACLが無効であると判断された場合、そのACLが指定されたプリンシパルに付与するすべての権限は拒否されます。

PL/SQLプロシージャDBMS_XDBZ.validateACLを起動して、ACLの妥当性を、権限確認のための実行時使用とは無関係に確認することもできます。この確認をあらかじめ行うことで、ACLが無効であるためにランタイム・エラーや権限否認が発生することを回避できます。

ACL継承

ACLは、別のACLから権限(プリンシパルと権限のアソシエーション)を継承できます。継承を使用すると、定義の柔軟性が高まり、アクセス制御ポリシーの再利用性が高まります。

権限付与はACEで定義されるので、権限付与の継承には、ACL継承連鎖および関連ACESの検索が含まれます。しかしACL継承およびその結果の権限付与の継承は、再帰的に行われることが可能です。ACL A1がACL A2から継承された場合、A1により定義された権限付与はA2のACEに存在する必要はありません。かわりに、ACL A3のACEにある可能性があります。A2A3から(直接的または間接的に)継承します。

ACL継承は単一であり、多重継承ではありません。つまり、ACLは最大で1つの他のACLからしか継承しません。継承連鎖において循環は許可されていません。つまり、ACL自身から直接的または間接的に継承したACLは無効です。存在しないACLから継承したACLも無効です。

ACLで宣言される権限はACESで明示的に定義される権限です。ACLに宣言される権限はACESで定義され、それによって継承される権限です。

ACL継承には拡張継承と制約継承の2種類があり、それぞれ要素extends-fromまたは要素constrained-withを使用して指定されます。どちらの要素も、継承元のACLを参照します。1つのACLは、最大で1つのextends-fromまたはconstrained-with要素を持つことができます。例27-3extends-from要素を示します。例27-4constrained-with要素を示します。

例27-3 要素extends-from

<extends-from type="simple" href="/sys/acls/extend_acl.xml"/>

例27-4 要素constrained-with

<constrained-with type="simple" href="/sys/acls/constrain_acl.xml"/>

拡張継承は、継承元のACL(親ACL)により定義されているいくつかの権限によって、継承するACL(子ACL)内で宣言されている権限を拡張します。たとえば、ACL A1がACL A2から拡張することを宣言している場合、A1にはA2で定義された権限を含めることができます。

制約継承は、継承するACL内で宣言されている権限を、継承元のACLによっても定義されている権限に制限します。たとえば、ACL A1が制約継承によりACL A2から継承することを宣言している場合、A1内のすべての権限がA2でも定義されている必要があります。

拡張継承は設定されたunion操作であり、制約継承は設定されたintersection操作です。ACL A1がACL A2から拡張する場合、A1とA2の権限を結合して、特定のプリンシパルに特定の権限が付与されているかどうかを判別できます。ACL A1がACL A2によって制約される場合、A1A2の両方に共通の権限のみが権限付与の判別に使用されます。

より正確には、ACL A1がACL A2から継承し、特定のプリンシパルに特定の権限セットが付与されているかどうかを調べるためにA1が確認される場合、判別の処理は次のように実行されます。

  • A1A2から拡張する場合: A1で明示的に宣言されているACEが最初に検査されます。ACEで対象となる権限全部がプリンシパルに付与されているわけではない場合、または権限のいずれかが拒否されている場合、A1の親extending-fromで定義されているACEが検査されます。このため、A2で明示的に宣言されているACEで、対象となる権限全部がプリンシパルに付与されているわけではない場合、または権限のいずれかが拒否されている場合、A2A3から拡張していれば、A3が検査されます。その他の場合も同様です。

  • A1A2により制約される場合: A1で明示的に宣言されているACEと、A2に定義されているACEがそれぞれ個別に検査され、どちらも指定されたプリンシパルに対して対象となる権限全部が付与されていることが確認されます。A2がACL A3により制約される場合も、同じ方法でA2のチェックが行われます。

言い換えると、拡張継承は付与された権限を蓄積し、制約継承は拒否された権限を蓄積します。拡張継承においては、子または親のACLがプリンシパルに権限を付与した場合、その権限が付与されます。制約継承においては、子または親のACLが権限を拒否した場合、その権限は拒否されます。


関連項目:

拡張継承を使用するACLは、例27-5を参照してください。

ACE要素invertでのプリンシパルの補完

別のプリンシパル・セットを補完することによりプリンシパル・セットを定義するほうが便利な場合もあります。ACE要素invertは、この目的で使用します。追加するプリンシパルをすべてリストするのではなく、要素invertを使用して、除外するプリンシパルのリストを囲みます。

例27-5の最初のACEは、IntranetUsers以外のすべてのプリンシパルに対して権限privilege1を拒否しています。(デフォルトで)ACEは出現順に考慮されるため、後続のACEはすべて最初のACEによりオーバーライドされます。このため、プリンシパルNonIntraNetUserは明示的に権限を付与されているにもかかわらず、権限privilege1を拒否されます。

例27-5 要素invertを使用したプリンシパル・セットの補完

<acl description="invert ACL" 
     xmlns="http://xmlns.oracle.com/xdb/acl.xsd"
     xmlns:dav="DAV:" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.oracle.com/xdb/acl.xsd 
                         http://xmlns.oracle.com/xdb/acl.xsd">
  <extends-from type="simple" href="/sys/acls/parent_acl.xml"/>
  <ace>
    <grant>false</grant>
    <invert><principal>dav:owner</principal></invert>
    <privilege><read-contents/></privilege>
  </ace>
  <ace>
    <grant>true</grant>
    <principal>GERONIMO</principal>
    <privilege><read-contents/></privilege>
  </ace>
</acl>

ACE妥当性の期間

(XML SchemaタイプdateTimeの)オプションの属性start_dateおよびend_dateを使用して、ACEの有効期間を定義できます。start_dateが指定されている場合、その日からACEは有効になります。end_dateが指定されている場合、その日からACEは無効になります。end_dateの値は時間的にstart_dateより後の値か、または同じ値である必要があります。そうでない場合、ACEおよびそのACLは無効になります。XML SchemaのdateTime値でタイムゾーンが指定されていない場合、GMT(UTC)が想定されます。例27-6に、開始日と終了日が指定されたACEを示します。

例27-6 開始日と終了日が指定されたACE

<ace start_date="2008-02-12T00:00:00Z" end_date="2008-12-31T00:00:00Z">
  <grant>true</grant>
  <principal>GERONIMO</principal>
  <privilege><read-contents/></privilege>
</ace>

アクセス制御リスト(ACL)の使用

Oracle Databaseのアクセス制御リスト(ACL)はそれ自身がOracle XML DBリポジトリ内のリソースなので、リポジトリのリソースを操作するメソッドはすべてACLにも適用されます。さらに、ACLsinパッケージDBMS_XDBに固有のAPIもいくつかあります。これらのプロシージャやファンクションを使用すると、PL/SQLを使用してOracle XML DBのセキュリティ・メカニズムにアクセスし、特定のACLに基づいてユーザーの権限を確認して、特定のACLやリソースに対して現行ユーザーが所有している権限のセットをリストできます。

DBMS_XDB.CREATERESOURCEを使用したACLの作成

例27-7では、ACLをファイル・リソース/TESTUSER/acl1.xmlとして作成します。リソースに適用されると、このACLはすべての権限をリソースの所有者に付与します。

例27-7 CREATERESOURCEを使用したACLの作成

DECLARE
  b BOOLEAN;
BEGIN
  b := DBMS_XDB.createFolder('/TESTUSER');
  b := DBMS_XDB.createResource(
         '/TESTUSER/acl1.xml', 
         '<acl description="myacl"
               xmlns="http://xmlns.oracle.com/xdb/acl.xsd"
               xmlns:dav="DAV:"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://xmlns.oracle.com/xdb/acl.xsd
                                   http://xmlns.oracle.com/xdb/acl.xsd">
            <ace>
              <grant>true</grant>
              <principal>dav:owner</principal>
              <privilege>
                <dav:all/>
              </privilege>
            </ace>
          </acl>',
         'http://xmlns.oracle.com/xdb/acl.xsd',
         'acl');
END;

注意:

現在のトランザクション中に作成されたACLファイル・リソースを使用する操作を実行する前に、COMMIT操作を実行する必要があります。それまでは、ACLファイルを使用するたびにORA-22881エラー「REFの参照先がありません」が発生します。

リポジトリのパスがある場合のACL文書の取得

例27-8は、ACL文書のOracle XML DBリポジトリ内の場所がわかっている場合にACL文書を取得する方法を示しています。

例27-8 リポジトリのパスがある場合のACL文書の取得

SELECT a.OBJECT_VALUE FROM RESOURCE_VIEW rv, XDB.XDB$ACL a
  WHERE ref(a)
        = XMLCast(XMLQuery('declare default element namespace
                            "http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                            fn:data(/Resource/XMLRef)'
                           PASSING rv.RES RETURNING CONTENT)
                  AS REF XMLType)
    AND equals_path(rv.RES, '/TESTUSER/acl1.xml') = 1;

OBJECT_VALUE
--------------------------------------------------------------------------------
<acl description="myacl" xmlns="http://xmlns.oracle.com/xdb/acl.xsd" xmlns:dav="
DAV:" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://xmlns.oracle.com/xdb/acl.xsd                                    http://xm
lns.oracle.com/xdb/acl.xsd" shared="true">
  <ace>
    <grant>true</grant>
    <principal>dav:owner</principal>
    <privilege>
      <dav:all/>
    </privilege>
  </ace>
</acl>

リソースのACLの設定

例27-9では、リソース/TESTUSER/po1.xmlを作成し、PL/SQLプロシージャDBMS_XDB.setACLを使用してそのACLを/TESTUSER/acl1.xmlに設定します。

例27-9 リソースのACLの設定

DECLARE
  b BOOLEAN;
BEGIN
  b := DBMS_XDB.createResource('/TESTUSER/po1.xml', 'Hello');
END;
/
 
CALL DBMS_XDB.setACL('/TESTUSER/po1.xml', '/TESTUSER/acl1.xml');

ACLの削除

例27-10に、プロシージャDBMS_XDB.deleteResourceを使用してACLを削除する方法を示します。この例では、例27-7で作成したACLを削除します。

例27-10 ACLの削除

CALL DBMS_XDB.deleteResource('/TESTUSER/acl1.xml');

リソースが削除するACLによって保護されている場合は、ACLを削除する前にそのリソースのACLを変更してください。

ACLの更新

ACLの更新は、リソースを更新するための標準メソッドを使用して実行できます。特にACLはXML文書なので、ACLの操作にはOracle SQL関数updateXMLやその他のXML更新関数を使用できます。COMMITは、ACLの変更後に実行する必要があります。

Oracle XML DB ACLは、高速評価のためにキャッシュされます。ACLを更新するトランザクションがコミットされると、Oracle XML DBの構成ファイル/xdbconfig.xmlに指定されたタイムアウトの経過後、既存のデータベース・セッションによって、変更済のACLが取得されます。このtimoutパラメータのXPath位置は、/xdbconfig/sysconfig/acl-max-ageです。値を表す単位は秒です。ACLの変更後に開始されるセッションでは、新しいACLが遅延なしに使用されます。

ACLリソースが非ACLコンテンツで更新される場合、ACLの削除と同じ規則が適用されます。つまり、リソースが更新対象のACLによって保護されている場合は、最初にそのACLを変更してください。


関連項目:

ここでXMLデータの更新に使用されているOracle SQL関数の詳細は、「XMLデータの更新」を参照してください。

FTPまたはWebDAVを使用してACLを更新できます。これらのプロトコルの使用方法の詳細は、第28章「プロトコルを使用したリポジトリへのアクセス」を参照してください。RESOURCE_VIEWを使用して、ACLの更新や、アクセス制御エントリ(ACE)の変更を行えます。

例27-11では、Oracle SQL関数updateXMLを使用して、ACL /TESTUSER/acl1.xmlを完全に置換することによって更新しています。その結果、プリンシパル値DAV::ownerTESTUSERで置換されます。置換ACLの他の部分は以前と同じだからです。

例27-11 アクセス制御リストの更新(置換)

UPDATE RESOURCE_VIEW r
  SET r.RES =
        updateXML(
          r.RES,
          '/r:Resource/r:Contents/a:acl',
          '<acl description="myacl"
                xmlns="http://xmlns.oracle.com/xdb/acl.xsd"
                xmlns:dav="DAV:"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://xmlns.oracle.com/xdb/acl.xsd
                                    http://xmlns.oracle.com/xdb/acl.xsd">
             <ace>
               <grant>true</grant>
               <principal>TESTUSER</principal>
               <privilege>
                 <dav:all/>
               </privilege>
             </ace>
           </acl>',
          'xmlns:r="http://xmlns.oracle.com/xdb/XDBResource.xsd"
           xmlns:a="http://xmlns.oracle.com/xdb/acl.xsd"')
  WHERE equals_path(r.RES, '/TESTUSER/acl1.xml') = 1;

例27-12では、Oracle SQL関数appendChildXMLを使用して、既存のACLにACEを追加しています。このACEは、ユーザーHRに、権限read-propertiesおよびread-contentsを付与します。

例27-12 アクセス制御リストへのACEの追加

UPDATE RESOURCE_VIEW r
  SET r.RES =
        appendChildXML(
          r.RES,
          '/r:Resource/r:Contents/a:acl',
          XMLType('<ace xmlns="http://xmlns.oracle.com/xdb/acl.xsd">
                     <grant>true</grant>
                     <principal>HR</principal>
                     <privilege>
                       <read-properties/>
                       <read-contents/>
                     </privilege>
                   </ace>'),
                  'xmlns:r="http://xmlns.oracle.com/xdb/XDBResource.xsd"
                   xmlns:a="http://xmlns.oracle.com/xdb/acl.xsd"')
  WHERE equals_path(r.RES, '/TESTUSER/acl1.xml') = 1;

例27-13では、Oracle SQL関数deleteXMLを使用して、既存のACLからACEを削除しています。最初のACEは削除されます。

例27-13 アクセス制御リストからのACEの削除

UPDATE RESOURCE_VIEW r
  SET r.RES =
        deleteXML(r.RES,
                  '/r:Resource/r:Contents/a:acl/a:ace[1]',
                  'xmlns:r="http://xmlns.oracle.com/xdb/XDBResource.xsd"
                   xmlns:a="http://xmlns.oracle.com/xdb/acl.xsd"')
  WHERE equals_path(r.RES, '/TESTUSER/acl1.xml') = 1;

指定されたリソースを保護するACL文書の取得

例26-2は、関数DBMS_XDB.getACLDocumentを指標して、指定されたリソースを保護するACL文書を取得する方法を示しています。

例27-14 リソースのACL文書の取得

SELECT XMLSerialize(DOCUMENT DBMS_XDB.getACLDocument('/TESTUSER/po1.xml')
                    AS CLOB)
  FROM DUAL;
 
XMLSERIALIZE(DOCUMENTDBMS_XDB.GETACLDOCUMENT('/TESTUSER/PO1.XML')ASCLOB)
--------------------------------------------------------------------------------
<acl description="myacl" xmlns="http://xmlns.oracle.com/xdb/acl.xsd" xmlns:dav="
DAV:" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://xmlns.oracle.com/xdb/acl.xsd                                     http://x
mlns.oracle.com/xdb/acl.xsd">
  <ace>
    <grant>true</grant>
    <principal>TESTUSER</principal>
    <privilege>
      <dav:all/>
    </privilege>
  </ace>
  <ace xmlns="http://xmlns.oracle.com/xdb/acl.xsd">
    <grant>true</grant>
    <principal>HR</principal>
    <privilege>
      <read-properties/>
      <read-contents/>
    </privilege>
  </ace>
</acl>
 
1 row selected.

特定のリソースに対して現行ユーザーに付与された権限の取得

例27-15に、DBMS_XDB.getPrivilegesファンクションを使用して現行ユーザーに付与された権限を取得する方法を示します。

例27-15 特定のリソースに対して現行ユーザーに付与された権限の取得

SELECT XMLSerialize(DOCUMENT DBMS_XDB.getPrivileges('/TESTUSER/po1.xml')
                    AS CLOB)
  FROM DUAL;
 
XMLSERIALIZE(DOCUMENTDBMS_XDB.GETPRIVILEGES('/TESTUSER/PO1.XML')ASCLOB)
--------------------------------------------------------------------------------
<privilege xmlns="http://xmlns.oracle.com/xdb/acl.xsd" xmlns:xsi="http://www.w3.
org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/xdb/acl
.xsd http://xmlns.oracle.com/xdb/acl.xsd DAV: http://xmlns.oracle.com/xdb/dav.xs
d" xmlns:xdbacl="http://xmlns.oracle.com/xdb/acl.xsd" xmlns:dav="DAV:">
  <read-acl/>
  <dav:execute/>
  <read-contents/>
  <update-acl/>
  <dav:write-content/>
  <dav:read-current-user-privilege-set/>
  <link-to/>
  <resolve/>
  <dav:lock/>
  <unlink-from/>
  <write-config/>
  <dav:write-properties/>
  <dav:unlock/>
  <link/>
  <write-acl-ref/>
  <read-properties/>
  <dav:take-ownership/>
  <unlink/>
</privilege>

1 row selected.

現行ユーザーがリソースに対する権限を所有しているかどうかの確認

例27-16に、DBMS_XDB.checkPrivilegesファンクションを使用して、現行ユーザーがリソースに対する特定の権限セットを所有しているかどうかを確認する方法を示します。ユーザーがその権限を所有している場合、このファンクションは、0(ゼロ)以外の値を戻します。

例27-16 あるリソースに対してユーザーが特定の権限を所有しているかどうかの確認

SELECT DBMS_XDB.checkPrivileges(
         '/TESTUSER/po1.xml',
         XMLType('<privilege
                      xmlns="http://xmlns.oracle.com/xdb/acl.xsd"
                      xmlns:dav="DAV:"
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                      xsi:schemaLocation="http://xmlns.oracle.com/xdb/acl.xsd
                                          http://xmlns.oracle.com/xdb/acl.xsd">
                    <read-contents/>
                    <read-properties/>
                  </privilege>'))
  FROM DUAL;
 
DBMS_XDB.CHECKPRIVILEGES('/TESTUSER/PO1.XML',
---------------------------------------------
                                            1
 
1 row selected.

例27-16では、リソース/TESTUSER/po1.xmlに対するアクセス権限read-contentsおよびread-propertiesが、現行ユーザーに付与されているかどうかを確認しています。戻り値が正の整数であれば、ユーザーがその権限を持っていることを示しています。

ユーザーがACLおよびリソース所有者を使用する権限を所有しているかどうかの確認

ファンクションDBMS_XDB.ACLCheckPrivilegesは、通常、ユーザーによる操作の実行を許可する前に、独自にACLの評価を実行する必要のあるアプリケーションによって使用されます。

例27-17では、ACL /TESTUSER/acl1.xmlにより、権限read-contentsおよびread-propertiesが、現行ユーザーshに付与されているかどうかを確認しています。2番目の引数TESTUSERは、確認時にACLのDAV::ownerに置き換えられたユーザーです。ユーザーshは、指定された権限を付与されたユーザーのいずれにも一致しないため、戻り値はゼロです。

例27-17 ACLCheckPrivilegesを使用したユーザー権限の確認

CONNECT sh
Enter password: <password>

Connected.

SELECT DBMS_XDB.ACLCheckPrivileges(
         '/TESTUSER/acl1.xml',
         'TESTUSER',
         XMLType('<privilege
                      xmlns="http://xmlns.oracle.com/xdb/acl.xsd"
                      xmlns:dav="DAV:"
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                      xsi:schemaLocation="http://xmlns.oracle.com/xdb/acl.xsd
                                          http://xmlns.oracle.com/xdb/acl.xsd">
                    <read-contents/>
                    <read-properties/>
                  </privilege>'))
  FROM DUAL;
 
DBMS_XDB.ACLCHECKPRIVILEGES('/TESTUSER/ACL1.XML','TESTUSER',
------------------------------------------------------------
                                                           0
 
1 row selected.

指定されたリソースを保護するACLのパスの取得

例27-18では、RESOURCE_VIEW問合せを使用して、特定のリソースを保護するACLのパスを取得します。問合せでは、リソースの要素XMLRefおよびACLOIDが、ACLとリソースをリンクしているという事実が使用されます。

例27-18 特定のリソースを保護するACLのパスの取得

SELECT rv1.ANY_PATH
  FROM RESOURCE_VIEW rv1
  WHERE
    XMLCast(XMLQuery('declare default element namespace
                      "http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                      fn:data(/Resource/XMLRef)'
                     PASSING rv1.RES RETURNING CONTENT)
            AS REF XMLType)
    = make_ref(XDB.XDB$ACL,
               (SELECT XMLCast(XMLQuery('declare default element namespace
                                         "http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                                         fn:data(/Resource/ACLOID)'
                                        PASSING rv2.RES RETURNING CONTENT)
                               AS REF XMLType)
                  FROM RESOURCE_VIEW rv2
                  WHERE equals_path(rv2.RES, '/TESTUSER/po1.xml') = 1));

ANY_PATH
------------------
/TESTUSER/acl1.xml

例27-18は、ACLによって保護されたリソースの指定を受けて、ACLへのパスを取得しています。保護されたリソース(r)のACLOIDには、それを保護しているACLリソース(a)のOIDが格納されています。ACLリソースのREFは、保護されたリソースACLOIDにより識別されるオブジェクトのものと同じです。

リソースACLOIDREFは、Oracle SQL関数make_refを使用して取得できます。指定されたOIDを持つオブジェクト行へのREFが戻されます。

この例では、make_refは、リソース/TESTUSER/po1.xmlに対して、OIDが/Resource/ACLOIDである表XDB$ACLの行へのREFを戻しています。内部問合せがリソースのACLOIDを取得します。外部問合せが、対応するACLへのパスを戻します。

指定されたACLによって保護されるすべてのリソースのパスの取得

例27-19では、特定のACLにより保護されているすべてのリソースのパスを取得します。

例27-19 特定のACLによって保護されたすべてのリソースのパスの取得

SELECT rv1.ANY_PATH
  FROM RESOURCE_VIEW rv1
  WHERE make_ref(XDB.XDB$ACL, 
                 XMLCast(XMLQuery('declare default element namespace
                                   "http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                                   fn:data(/Resource/ACLOID)'
                                  PASSING rv1.RES RETURNING CONTENT)
                         AS REF XMLType))
        = (SELECT XMLCast(XMLQuery('declare default element namespace
                                    "http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                                    fn:data(/Resource/XMLRef)'
                                   PASSING rv2.RES RETURNING CONTENT)
                          AS REF XMLType)
             FROM RESOURCE_VIEW rv2
             WHERE equals_path(rv2.RES, '/TESTUSER/acl1.xml') = 1);

ANY_PATH
-----------------
/TESTUSER/po1.xml
 
1 row selected.

例27-19では、パスが/TESTUSER/acl1.xmlであるACLリソースのREFに対してACLOID REFが一致しているリソースへのパスを取得します。ファンクションmake_refはリソースACLOID REFを戻します。

内部問合せは、指定されたACLのREFを取得します。外部問合せは、ACLOID REFが指定されたACLのREFに一致するリソースのパスを選択します。

ACLキャッシング

ACLはその保護対象データへのアクセスのたびに確認されるため、ACLの確認操作のパフォーマンスは、Oracle XML DBリポジトリ・リソースを含むこのようなデータのパフォーマンスにとって重要な問題です。Oracle XML DBでは、このリポジトリ操作に必要なパフォーマンスは、複数のキャッシュを使用することによって達成されます。

ACLは、データベース・インスタンス内のすべてのセッションが共有するキャッシュに保存されます。ACLが更新されると、キャッシュ内のACLエントリが、そのすべての従属オブジェクトとともに無効化されます。ACLが次に使用されるときに、その新しいコピーがキャッシュに入れられます。可能なかぎり、リソース間でACLを共有することをお薦めします。

特定のACLによって特定のユーザーに付与された権限の、セッション固有のキャッシュがあります。このキャッシュのエントリには、Oracle XML DB構成ファイル(/xdbconfig.xml)の要素<acl-max-age>によって、タイムアウト(秒単位)が指定されます。パフォーマンスを最大限にするために、このタイムアウトは可能なかぎり長く設定してください。ただし、この場合トレードオフが存在します。タイムアウトが長いほど、現行セッションが更新されたACLを取り出す時間が長くなります。

Oracle XML DBは、LDAPプリンシパル(LDAPグループまたはユーザー)が設定されたACLの使用時にも、パフォーマンスを向上させるためにキャッシュを保持します。これらのキャッシュの目的は、LDAPサーバーとのネットワーク通信を最小化することです。キャッシュの1つは、LDAP GUIDを対応するLDAPのニックネームおよび識別名(DN)にマップする共有キャッシュです。これは、ACL文書が表示されているとき(または、XMLTypeインスタンスからCLOB値またはVARCHAR2値に変換されているとき)に使用されます。このキャッシュを消去する場合は、プロシージャDBMS_XDBZ.PurgeLDAPCacheを使用します。もう1つのキャッシュは、セッション固有のキャッシュで、LDAPグループをそのメンバー(ネストされたメンバーシップ)にマップします。Oracle XML DBでは、LDAPグループをセッションで最初に検出するたびに、LDAPサーバーからそのグループのネストされたメンバーシップを取得します。そのため、可能なかぎりメンバーとネスト・レベルの少ないグループを使用することをお薦めします。

リポジトリ・リソースおよびデータベース表のセキュリティ

Oracle XML DBリポジトリのリソースには、次の2タイプがあります。

  • LOBベース(コンテンツはリソースの一部であるLOBに格納されます)。アクセスは、リソースを保護するACLによってのみ決定されます。

  • REFベース(コンテンツはXMLであるため、データベース表に格納されます)。ユーザーは、XMLコンテンツが格納されている基礎となる表またはビューに対する適切な権限、およびリソースに対するACLを介した権限を所有している必要があります。

REFベースのリソースのコンテンツは表に格納されるため、その表に対するSQL問合せを使用してこのデータに直接アクセスできます。均一なアクセス制御メカニズムは、アクセスに必要な権限がアクセスの方法(FTP、HTTPまたはSQLなど)に依存しないメカニズムです。ACLを使用した均一なセキュリティ・メカニズムを提供するためには、最初に、表の行を参照するリソースをOracle XML DBに挿入する前に、基礎となる表が階層に対応している必要があります。

XML Schemaの登録により作成されたデフォルト表は、階層対応になっています。つまり、階層の有効化はXML SchemaをOracle XML DBに登録したときのデフォルトの動作です。登録後に階層を有効化することもできます。それにはプロシージャDBMS_XDBZ.enable_hierarchyを使用します。

リソース表で階層を有効にすると、次の動作が行われます。

  • 表の行を参照するリソースのACLOIDおよびOWNERを格納する非表示列が2つ追加されます。

  • その表に行レベルのセキュリティ(RLS)・ポリシーが追加されます。このポリシーは、SELECT文、UPDATE文またはDELETE操作がその表に対して実行されるたびに、ACLを確認します。

  • コンテンツが格納されているXMLType表で表が更新されたとき、それに対応する最後に変更されたリソース情報が常に更新されることを保証する、パス索引トリガーと呼ばれるデータベース・トリガーが作成されます。


関連項目:

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

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


指定された任意の表で、オブジェクトの一部のみがOracle XML DBリソースにマップされることがあります。マップされたオブジェクトのみがACLチェックを受けますが、すべてのオブジェクトに表レベルのセキュリティがあります。


注意:

表外に格納する場合は、XMLType表のデータを他のユーザーに対して非表示にすることはできません。表外のデータは、ACLセキュリティによって保護されません

最適化: 不要な場合にaclベースのセキュリティを適用しない

ACLベースのセキュリティでは、XMLコンテンツへのアクセスを単に表ごとではなく文書ごとに制御できます。PL/SQLプロシージャDBMS_XMLSCHEMA.register_chemaをコールすると、作成される表でACLベースのセキュリティがデフォルトで有効になります。

この効果の1つは、このような表のXMLコンテンツにSQL文を使用してアクセスすると、sys_checkACLへのコールが問合せのWHERE句に自動的に追加されることです。これによって、定義されたACLセキュリティがSQLレベルで適用されます。

ただし、ACLベースのセキュリティを適用すると、SQL問合せのオーバーヘッドが増加します。ACLベースのセキュリティが必要でない場合は、パッケージDBMS_XDBZ内のプロシージャdisable_hierarchyを使用して、ACLによる確認をオフにします。

ACLベースのセキュリティがXMLType表で有効になると、その表に対する問合せの実行計画の出力には、次のようなフィルタが含まれます。

3 - filter(SYS_CHECKACL("ACLOID","OWNERID",xmltype(''<privilege
              xmlns="http://xmlns.oracle.com/xdb/acl.xsd"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://xmlns.oracle.com/xdb/acl.xsd
              http://xmlns.oracle.com/xdb/acl.xsd
              DAV:http://xmlns.oracle.com/xdb/dav.xsd">
                        <read-properties/><read-contents/></privilege>''))=1)

この例のフィルタは、SQL問合せを実行するユーザーに、アクセスする各文書に対するread-contents権限があることを確認します。

DBMX_XDBZ.disable_hierarchyをコールすると、同じ問合せの実行計画では、フィルタにSYS_CHECKACLが表示されません。


関連項目:

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

Oracle XML DBのLDAPとの統合

この項では、LDAPユーザーがACLを含むOracle XML DBの機能を使用できるようにするための処理について説明します。典型的なシナリオでは、単一の共有データベース・スキーマ(ユーザー)に、複数のLDAPユーザーがマップされています。このマッピングは、Oracle Internet Directoryで維持されています。エンド・ユーザーは、LDAPユーザー名およびパスワードを使用して、データベースにログインできます。ログインすると、対応する共有データベース・スキーマに自動的にマップされます。(ログインには、SQLまたはOracle XML DBでサポートされている任意のプロトコルを使用できます。)暗黙的なACL解決は、現行のLDAPユーザーおよび対応するLDAPグループのメンバーシップ情報に基づいています。

Oracle XML DB ACLのプリンシパルとしてLDAPユーザーおよびLDAPグループを使用する場合は、その前に次の条件を満たす必要があります。

  • Oracle Internet Directoryが設定され、データベースがそれに登録されている必要があります。

  • SSL認証がデータベースとOracle Internet Directoryの間に設定されている必要があります。

  • 共有データベース・スキーマに対応するデータベース・ユーザーが作成されている必要があります。

  • Oracle Internet DirectoryでLDAPユーザーが作成され、共有データベース・スキーマにマップされる必要があります。

  • LDAPグループが作成され、そのメンバーが指定されている必要があります。

  • LDAPグループやLDAPユーザーに対してACLが定義され、それを使用してLDAPユーザーがアクセスするリポジトリ・リソースが保護される必要があります。


関連項目:

  • 『Oracle Internet Directory管理者ガイド』

  • SSL認証の設定の詳細は、『Oracle Database Advanced Security管理者ガイド』を参照してください。

  • エンタープライズ(LDAP)ユーザーのための共有データベース・スキーマの使用方法の詳細は、『Oracle Databaseエンタープライズ・ユーザー・セキュリティ管理者ガイド』を参照してください。


例27-20は、LDAPユーザーのACLを示しています。要素<principal>にはLDAPユーザーの完全識別名(この場合cn=user1,ou=Americas,o=oracle,l=redwoodshores,st=CA,c=US)が含まれています。

例27-20 LDAPユーザーを参照するACL

<acl description="/public/txmlacl1/acl1.xml"
     xmlns="http://xmlns.oracle.com/xdb/acl.xsd" xmlns:dav="DAV:"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.oracle.com/xdb/acl.xsd 
                         http://xmlns.oracle.com/xdb/acl.xsd">
  <ace principalFormat="DistinguishedName"> 
    <grant>true</grant>
    <principal>cn=user1,ou=Americas,o=oracle,l=redwoodshores,st=CA,c=US
    </principal>
    <privilege>
      <dav:all/>
    </privilege>
  </ace> 
</acl>

関連項目:

LDAPユーザー識別名の形式については『Oracle Internet Directory管理者ガイド』

例27-21は、LDAPグループのACLを示しています。要素<principal>には、LDAPグループの完全識別名が含まれています。

例27-21 LDAPグループを参照するACL

<acl xmlns="http://xmlns.oracle.com/xdb/acl.xsd" xmlns:dav="DAV:"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.oracle.com/xdb/acl.xsd 
                         http://xmlns.oracle.com/xdb/acl.xsd">
  <ace principalFormat="DistinguishedName"> 
    <grant>true</grant>
    <principal>cn=grp1,ou=Americas,o=oracle,l=redwoodshores,st=CA,c=US</principal>
    <privilege>
      <dav:read/>
    </privilege>
  </ace> 
</acl>

関連項目:

LDAPグループ識別名の形式については『Oracle Internet Directory管理者ガイド』



脚注の凡例

脚注1: コロン(:)は名前空間名の一部です。DAV:は、接頭辞ではなく、名前空間そのものです。名前空間DAV:に広く使用される接頭辞はdavですが、これは慣例的なものにすぎません。davは、Oracle XML DBで事前定義されている接頭辞ではありません。