27 リポジトリのアクセス制御
Oracle Databaseでは、データベース・ユーザーが行レベルおよび列レベルでセキュアにアクセスできるなど、従来型のデータベース・セキュリティが提供されています。また、Oracle XML DBリポジトリ内のリソースに対するファイングレイン・アクセス制御も提供されています。アクセス制御リスト(ACL)を作成、設定および変更できます。
- アクセス制御の概念
アクセス制御の用語および概念について説明します。アクセス制御エンティティ(ユーザー、ロール、プリンシパル、権限、アクセス制御リスト(ACL)およびアクセス制御エントリ(ACE))はそれぞれ、XML文書またはフラグメントとして宣言的に実装されます。 - リポジトリ操作のためのデータベース権限
Oracle XML DBリポジトリのリソースに対する一般的な操作に必要なデータベース権限について説明します。 - 権限
Oracle Databaseに提供される権限には、標準のWebDAV権限とOracle固有の権限があります。 - ACLおよびACE
ACLは、リソースを保護するために使用されます。Oracle Databaseの場合、Oracle XML DBリポジトリ内のリソース(ファイルおよびフォルダ)です。ACLはACEで構成されます。 - アクセス制御リスト(ACL)の使用の概要
Oracle Databaseのアクセス制御リスト(ACL)はそれ自身がOracle XML DBリポジトリ内のリソースなので、リポジトリのリソースを操作するメソッドはすべてACLにも適用されます。さらに、PL/SQLパッケージDBMS_XDB_REPOS
のACLに固有のAPIもいくつかあります。 - ACLキャッシング
ACLはその保護対象データへのアクセスのたびに確認されるため、ACLの確認操作のパフォーマンスは、Oracle XML DBリポジトリ・リソースを含むこのようなデータのパフォーマンスにとって重要な問題です。Oracle XML DBでは、このリポジトリ操作に必要なパフォーマンスは、複数のキャッシュを使用することによって達成されます。 - リポジトリ・リソースおよびデータベース表のセキュリティ
REF
ベースのリポジトリ・リソースの格納に使用される表の階層を有効にすることによって、これらのリソースへのアクセスに均一なセキュリティ・メカニズムが提供されます。特定のリソースについてACLベースのセキュリティが必要ない場合は、PL/SQLプロシージャDBMS_XDBZ.disable_hierarchy
を使用してACLチェックを無効にすることによってそれらのアクセスを最適化できます。 - Oracle XML DBのLDAPとの統合
Lightweight Directory Access Protocol (LDAP)ユーザーにOracle XML DB機能(ACLを含む)の使用を許可できます。
関連項目:
-
WebDAVの詳細は、プロトコルを使用したリポジトリへのアクセスを参照してください。
-
リソース・セキュリティの構成と管理の詳細は、Oracle XML DBの管理を参照してください。
-
リソース・セキュリティの管理に使用できるPL/SQL APIの詳細は、PL/SQL API for XMLType: リファレンスを参照してください。
親トピック: Oracle XML DBリポジトリ
27.1 アクセス制御の概念
アクセス制御の用語および概念について説明します。アクセス制御エンティティ(ユーザー、ロール、プリンシパル、権限、アクセス制御リスト(ACL)およびアクセス制御エントリ(ACE))はそれぞれ、XML文書またはフラグメントとして宣言的に実装されます。
セキュアな認可を行うためには、どのユーザー、アプリケーションまたは関数が、どのような種類の操作を実行するために、どのデータにアクセスできるかを定義することが必要です。つまり、(1)どのユーザーが(2)どの操作を(3)どのデータに対して実行できるか、という3つの局面があります。この3つの局面をそれぞれ、(1)プリンシパル、(2)権限、(3)オブジェクトと呼びます。プリンシパルは、ユーザーまたはロールです。
プリンシパルと権限(局面1と2)は、アクセス制御リストを定義することにより、宣言的に関連付けられます。その後、これらは3番目の局面であるデータに、様々な方法で宣言的または手続き的に関連付けられます。たとえば、Oracle XML DBリポジトリのリソースまたは表データを保護するには、PL/SQLプロシージャDBMS_XDB_REPOS.setACL
を使用して、それを制御するACLを設定します。
- ADF認証および認可
認証とは、何かのアイデンティティ(ユーザー、デバイス、アプリケーションなど)を検証することです。認可とは、認証されたものが別の何か(データベース表やWebDAVリソースなど)に対するアクセスを許可されているかどうかを検証することです。 - プリンシパル: ユーザーまたはロール
ファイングレイン・データベース・アクセス制御のコンテキストにおいては、プリンシパルは、最終的にデータベース内の情報にアクセスする1人以上の個人または1つ以上のアプリケーションのセットです。プリンシパルには、データベースのユーザーやロールまたはLDAPのユーザーやグループを指定できます。 - 権限
権限とは、プリンシパルに対して付与または拒否される特定の権限です。権限は、集約権限または基本権限になります。集約権限にはその他の権限が含まれますが、基本権限には含まれません。 - アクセス制御エントリ(ACE)
アクセス制御エントリ(ACE)とは、アクセス制御リスト(ACL)内のエントリであるXML要素(ace
)のことです。ACEは、特定のプリンシパルによるリポジトリ・リソースまたはその他のデータベース・データへのアクセスを許可または拒否します。 - アクセス制御リスト(ACL)
アクセス制御リスト(ACL)とは、アクセス制御エントリ(ACE)のリストです。デフォルトでは、リストの順序には意味があります。
親トピック: リポジトリのアクセス制御
27.1.1 認証と認可
認証とは、何かのアイデンティティ(ユーザー、デバイス、アプリケーションなど)を検証することです。認可とは、認証されたものが別の何か(データベース表やWebDAVリソースなど)に対するアクセスを許可されているかどうかを検証することです。
Oracle XML DBリポジトリ・リソースにアクセスする場合、様々な種類のプリンシパルを認可できます。アプリケーション固有のプリンシパルを認証できます。
関連トピック
親トピック: アクセス制御の概念
27.1.2 プリンシパル: ユーザーまたはロール
ファイングレイン・データベース・アクセス制御のコンテキストにおいては、プリンシパルは、最終的にデータベース内の情報にアクセスする1人以上の個人または1つ以上のアプリケーションのセットです。プリンシパルには、データベースのユーザーやロールまたはLDAPのユーザーやグループを指定できます。
プリンシパルはユーザーまたはロールです。ユーザーは、データベース内の情報にアクセスする個人またはアプリケーションです。ロールは、ユーザーまたは他のロールで構成されますが、この再帰は循環型にできません。最終的には、各ロール(つまり各プリンシパル)はユーザーのセットに対応します。
ユーザーは、アクセス制御の目的で要素user
を持つXMLフラグメントで表されます。ロールは、要素role
を持つフラグメントで表されます。
Oracle Databaseでは、プリンシパルとして次のものをサポートしています。
-
データベース・ユーザーおよびデータベース・ロール。データベース・ユーザーは、データベース・スキーマまたはユーザー・アカウントと呼ばれることもあります。個人またはアプリケーションはデータベースにログオンするとき、データベース・ユーザー(スキーマ)およびパスワードを使用します。データベース・ロールは、データベース・ユーザー、アプリケーション、またはその他のデータベース・ロールに付与できるデータベース権限のセットに対応します。
-
LDAPユーザーおよびLDAPユーザー・グループ。LDAPプリンシパルの使用方法の詳細は、Oracle XML DBのLDAPとの統合を参照してください。
ここで「ユーザー」または「ロール」のように何も付かない語が使用されている場合、それはすべてのタイプのユーザーまたはロールに適用されます。タイプを区別することが重要な場合は、「データベース」または「LDAP」という語が付いています。
- データベース・ロールおよびACLによる権限のユーザーへのマップ
データベース・ロールは、ユーザーに権限をマップします。ファイングレイン・アクセス制御のコンテキストにおいては、権限はACLによってユーザーにマップされ、ロールは単なる一連のユーザーです。 - プリンシパルDAV::owner
プリンシパルDAV::owner
を使用して、指定したリポジトリ・リソースの所有者を参照できます。リソースの所有者は、リソースのプロパティの1つです。通常、リソースの所有者は特別な権限を持っているため、プリンシパルDAV::owner
を使用すると、プリンシパル間でのACLの共有が簡単になります。
親トピック: アクセス制御の概念
27.1.2.1 データベース・ロールおよびACLによる権限のユーザーへのマップ
データベース・ロールは、ユーザーに権限をマップします。ファイングレイン・アクセス制御のコンテキストにおいては、権限はACLによってユーザーにマップされ、ロールは単なる一連のユーザーです。
データベース・ユーザーに権限を付与できるのと同様、データベース・ロールにも権限が付与されます。データベース・ロールは、データベース権限をデータベース・ユーザー(およびアプリケーション)にマップするための媒介として機能します。つまり、ロールに権限が付与されてから、そのロールがユーザーに付与されます(それによりユーザーに権限が付与されます)。
ユーザーのグループと、それらのユーザーに付与された権限のグループとの違いは、データベース・ロールの概念においては少しあいまいです。データベース・ロールによって、ユーザーにマップされた権限をグループ化したり、権限がマップされたユーザーをグループ化したりすることもできるためです。マッピングは、ロールを定義してユーザーに付与することにより行われます。従来のデータベース用語では、ロールを、それに割り当てられた権限のセットと同じものとして考えます。
ファイングレイン・アクセス制御の関連においては、別のメカニズムであるアクセス制御リスト(ACL)が、権限をユーザーにマップする媒介として使用されます。ロールは単なるユーザーのセットです。この場合、権限をユーザーおよびロールに関連付ける操作はデータベース権限ではありません。この操作は、ACLのランタイム評価やACL競合の解消とともに、宣言的なACLエントリです。
混同しないように、この用語の違いに注意してください。権限をユーザーにマップする手段として、アクセス制御では(1)プリンシパル、(2)権限、(3)ACLとして分類されている機能のいくつかは、データベース・ロールではまとめられています。アクセス制御の用語においては、ロールはユーザーとともにプリンシパルとして分類されます。これに対し、従来のデータベース用語においては、ロールは権限のセットとして分類されます。
親トピック: プリンシパル: ユーザーまたはロール
27.1.2.2 プリンシパルDAV::owner
プリンシパルDAV::owner
を使用して、指定したリポジトリ・リソースの所有者を参照できます。リソースの所有者は、リソースのプロパティの1つです。通常、リソースの所有者は特別な権限を持っているため、プリンシパルDAV::owner
を使用すると、プリンシパル間でのACLの共有が簡単になります。
親トピック: プリンシパル: ユーザーまたはロール
27.1.3 権限
権限とは、プリンシパルに対して付与または拒否される特定の権限です。権限は、集約権限または基本権限になります。集約権限にはその他の権限が含まれますが、基本権限には含まれません。
-
集約権限: 他の権限が含まれる権限。
-
基本権限: 他の権限は含まれない権限。それ以上分割できません。
集約権限は、権限の数が多くなった場合の操作性を簡略化し、ACLクライアント間の相互運用性を高めます。
集約権限はそのまま保持され、対応する基本(リーフ)権限に分割されません。WebDAVの用語において、Oracle Databaseの集約権限は抽象的でありません。つまり、集約権限は、それらのコンポーネントのコピーではなく、そのコンポーネント権限へのポインタのセットとして機能します。したがって、コンポーネントの定義が変更された場合でも、集約権限は常に最新の状態を保持します。
プリンシパルに付与された権限のセットによって、プリンシパルが保護するデータに対して特定の操作を実行できるかどうかが制御されます。たとえば、プリンシパル(データベース・ユーザー)HR
が特定のリソースに対してread
操作を実行するには、読取り操作の前にHR
に読取り権限が付与されている必要があります。
27.1.4 アクセス制御エントリ(ACE)
アクセス制御エントリ(ACE)とは、アクセス制御リスト(ACL)内のエントリであるXML要素(ace
)のことです。ACEは、特定のプリンシパルによるリポジトリ・リソースまたはその他のデータベース・データへのアクセスを許可または拒否します。
ACE自身は、保護対象のデータを指定しません。この指定はACEおよびACLの外側で、ACLをターゲット・データに関連付けることによって行われます。その関連付けを行う方法として、PL/SQLプロシージャDBMS_XDB_REPOS.setACL
を使用する方法があります。
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
属性。
例27-1に、プリンシパルDAV::owner
に権限DAV::all
を付与する単純なACEを示します。つまり、ACLが適用されるリソースの所有者にすべての権限を付与します。
例27-1 権限を付与する単純なアクセス制御エントリ(ACE)
<ace>
<grant>true</grant>
<principal>DAV::owner</principal>
<privilege>
<DAV::all/>
</privilege>
</ace>
関連トピック
親トピック: アクセス制御の概念
27.1.5 アクセス制御リスト(ACL)
アクセス制御リスト(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.2 リポジトリ操作のためのデータベース権限
Oracle XML DBリポジトリのリソースに対する一般的な操作に必要なデータベース権限について説明します。
表27-1に、Oracle XML DBリポジトリのリソースに対するいくつかの一般的な操作に必要なデータベース権限を示します。必要な権限列に示された権限の他に、そのリソースが属するフォルダおよびその親フォルダすべて(ルート・フォルダまで)に対するresolve
権限が必要です。
表27-1 Oracle XML DBリソースの操作に必要なデータベース権限
操作 | 説明 | 必要な権限 |
---|---|---|
|
フォルダFに新しいリソースを作成します。 |
フォルダFに対する |
|
フォルダFからリソースRを削除します。 |
Rに対する |
|
リソースRのコンテンツまたはプロパティを更新します。 |
Rに対する |
|
FTPまたはHTTP(S)によるリソースRの取出し。 |
Rに対する |
|
リソースRのACLを設定します。 |
Rに対する |
|
フォルダFのリソースをリストします。 |
フォルダFに対する |
関連項目:
アップグレードの際のデータベース・アクセス権限の処理の詳細は、既存のOracle XML DBのインストールのアップグレードまたはダウングレードを参照してください。
親トピック: リポジトリのアクセス制御
27.3 権限
Oracle Databaseに提供される権限には、標準のWebDAV権限とOracle固有の権限があります。
標準のWebDAV権限では、WebDAV名前空間DAV:
脚注1を使用します。Oracle固有の権限では、事前定義された接頭辞xdb
を含むOracle XML DB ACL名前空間(http://xmlns.oracle.com/xdb/acl.xsd
)を使用します。
- 基本権限
基本権限には、他の権限は含まれません。リポジトリ操作に使用可能な基本権限について説明し、そのデータベースでの操作をリストします。 - 集約権限
集約権限には、他の権限(基本または集約)が含まれます。リポジトリ操作に使用可能な集約権限をそのコンポーネントの基本権限とともにリストします。
関連項目:
RFC 3744: 2004年5月の「Web Distributed Authoring and Versioning (WebDAV) Access Control Protocol」の「IETF Network Working Group Request For Comments #3744」を参照してください。
親トピック: リポジトリのアクセス制御
27.3.1 基本権限
基本権限には、他の権限は含まれません。リポジトリ操作に使用可能な基本権限について説明し、そのデータベースでの操作をリストします。
表27-2 基本権限
基本権限 | 説明 | データベースでの操作 |
---|---|---|
|
WebDAVロックを使用してリソースをロックします。 |
|
|
リソースの |
該当なし |
|
リソースの所有権を取得します。 |
該当なし |
|
WebDAVロックを使用してロックされたリソースのロックを解除します。 |
|
|
リソースのコンテンツを変更します。 |
|
|
リソースのプロパティを変更します。リソースをロックまたはロック解除します。変更可能なプロパティには、 |
|
|
リソースからのリンクの作成を可能にします。 |
|
|
リソースへのリンクの作成を可能にします。 |
該当なし |
|
リソースのACLを読み取ります。 |
|
|
リソースのコンテンツを読み取ります。 |
|
|
リソースのプロパティを読み取ります。 |
|
|
フォルダを検索します(フォルダの場合のみ)。 |
|
|
リソースからのリンクの削除を可能にします。 |
|
|
リソースへのリンクの削除を可能にします。 |
該当なし |
|
リソースのACLのコンテンツを変更します。 |
|
|
リソースのACLOIDを変更します。 |
|
親トピック: 権限
27.3.2 集約権限
集約権限には、他の権限(基本または集約)が含まれます。リポジトリ操作に使用可能な集約権限をそのコンポーネントの基本権限とともにリストします。
表27-3 集約権限
集約権限 | コンポーネントの基本権限 |
---|---|
|
すべての基本DAV権限 |
|
すべての基本DAV権限( |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
親トピック: 権限
27.4 ACLおよびACE
ACLは、リソースを保護するために使用されます。Oracle Databaseの場合、Oracle XML DBリポジトリ内のリソース(ファイルおよびフォルダ)です。ACLはACEで構成されます。
アクセス制御リスト(ACL)は、Javaなどの言語やMicrosoft Windowsなどのオペレーティング・システムで使用される、標準のセキュリティ・メカニズムです。ACLは、WebDAV標準の一部でもあります。
リポジトリのリソースには、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 XML Schemaについては、「acl.xsd: ACLのXML Schema」を参照してください。
- システムACL
事前定義され、Oracle Databaseで提供されているシステムACLについて説明します。 - ACLおよびACEの評価
プリンシパルが、ACLによって保護されたリポジトリ・リソースへのアクセスを許可される前に、権限が確認されます。この確認は、そのプリンシパルのACLの保護を順に評価することによって行われます。このようなACLごとに、プリンシパルに適用されるACEが順に検査されます。 - ACL検証
ACLは作成されると、ACL用のXML Schemaに基づいて検証され、いくつかの正確性テスト(ACEの開始日と終了日が時間的に矛盾していないことの確認など)が実行されます。ACLの作成時に、ACL間のリレーションについての完全チェックは行われません。 - 要素invert: ACEでのプリンシパルの補完
別のプリンシパル・セットを補完することによりプリンシパル・セットを定義するほうが便利な場合もあります。ACE要素invert
は、この目的で使用します。追加するプリンシパルをすべてリストするのではなく、要素invert
を使用して、除外するプリンシパルのリストを囲みます。
親トピック: リポジトリのアクセス制御
27.4.1 システムACL
事前定義され、Oracle Databaseで提供されているシステム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)およびDBA
にFULL 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
27.4.2 ACLおよびACEの評価
プリンシパルが、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-method
をace-order
またはdeny-trumps-grant
のいずれかに設定し、ACL評価の動作を構成できます。デフォルトの構成ファイルではace-method
が指定されますが、メソッドが指定されない場合に使用される要素acl-evaluation-method
はdeny-trumps-grant
です。
注意:
Oracle Database 11gリリース1より前のリリースでは、ACL評価動作は、deny-trumps-grant
の1つのみが利用可能でした(ただし、構成ファイル内では指定されません)。
ace-order
をデフォルト動作として使用するように変更すると、データベースのバージョン間でのアップグレードおよびダウングレードに重大な影響を及ぼします。既存のOracle XML DBのインストールのアップグレードまたはダウングレードを参照してください。
親トピック: ACLおよびACE
27.4.3 ACL検証
ACLは作成されると、ACL用のXML Schemaに基づいて検証され、いくつかの正確性テスト(ACEの開始日と終了日が時間的に矛盾していないことの確認など)が実行されます。ACLの作成時に、ACL間のリレーションについての完全チェックは行われません。
このようなACLの正確性に関する完全なチェックをACL妥当性チェックと呼びます。これをXML Schemaの妥当性と混同しないでください。ACLが(ACLとして)有効になるためには、同時にXML Schemaでも有効である必要がありますが、その逆は言えません。
プリンシパルに操作を行うための適切な権限があるかどうかをチェックするためにACLが評価されるたびに、完全なACL妥当性チェックが実行時に行われます。このチェックによりACLが無効であると判断された場合、そのACLが指定されたプリンシパルに付与するすべての権限は拒否されます。
親トピック: ACLおよびACE
27.4.4 要素invert: ACEでのプリンシパルの補完
別のプリンシパル・セットを補完することによりプリンシパル・セットを定義するほうが便利な場合もあります。ACE要素invert
は、この目的で使用します。追加するプリンシパルをすべてリストするのではなく、要素invert
を使用して、除外するプリンシパルのリストを囲みます。
例27-3の最初のACEは、IntranetUsers
以外のすべてのプリンシパルに対して権限privilege1
を拒否しています。(デフォルトで)ACEは出現順に考慮されるため、後続のACEはすべて最初のACEによりオーバーライドされます。このため、プリンシパルNonIntraNetUser
は明示的に権限を付与されているにもかかわらず、権限privilege1
を拒否されます。
例27-3 要素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>
親トピック: ACLおよびACE
27.5 アクセス制御リスト(ACL)の使用の概要
Oracle Databaseのアクセス制御リスト(ACL)はそれ自身がOracle XML DBリポジトリ内のリソースなので、リポジトリのリソースを操作するメソッドはすべてACLにも適用されます。さらに、PL/SQLパッケージDBMS_XDB_REPOS
のACLに固有のAPIもいくつかあります。
これらのACLプロシージャや関数を使用すると、PL/SQLを使用してOracle XML DBのセキュリティ・メカニズムにアクセスし、特定のACLに基づいてユーザーの権限を確認して、特定のACLやリソースに対して現行ユーザーが所有している権限のセットをリストできます。
- DBMS_XDB_REPOS.CREATERESOURCEを使用したACLの作成
DBMS_XDB_REPOS.createResource
を使用してACLを作成する例を示します。 - リポジトリのパスがある場合のACL文書の取得
ACL文書のOracle XML DBリポジトリ内の場所がわかっている場合にACL文書を取得する例を示します。 - リソースのACLの設定
PL/SQLプロシージャDBMS_XDB_REPOS.setACL
を使用して、リソースのACLを設定する例を示します。 - ACLの削除
PL/SQLプロシージャDBMS_XDB_REPOS.deleteResource
を使用して、ACLを削除する例を示します。 - ACLの更新
ACLの更新は、リソースを更新するための標準メソッドを使用して実行できます。特にACLはXML文書なので、ACLの操作にはOracle SQL/XML関数XMLQuery
とXQuery Updateを使用できます。COMMIT
は、ACLの変更後に実行する必要があります。 - 指定されたリソースを保護するACL文書の取得
PL/SQLファンクションDBMS_XDB_REPOS.getACLDocument
を使用して、指定されたリソースを保護するACL文書を取得する例を示します。 - 特定のリソースに対して現行ユーザーに付与された権限の取得
PL/SQLファンクションDBMS_XDB_REPOS.getPrivileges
を使用して、現行ユーザーに付与された権限を取得する例を示します。 - 現行ユーザーがリソースに対する権限を所有しているかどうかの確認
PL/SQLファンクションDBMS_XDB_REPOS.checkPrivileges
を使用して、現行ユーザーがリソースに対する特定の権限セットを所有しているかどうかを確認する例を示します。ユーザーがその権限を所有している場合、この関数は、ゼロ以外の値を戻します。 - ユーザーがACLおよびリソース所有者を使用する権限を所有しているかどうかの確認
ファンクションDBMS_XDB_REPOS.ACLCheckPrivileges
は、通常、ユーザーによる操作の実行を許可する前に、独自にACLの評価を実行する必要のあるアプリケーションによって使用されます。 - 特定のリソースを保護するACLのパスの取得
RESOURCE_VIEW
問合せを使用して、指定されたリソースを保護するACLのパスを取得する例を示します。この問合せでは、リソースの要素XMLRef
およびACLOID
が、ACLとリソースをリンクしていることを前提として使用しています。 - 指定されたACLによって保護されるすべてのリソースのパスの取得
指定されたACLによって保護されるすべてのリソースのパスを取得する例を示します。
関連トピック
親トピック: リポジトリのアクセス制御
27.5.1 DBMS_XDB_REPOS.CREATERESOURCEを使用したACLの作成
DBMS_XDB_REPOS.createResource
を使用してACLを作成する例を示します。
例27-4では、ACLをファイル・リソース/TESTUSER/acl1.xml
として作成します。リソースに適用されると、このACLはすべての権限をリソースの所有者に付与します。
注意:
現在のトランザクション中に作成されたACLファイル・リソースを使用する操作を実行する前に、COMMIT
操作を実行する必要があります。それまでは、ACLファイルを使用するたびにORA-22881エラー「REFの参照先がありません」が発生します。
例27-4 CREATERESOURCEを使用したACLの作成
DECLARE
b BOOLEAN;
BEGIN
b := DBMS_XDB_REPOS.createFolder('/TESTUSER');
b := DBMS_XDB_REPOS.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)の使用の概要
27.5.2 リポジトリのパスがある場合のACL文書の取得
ACL文書のOracle XML DBリポジトリ内の場所がわかっている場合にACL文書を取得する例を示します。
例27-5 リポジトリのパスがある場合の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.5.3 リソースのACLの設定
PL/SQLプロシージャDBMS_XDB_REPOS.setACL
を使用して、リソースのACLを設定する例を示します。
例27-6では、リソース/TESTUSER/po1.xml
を作成し、PL/SQLプロシージャDBMS_XDB_REPOS.setACL
を使用してそのACLを/TESTUSER/acl1.xml
に設定します。
例27-6 リソースのACLの設定
DECLARE
b BOOLEAN;
BEGIN
b := DBMS_XDB_REPOS_REPOS.createResource('/TESTUSER/po1.xml', 'Hello');
END;
/
CALL DBMS_XDB_REPOS_REPOS.setACL('/TESTUSER/po1.xml',
'/TESTUSER/acl1.xml');
親トピック: アクセス制御リスト(ACL)の使用の概要
27.5.4 ACLの削除
PL/SQLプロシージャDBMS_XDB_REPOS.deleteResource
を使用して、ACLを削除する例を示します。
例27-7 ACLの削除
CALL DBMS_XDB_REPOS_REPOS.deleteResource('/TESTUSER/acl1.xml');
親トピック: アクセス制御リスト(ACL)の使用の概要
27.5.5 ACLの更新
ACLの更新は、リソースを更新するための標準メソッドを使用して実行できます。特にACLはXML文書なので、ACLの操作にはOracle SQL/XML関数XMLQuery
とXQuery Updateを使用できます。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を更新できます。これらのプロトコルの使用方法の詳細は、プロトコルを使用したリポジトリへのアクセスを参照してください。RESOURCE_VIEW
を使用して、ACLの更新や、アクセス制御エントリ(ACE)の変更を行えます。
例27-8では、SQL/XML関数XMLQuery
をXQuery Updateとともに使用して、ACL /TESTUSER/acl1.xml
を完全に置換することによって更新しています。その結果、プリンシパル値DAV::owner
がTESTUSER
で置換されます。置換ACLの他の部分は以前と同じだからです。
例27-9では、XQuery Updateを使用して、既存のACLにACEを追加しています。このACEは、ユーザーHR
に、権限read-properties
およびread-contents
を付与します。
例27-10では、XQuery Updateを使用して、ACLからACEを削除しています。最初のACEは削除されます。
例27-8 アクセス制御リストの更新(置換)
UPDATE RESOURCE_VIEW r
SET r.RES =
XMLQuery(
'declare namespace r="http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
declare namespace a="http://xmlns.oracle.com/xdb/acl.xsd"; (: :)
copy $i := $p1 modify
(for $j in $i/r:Resource/r:Contents/a:acl
return replace node $j with $p2)
return $i'
PASSING r.RES AS "p1",
'<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>' AS "p2"
RETURNING CONTENT)
WHERE equals_path(r.RES, '/TESTUSER/acl1.xml') = 1;
例27-9 アクセス制御リストへのACEの追加
UPDATE RESOURCE_VIEW r SET r.RES = XMLQuery('declare namespace r="http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :) declare namespace a="http://xmlns.oracle.com/xdb/acl.xsd"; (: :) copy $i := $p1 modify (for $j in $i/r:Resource/r:Contents/a:acl return insert nodes $p2 as last into $j) return $i' PASSING r.RES AS "p1", XMLType('<ace xmlns="http://xmlns.oracle.com/xdb/acl.xsd"> <grant>true</grant> <principal>HR</principal> <privilege> <read-properties/> <read-contents/> </privilege> </ace>') as "p2" RETURNING CONTENT) WHERE equals_path(r.RES, '/TESTUSER/acl1.xml') = 1;
例27-10 アクセス制御リストからのACEの削除
UPDATE RESOURCE_VIEW r SET r.RES = XMLQuery('declare namespace r="http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :) declare namespace a="http://xmlns.oracle.com/xdb/acl.xsd"; (: :) copy $i := $p modify delete nodes $i/r:Resource/r:Contents/a:acl/a:ace[1] return $i' PASSING r.RES AS "p" RETURNING CONTENT) WHERE equals_path(r.RES, '/TESTUSER/acl1.xml') = 1;
親トピック: アクセス制御リスト(ACL)の使用の概要
27.5.6 指定されたリソースを保護するACL文書の取得
PL/SQLファンクションDBMS_XDB_REPOS.getACLDocument
を使用して、指定されたリソースを保護するACL文書を取得する例を示します。
関連項目:
例27-11 リソースのACL文書の取得
SELECT XMLSerialize(DOCUMENT DBMS_XDB_REPOS.getACLDocument('/TESTUSER/po1.xml')
AS CLOB)
FROM DUAL;
XMLSERIALIZE(DOCUMENTDBMS_XDB_REPOS.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.
親トピック: アクセス制御リスト(ACL)の使用の概要
27.5.7 特定のリソースに対して現行ユーザーに付与された権限の取得
PL/SQLファンクションDBMS_XDB_REPOS.getPrivileges
を使用して、現行ユーザーに付与された権限を取得する例を示します。
例27-12 特定のリソースに対して現行ユーザーに付与された権限の取得
SELECT XMLSerialize(DOCUMENT DBMS_XDB_REPOS.getPrivileges('/TESTUSER/po1.xml')
AS CLOB)
FROM DUAL;
XMLSERIALIZE(DOCUMENTDBMS_XDB_REPOS.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.
親トピック: アクセス制御リスト(ACL)の使用の概要
27.5.8 現行ユーザーがリソースに対する権限を所有しているかどうかの確認
PL/SQLファンクションDBMS_XDB_REPOS.checkPrivileges
を使用して、現行ユーザーがリソースに対する特定の権限セットを所有しているかどうかを確認する例を示します。ユーザーがその権限を所有している場合、この関数は、ゼロ以外の値を戻します。
例27-13では、リソース/TESTUSER/po1.xml
に対するアクセス権限read-contents
およびread-properties
が、現行ユーザーに付与されているかどうかを確認しています。戻り値が正の整数であれば、ユーザーがその権限を持っていることを示しています。
例27-13 あるリソースに対してユーザーが特定の権限を所有しているかどうかの確認
SELECT DBMS_XDB_REPOS.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_REPOS.CHECKPRIVILEGES('/TESTUSER/PO1.XML',
---------------------------------------------------
1
1 row selected.
親トピック: アクセス制御リスト(ACL)の使用の概要
27.5.9 ユーザーがACLおよびリソース所有者を使用する権限を所有しているかどうかの確認
ファンクションDBMS_XDB_REPOS.ACLCheckPrivileges
は、通常、ユーザーによる操作の実行を許可する前に、独自にACLの評価を実行する必要のあるアプリケーションによって使用されます。
例27-14では、ACL /TESTUSER/acl1.xml
により、権限read-contents
およびread-properties
が、現行ユーザーsh
に付与されているかどうかを確認しています。2番目の引数TESTUSER
は、確認時にACLのDAV::owner
に置き換えられたユーザーです。ユーザーsh
は、指定された権限を付与されたユーザーのいずれにも一致しないため、戻り値はゼロです。
例27-14 ACLCheckPrivilegesを使用したユーザー権限の確認
CONNECT sh
Enter password: <password>
Connected.
SELECT DBMS_XDB_REPOS.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_REPOS.ACLCHECKPRIVILEGES('/TESTUSER/ACL1.XML','TESTUSER',
------------------------------------------------------------------
0
1 row selected.
親トピック: アクセス制御リスト(ACL)の使用の概要
27.5.10 指定されたリソースを保護するACLのパスの取得
RESOURCE_VIEW
問合せを使用して、指定されたリソースを保護するACLのパスを取得する例を示します。この問合せでは、リソースの要素XMLRef
およびACLOID
が、ACLとリソースをリンクしていることを前提として使用しています。
例27-15は、ACLによって保護されたリソースの指定を受けて、ACLへのパスを取得しています。保護されたリソース(r
)のACLOID
には、それを保護しているACLリソース(a
)のOIDが格納されています。ACLリソースのREF
は、保護されたリソースACLOID
により識別されるオブジェクトのものと同じです。
リソースACLOID
のREF
は、Oracle SQL関数make_ref
を使用して取得できます。指定されたOIDを持つオブジェクト行へのREF
が戻されます。
例27-15では、make_ref
は、リソース/TESTUSER/po1.xml
に対して、OIDが/Resource/ACLOID
である表XDB$ACL
の行へのREF
を戻しています。内部問合せがリソースのACLOID
を取得します。外部問合せが、対応するACLへのパスを戻します。
例27-15 特定のリソースを保護する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
親トピック: アクセス制御リスト(ACL)の使用の概要
27.5.11 指定されたACLによって保護されるすべてのリソースのパスの取得
指定されたACLによって保護されるすべてのリソースのパスを取得する例を示します。
例27-16では、パスが/TESTUSER/acl1.xml
であるACLリソースのREF
に対してACLOID
REF
が一致しているリソースへのパスを取得します。ファンクションmake_ref
はリソースACLOID
REF
を戻します。
内部問合せは、指定されたACLのREF
を取得します。外部問合せは、ACLOID
REF
が指定されたACLのREF
に一致するリソースのパスを選択します。
例27-16 特定の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.
親トピック: アクセス制御リスト(ACL)の使用の概要
27.6 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
値またはVARCHAR
2値に変換されているとき)に使用されます。このキャッシュを消去する場合は、プロシージャDBMS_XDBZ.purgeLDAPCache
を使用します。もう1つのキャッシュは、セッション固有のキャッシュで、LDAPグループをそのメンバー(ネストされたメンバーシップ)にマップします。Oracle XML DBでは、LDAPグループをセッションで最初に検出するたびに、LDAPサーバーからそのグループのネストされたメンバーシップを取得します。そのため、可能なかぎりメンバーとネスト・レベルの少ないグループを使用することをお薦めします。
親トピック: リポジトリのアクセス制御
27.7 リポジトリ・リソースおよびデータベース表のセキュリティ
REF
ベースのリポジトリ・リソースの格納に使用される表の階層を有効にすることによって、これらのリソースへのアクセスに均一なセキュリティ・メカニズムが提供されます。特定のリソースについてACLベースのセキュリティが必要ない場合は、PL/SQLプロシージャDBMS_XDBZ.disable_hierarchy
を使用してACLチェックを無効にすることによってそれらのアクセスを最適化できます。
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ベースのセキュリティがデフォルトで有効になります。
親トピック: リポジトリのアクセス制御
27.7.1 最適化: 必要でない場合に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
権限があることを確認します。
DBMS_XDBZ.disable_hierarchy
をコールすると、同じ問合せの実行計画では、フィルタにSYS_CHECKACL
が表示されません。
関連項目:
プロシージャDBMS_XDBZ.disable_hierarchy
の詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。
親トピック: リポジトリ・リソースおよびデータベース表のセキュリティ
27.8 Oracle XML DBのLDAPとの統合
Lightweight Directory Access Protocol (LDAP)ユーザーにOracle XML DB機能(ACLを含む)の使用を許可できます。
典型的なシナリオでは、単一の共有データベース・スキーマ(ユーザー)に、複数のLDAPユーザーがマップされています。このマッピングは、Oracle Internet Directoryで維持されています。エンド・ユーザーは、LDAPユーザー名およびパスワードを使用して、データベースにログインできます。ログインすると、対応する共有データベース・スキーマに自動的にマップされます。(ログインには、SQLまたはOracle XML DBでサポートされている任意のプロトコルを使用できます。)暗黙的なACL解決は、現行のLDAPユーザーおよび対応するLDAPグループのメンバーシップ情報に基づいています。
Oracle XML DB ACLのプリンシパルとしてLDAPユーザーおよびLDAPグループ(LDAPロールとも呼ばれる)を使用する場合は、その前に次の条件を満たす必要があります。
-
Oracle Internet Directoryが設定され、データベースがそれに登録されている必要があります。
-
SSL認証がデータベースとOracle Internet Directoryの間に設定されている必要があります。
-
共有データベース・スキーマに対応するデータベース・ユーザーが作成されている必要があります。
-
Oracle Internet DirectoryでLDAPユーザーが作成され、共有データベース・スキーマにマップされる必要があります。
-
LDAPグループが作成され、そのメンバーが指定されている必要があります。
-
LDAPグループやLDAPユーザーに対してACLが定義され、それを使用してLDAPユーザーがアクセスするリポジトリ・リソースが保護される必要があります。
関連項目:
-
SSL認証の設定の詳細は、Oracle Databaseセキュリティ・ガイドを参照してください。
-
エンタープライズ(LDAP)ユーザーのための共有データベース・スキーマの使用方法の詳細は、Oracle Databaseエンタープライズ・ユーザー・セキュリティ管理者ガイドを参照してください。
例27-17は、LDAPユーザーのACLを示しています。要素<principal>
にはLDAPユーザーの完全識別名(この場合cn=user1,ou=Americas,o=oracle,l=redwoodshores,st=CA,c=US
)が含まれています。
例27-18は、LDAPグループのACLを示しています。要素<principal>
には、LDAPグループの完全識別名が含まれています。
例27-17 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>
例27-18 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>
親トピック: リポジトリのアクセス制御
脚注の説明
脚注1:コロン(:
)は名前空間名の一部です。DAV:
は、接頭辞ではなく、名前空間そのものです。名前空間DAV:
に広く使用される接頭辞はdav
ですが、これは慣例的なものにすぎません。dav
は、Oracle XML DBで事前定義されている接頭辞ではありません。