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として分類されている機能のいくつかは、データベース・ロールではまとめられています。アクセス制御の用語においては、ロールはユーザーとともにプリンシパルとして分類されます。これに対し、従来のデータベース用語においては、ロールは権限のセットとして分類されます。
権限とは、プリンシパルに対して付与または拒否される特定の権限です。権限は、集約権限または基本権限になります。
集約権限は、権限の数が多くなった場合の操作性を簡略化し、ACLクライアント間の相互運用性を高めます。「権限」を参照してください。
集約権限はそのまま保持され、対応する基本(リーフ)権限に分割されません。WebDAVの用語において、Oracle Databaseの集約権限は抽象的でありません。つまり、集約権限は、それらのコンポーネントのコピーではなく、そのコンポーネント権限へのポインタのセットとして機能します。したがって、コンポーネントの定義が変更された場合でも、集約権限は常に最新の状態を保持します。
プリンシパルに付与された権限のセットによって、プリンシパルが保護するデータに対して特定の操作を実行できるかどうかが制御されます。たとえば、プリンシパル(データベース・ユーザー)HR
が特定のリソースに対してread
操作を実行するには、読取り操作の前にHR
に読取り権限が付与されている必要があります。
アクセス制御エントリ(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が適用されるリソースの所有者にすべての権限を付与します。
アクセス制御リスト(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リソースの操作に必要なデータベース権限
操作 | 説明 | 必要な権限 |
---|---|---|
|
フォルダFに新しいリソースを作成します。 |
フォルダFに対する |
|
フォルダFからリソースRを削除します。 |
Rに対する |
|
リソースRのコンテンツまたはプロパティを更新します。 |
Rに対する |
|
FTPまたはHTTP(S)によるリソースRの取出し。 |
Rに対する |
|
リソースRのACLを設定します。 |
Rに対する |
|
フォルダFのリソースをリストします。 |
フォルダFに対する |
この項では、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 基本権限
基本権限 | 説明 | データベースでの操作 |
---|---|---|
|
WebDAVロックを使用してリソースをロックします。 |
|
|
リソースの |
なし |
|
リソースの所有権を取得します。 |
なし |
|
WebDAVロックを使用してロックされたリソースのロックを解除します。 |
|
|
リソースのコンテンツを変更します。 |
|
|
リソースのプロパティを変更します。リソースをロックまたはロック解除します。変更可能なプロパティには、 |
|
|
リソースからのリンクの作成を可能にします。 |
|
|
リソースへのリンクの作成を可能にします。 |
なし |
|
リソースのACLを読み取ります。 |
|
|
リソースのコンテンツを読み取ります。 |
|
|
リソースのプロパティを読み取ります。 |
|
|
フォルダを検索します(フォルダの場合のみ)。 |
|
|
リソースからのリンクの削除を可能にします。 |
|
|
リソースへのリンクの削除を可能にします。 |
なし |
|
リソースのACLのコンテンツを変更します。 |
|
|
リソースのACLOIDを変更します。 |
|
表27-3に、集約権限、およびそれらを構成する基本権限を示します。
表27-3 集約権限
集約権限 | コンポーネントの基本権限 |
---|---|
|
すべての基本DAV権限 |
|
すべての基本DAV権限( |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
アクセス制御リスト(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は事前定義されており、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を定義する場合は、任意の名前を使用できます。
プリンシパルが、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-method
をace-order
またはdeny-trumps-grant
のいずれかに設定し、ACL評価の動作を構成できます。デフォルトの構成ファイルではace-method
が指定されますが、メソッドが指定されない場合に使用される要素acl-evaluation-method
はdeny-trumps-grant
です。
注意: Oracle Database 11gリリース1より前のリリースでは、ACL評価動作は、deny-trumps-grant の1つのみが利用可能でした(ただし、構成ファイル内では指定されません)。
|
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から権限(プリンシパルと権限のアソシエーション)を継承できます。継承を使用すると、定義の柔軟性が高まり、アクセス制御ポリシーの再利用性が高まります。
権限付与はACEで定義されるので、権限付与の継承には、ACL継承連鎖および関連ACESの検索が含まれます。しかしACL継承およびその結果の権限付与の継承は、再帰的に行われることが可能です。ACL A1がACL A2から継承された場合、A1により定義された権限付与はA2のACEに存在する必要はありません。かわりに、ACL A3のACEにある可能性があります。A2はA3から(直接的または間接的に)継承します。
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-3にextends-from
要素を示します。例27-4にconstrained-with
要素を示します。
拡張継承は、継承元の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によって制約される場合、A1とA2の両方に共通の権限のみが権限付与の判別に使用されます。
より正確には、ACL A1がACL A2から継承し、特定のプリンシパルに特定の権限セットが付与されているかどうかを調べるためにA1が確認される場合、判別の処理は次のように実行されます。
A1がA2から拡張する場合: A1で明示的に宣言されているACEが最初に検査されます。ACEで対象となる権限全部がプリンシパルに付与されているわけではない場合、または権限のいずれかが拒否されている場合、A1の親extending-from
で定義されているACEが検査されます。このため、A2で明示的に宣言されているACEで、対象となる権限全部がプリンシパルに付与されているわけではない場合、または権限のいずれかが拒否されている場合、A2がA3から拡張していれば、A3が検査されます。その他の場合も同様です。
A1がA2により制約される場合: A1で明示的に宣言されているACEと、A2に定義されているACEがそれぞれ個別に検査され、どちらも指定されたプリンシパルに対して対象となる権限全部が付与されていることが確認されます。A2がACL A3により制約される場合も、同じ方法でA2のチェックが行われます。
言い換えると、拡張継承は付与された権限を蓄積し、制約継承は拒否された権限を蓄積します。拡張継承においては、子または親のACLがプリンシパルに権限を付与した場合、その権限が付与されます。制約継承においては、子または親のACLが権限を拒否した場合、その権限は拒否されます。
別のプリンシパル・セットを補完することによりプリンシパル・セットを定義するほうが便利な場合もあります。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>
(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を示します。
Oracle Databaseのアクセス制御リスト(ACL)はそれ自身がOracle XML DBリポジトリ内のリソースなので、リポジトリのリソースを操作するメソッドはすべてACLにも適用されます。さらに、ACLsinパッケージDBMS_XDB
に固有のAPIもいくつかあります。これらのプロシージャやファンクションを使用すると、PL/SQLを使用してOracle XML DBのセキュリティ・メカニズムにアクセスし、特定のACLに基づいてユーザーの権限を確認して、特定の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の参照先がありません」が発生します。 |
例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>
例27-9では、リソース/TESTUSER/po1.xml
を作成し、PL/SQLプロシージャDBMS_XDB.setACL
を使用してそのACLを/TESTUSER/acl1.xml
に設定します。
例27-10に、プロシージャDBMS_XDB.deleteResource
を使用してACLを削除する方法を示します。この例では、例27-7で作成した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を変更してください。
FTPまたはWebDAVを使用してACLを更新できます。これらのプロトコルの使用方法の詳細は、第28章「プロトコルを使用したリポジトリへのアクセス」を参照してください。RESOURCE_VIEW
を使用して、ACLの更新や、アクセス制御エントリ(ACE)の変更を行えます。
例27-11では、Oracle SQL関数updateXML
を使用して、ACL /TESTUSER/acl1.xml
を完全に置換することによって更新しています。その結果、プリンシパル値DAV::owner
がTESTUSER
で置換されます。置換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は削除されます。
例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
が、現行ユーザーに付与されているかどうかを確認しています。戻り値が正の整数であれば、ユーザーがその権限を持っていることを示しています。
ファンクション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.
例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
により識別されるオブジェクトのものと同じです。
リソースACLOID
のREF
は、Oracle SQL関数make_ref
を使用して取得できます。指定されたOIDを持つオブジェクト行へのREF
が戻されます。
この例では、make_ref
は、リソース/TESTUSER/po1.xml
に対して、OIDが/Resource/ACLOID
である表XDB$ACL
の行へのREF
を戻しています。内部問合せがリソースのACLOID
を取得します。外部問合せが、対応する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の確認操作のパフォーマンスは、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サーバーからそのグループのネストされたメンバーシップを取得します。そのため、可能なかぎりメンバーとネスト・レベルの少ないグループを使用することをお薦めします。
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
表で表が更新されたとき、それに対応する最後に変更されたリソース情報が常に更新されることを保証する、パス索引トリガーと呼ばれるデータベース・トリガーが作成されます。
関連項目:
|
指定された任意の表で、オブジェクトの一部のみがOracle XML DBリソースにマップされることがあります。マップされたオブジェクトのみがACLチェックを受けますが、すべてのオブジェクトに表レベルのセキュリティがあります。
注意: 表外に格納する場合は、XMLType 表のデータを他のユーザーに対して非表示にすることはできません。表外のデータは、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パッケージおよびタイプ・リファレンス』を参照してください。 |
この項では、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ユーザーがアクセスするリポジトリ・リソースが保護される必要があります。
関連項目:
|
例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で事前定義されている接頭辞ではありません。