プライマリ・コンテンツに移動
Oracle® Database Real Application Security管理者および開発者ガイド
12cリリース1 (12.1)
B71274-08
目次へ移動
目次
索引へ移動
索引

前
次

7 Oracle Fusion MiddlewareとReal Application Securityの統合

Real Application Securityは、たとえばOracle Fusion Middlewareで使用できるアプリケーション統合用の外部ユーザーおよびロール・サポートを追加します。Oracle Fusion Middlewareでは、認可ポリシー・マネージャを使用してユーザー・インタフェースの集中管理および単一認証でユーザーおよびロールを共通の単一リポジトリに外部化することもできます。Real Application Securityの観点からは、統合ユーザーおよびロール(アプリケーション・ロールを含む)はOracle Fusion Middlewareによって外部的に管理されるため、外部化されたプリンシパルです。中間層の初期化および認可操作は、JavaアプリケーションでのReal Application Securityの使用で説明したものと同じです。

外部ユーザーおよび外部ロールについて

外部ユーザーは、サービスにアクセスしているエンドユーザーです。ユーザー情報は、一般にWebLogic Authenticatorでインスタンス化するアイデンティティ・ストアに格納されます。このユーザーは、データベース・ユーザーでもReal Application Securityアプリケーション・ユーザーでもありません。外部ユーザーは、データベースにフットプリントを持ちません。ただし、外部ユーザーはアプリケーション・データのデータベースにアクセスする必要があります。したがって、Real Application Securityコンテキスト(セッション)がこのようなユーザーに対して設定され、必要なデータに対するユーザーのアクセスを制御します。

匿名ユーザーは認証されていないユーザー、つまり資格証明が検証されていないユーザーです。匿名ユーザーは、データベースからパブリック・データなどの保護されていないリソースにのみアクセスを許可されます。アプリケーションで、匿名ユーザーの使用を有効または無効にできます。

外部ロールまたはグループとは、ユーザーおよびその他のグループの集合で、階層構造とすることができます。たとえば、グループには、任意にネストしたグループを含めることができます。

外部アプリケーション・ロールとは、ユーザー、グループおよびアプリケーション・ロールの集合で、階層構造とすることができます。このロールはアプリケーション固有であり、アプリケーション・ポリシーで定義するものなので、J2EEコンテナで認識できるとはかぎりません。アプリケーション・ロールは、アプリケーションの実行時にのみ表示されるため、スコープ指定されています。このロールは、同じアプリケーション・スコープで定義されている他のアプリケーション・ロールおよびエンタープライズ・ユーザーまたはグループにマップできます。アプリケーション・ロールは、認可の判断に使用します。

外部ユーザーと同様に、外部ロールおよびアプリケーション・ロールはReal Application Securityシステムにフットプリントを持ちません。これらは、Real Application Security ACLがアプリケーションにデータ・アクセス権を付与する方法の制御に使用されます。

外部ロールおよびアプリケーション・ロールは、データ・アクセスの詳細も施行します。外部ユーザーはいくつかの基本的なデータベース権限を必要とし、通常これはアプリケーション表に対してSELECTを実行するためのオブジェクト権限です。これらの権限は、ユーザー・セッションの連結時に有効になるReal Application Security動的アプリケーション・ロールを通じて付与できます。たとえば、外部ユーザーまたはロールに権限を付与するには、ACLの作成時にACEリストでプリンシパル・タイプをXS_ACL.PTYPE_EXTERNALとして指定します。詳細は、CREATE_ACLプロシージャを参照してください。

外部ユーザーのセッション・モード

Real Application Securityは、セッションに対して次の2つの操作モードをサポートします。

  • セキュア・モード

    セキュア・モードでは、データ・セキュリティがデータベース・サーバーで施行されます。デフォルトでは、セキュア・モードではすべてのユーザーに対して1つのセッションが作成されます。

  • 信頼モード

    信頼モードは、データ・セキュリティがデータベース・サーバーではなく中間層で施行されるモードです。このようなモードでは、Real Application Securityで実装されるデータ・セキュリティがバイパスされます。このため、信頼モードでのセッションの作成は権限付き操作です。

    信頼モードは、ディスパッチャにCREATE_TRUSTED_SESSION権限がある場合にのみ、外部ユーザーに対してのみ許可されます。この権限は、ディスパッチャ・ユーザーに対して次のように付与できます。

    XS_ADMIN_UTIL.grant_system_privilege('CREATE_TRUSTED_SESSION','dispatcher', XS_ADMIN_UTIL.PTYPE_XS); 
    

外部ユーザーおよびロールのセッションAPI

外部ユーザーのネームスペース

外部ユーザーのネームスペースは、セッションの作成、連結および割当て時に属性操作機能によって強化されます。外部ユーザーは、次のアクティビティを実行できます。

  • セッション作成時のネームスペースおよび属性の作成

  • セッションの連結およびユーザーの割当て時のネームスペース属性の設定

  • セッションの保存と連結の維持

セッションの作成

Real Application Securityアプリケーション・セッションを作成するには、XSSessionManagerクラスのcreateSessionメソッドを使用します。

外部ユーザーの場合、このメソッドはサーバーおよびそれに対応する中間層表現にSessionオブジェクトをネームスペースおよび属性とともに作成します。また、このメソッドはネームスペースを作成し、ネームスペース/属性値で指定された対応する属性を設定します。Cookieを使用して、Cookie値が変更されるかセッションが破棄されるまで、新規に作成されたReal Application Securityアプリケーション・セッションを将来のコールで識別できます。

構文

public abstract Session createSession(java.sql.Connection conn,
                                      ExternalUser eUser,
                                      java.lang.String cookie,
                                      java.util.Collection<NamespaceValue> nav)
                                      throws InvalidXSUserException,
                                             AccessDeniedException,
                                             java.sql.SQLException,
                                             XSSessionException,
                                             InvalidXSNamespaceException
public abstract Session createSessionTrusted(java.sql.Connection conn,
                             ExternalUser externalUser,
                             java.lang.String cookie,
                             java.util.Collection<NamespaceValue> nameSpaceValues)
                             throws InvalidXSUserException,
                             AccessDeniedException,
                             java.sql.SQLException,
                             SQLException,
                             XSException,
                             InvalidXSNamespaceException

パラメータ

パラメータ 説明

conn

データベース・サーバー・ラウンドトリップのJDBC接続

eUserまたはexternalUser

セッションに関連付けられた外部ユーザー

cookie

外部ユーザーの識別に使用されるセッションCookie

navまたはnameSpaceValues

ネームスペースおよびネームスペースに対して作成する対応属性のリスト

例7-1に、外部ユーザーのReal Application Securityセッションの作成方法を示します。createSessionメソッドは太字で示されています。

例7-1 外部ユーザーのReal Application Securityセッションの作成

.
.
.
static Connection lws_conn =null;
static XSSessionManager sm = null;
lws_conn = DriverManager.getConnection(lws_conn_string, username, password);
sm = XSSessionManager.getSessionManager(privConn,20,29999999);
.
.
.
String trituser = "TUSER01";
String cookie = "some_cookie";
String extuser = "ExtPrincp";
String extuuid = "ExtPrincp";

Session lws = null;

List<AttributeValue> nsavList = new ArrayList<AttributeValue>();
AttributeValue nsav1 = new AttributeValue("ATTR01","value1");
nsavList.add(nsav1);
AttributeValue nsav2 = new AttributeValue("ATTR02","value2");
nsavList.add(nsav2);
NamespaceValue nav = new NamespaceValue("NST01",nsavList);
List<NamespaceValue> nsList = new ArrayList();
nsList.add(nav);

/* create session with external user name in secure mode with namespace attr-vals and cookie */
lws = sm.createSession(lws_conn, new ExternalUser(extuser, extuuid), cookie, nsList);
sm.destroySession(lws_conn, lws);

/*Create external user session in secure mode*/
lws = sm.createSession(lws_conn, new ExternalUser(extuser, extuuid), null, null);
sm.destroySession(lws_conn, lws);

/*Create external user session in secure mode with namespace attribute values */
lws = sm.createSession(lws_conn, new ExternalUser(extuser, extuuid), null, nsList);
sm.destroySession(lws_conn, lws);

/* create session with external user name in secure mode with cookie */
lws = sm.createSession(lws_conn, new ExternalUser(extuser, extuuid), cookie, null);
sm.destroySession(lws_conn, lws);

/* create trusted session with only external user name */
lws = sm.createSessionTrusted(lws_conn, new ExternalUser(extuser, extuuid), null, null);
sm.destroySession(lws_conn, lws);

/* create session with RAS user name in secure mode with namespace and cookie */
lws = sm.createSession(lws_conn, trituser, cookie, nsList);
sm.destroySession(lws_conn, lws);

セッションの連結

アプリケーション・セッションを連結するには、XSSessionManagerクラスのattachSessionメソッドを使用します。

外部ユーザーの場合、このメソッドはJDBC接続を指定されたセッション・オブジェクトに連結します。このメソッドは、動的アプリケーション・ロール、外部ロール、認証時間を設定し、セッションのネームスペースも作成します。作成および設定するネームスペースおよびその対応するネームスペース属性のリストも付与します。ネームスペースが存在しない場合、このメソッドはネームスペースを作成し、対応する属性を設定します。

構文

public abstract void attachSession(
             java.sql.Connection conn,
             Session session,
             java.util.Collection<java.lang.String> enabledDynamicRoles,
             java.util.Collection<java.lang.String> disabledDynamicRoles,
             java.util.Collection<ExternalRole> externalRoles,
             java.util.Collection<NamespaceValue> nav,
             java.sql.Timestamp authenticationTime)
             throws java.sql.SQLException,
                    AccessDeniedException,
             InvalidSessionException,
             XSSessionException,
             InvalidXSNamespaceException

public abstract Session attachSessionByCookie(
          java.sql.Connection conn,
          java.lang.String cookie,
          java.util.Collection<java.lang.String> enabledDynamicRoles,
          java.util.Collection<java.lang.String> disabledDynamicRoles,
          java.util.Collection<oracle.security.xs.ExternalRole> externalRoles,
          java.util.Collection<oracle.security.xs.NamespaceValue> namespaceValues,
          java.sql.Timestamp authenticationTime)
          throws java.sql.SQLException,
                 AccessDeniedException,
                 InvalidSessionException,
                 XSException,
                 InvalidXSNamespaceException

public abstract Session attachSessionByID(
          java.sql.Connection conn,
          java.lang.String id,
          java.util.Collection<java.lang.String> enabledDynamicRoles,
          java.util.Collection<java.lang.String> disabledDynamicRoles,
          java.util.Collection<oracle.security.xs.ExternalRole> externalRoles,
          java.util.Collection<oracle.security.xs.NamespaceValue> namespaceValues,
          java.sql.Timestamp authenticationTime)
          throws java.sql.SQLException,
                 AccessDeniedException,
                 InvalidSessionException,
                 XSException,
                 InvalidXSNamespaceException

パラメータ

パラメータ 説明

conn

アプリケーション・セッションに連結するデータベース接続

session

連結するセッション・オブジェクト

cookie

セッションCookie

id

セッション識別子

enabledDynamicRoles

有効にする動的アプリケーション・ロール名の集合

disabledDynamicRoles

無効にする動的アプリケーション・ロール名の集合

externalRoles

有効にする外部ロールの集合

navまたはnamespaceValues

ネームスペースおよび設定する対応属性のリスト

authenticationTime

データベース・サーバーに送信する認証時間

例7-2に、外部ユーザーのReal Application Securityセッションの連結方法を示します。attachSessionメソッドは太字で示されています。

セッションの連結時の外部ロールの動作

  • 外部ロールは、セッションに対して有効化された後、セッション・コンテキストの一部をIDとして格納されます。このロールIDは、中間層とデータベース・サーバーの両方に対してcheckAclメソッドをコールしたときにアクセス制御で使用されます。これは、通常のReal Application Securityアプリケーション・ロールまたは動的アプリケーション・ロールと同じです。

  • Real Application Security IDは、ロールがACLによって参照されているかどうかにかかわらず、セッションの連結時に渡されたすべての外部ロールに対して割り当てられます。

  • 外部ロールのスコープは、セッションの連結または連結解除の境界内です。外部ロールは複数のセッションの連結に対して有効にできないため、明示的に無効にする必要はありません。このため、最初のセッションの連結に割り当てられたロールは、ロールが再び割り当てられないかぎり、次のセッションの連結時に自動的に有効にはなりません。

    この動作は、最初のセッションの連結に対して割り当てられたアプリケーション・ロールが次のセッションの連結時に自動的に有効になる標準のReal Application Securityアプリケーション・ロールまたは動的アプリケーション・ロールの動作とまったく異なります。

  • セッションの連結後、外部ロールはセッションを連結解除して再連結するまで整合性を保ちます。ロールはユーザーに対して取り消すこともできます。

例7-2 外部ユーザーのReal Application Securityセッションの連結

.
.
.
static Connection lws_conn =null;
static XSSessionManager sm = null;
.
.
.
lws_conn = DriverManager.getConnection(lws_conn_string, username, password);
sm = XSSessionManager.getSessionManager(privConn,20,29999999);
.
.
.
String cookie = "some_cookie";
String extuser = "ExtPrincp";
String extuuid = "ExtPrincp";

Session lws = null;
Session lws2 = null

List<AttributeValue> nsavList = new ArrayList<AttributeValue>();

AttributeValue nsav1 = new AttributeValue("ATTR01","value1");
nsavList.add(nsav1);
AttributeValue nsav2 = new AttributeValue("ATTR02","value2");
nsavList.add(nsav2);

NamespaceValue nav = new NamespaceValue("NST01",nsavList);

List<NamespaceValue> nsList = new ArrayList();
nsList.add(nav);

List <String> dynamicRoles = new ArrayList <String>();
dynamicRoles.add("DYNROLE001");
dynamicRoles.add("DYNROLE002");

List <ExternalRole> extRoles = new ArrayList <ExternalRole>();
extRoles.add(new ExternalRole("EXTPRIN01"));
extRoles.add(new ExternalRole("MYEXTPRIN02"));

lws = sm.createSession(lws_conn, new ExternalUser(extuser, extuuid), cookie + "secure", nsList, false);
sm.attachSession(lws_conn, lws, enabledDynamicRoles, disabledDynamicRoles, extRoles, null, null);
sm.detachSession(lws);
sm.attachSession(lws_conn, lws, enabledDynamicRoles, disabledDynamicRoles, extRoles, null, new Timestamp(System.currentTimeMillis()));
sm.detachSession(lws);
sm.attachSession(lws_conn, lws, enabledDynamicRoles, disabledDynamicRoles, extRoles, nsList, null);
sm.detachSession(lws);
sm.attachSession(lws_conn, lws, enabledDynamicRoles, disabledDynamicRoles, extRoles, nsList, new Timestamp(System.currentTimeMillis())); 
sm.detachSession(lws);

lws2 = sm.createSession(lws_conn, new ExternalUser(extuser, extuuid), cookie + "trusted", nsList, true);
lws2 = sm.attachSessionByCookie(lws_conn, lws.getSessionCookie(), null, enabledDynamicRoles, disabledDynamicRoles, extRoles, null, null);
sm.detachSession(lws2);
lws2 = sm.attachSessionByCookie(lws_conn, lws.getSessionCookie(), null, enabledDynamicRoles, disabledDynamicRoles, extRoles, nsList, new Timestamp(System.currentTimeMillis()));
sm.detachSession(lws2);

セッションへのユーザーの割当て

以前の匿名ユーザーに名前を割り当てるには、XSSessionManagerクラスのassignUserメソッドを使用します。

外部ユーザーの場合、このメソッドは以前の匿名ユーザーに指定したユーザーを割り当て、動的アプリケーション・ロール、外部ロールおよび認証時間を設定します。ネームスペース/属性値のリストが指定されている場合、このメソッドは存在しない各ネームスペースを作成し、対応する属性を設定します。

構文

public abstract void assignUser(
                      Session session,
                      ExternalUser targetUser,
                      java.util.Collection<java.lang.String> enabledDynamicRoles,
                      java.util.Collection<java.lang.String> disabledDynamicRoles,
                      java.util.Collection<ExternalRole> externalRoles,
                      java.util.Collection<NamespaceValue> naValues,
                      java.sql.Timestamp authenticationTime)
                      throws java.sql.SQLException,
                             AccessDeniedException,
                             InvalidSessionException,
                             XSSessionException,
                             InvalidXSNamespaceException

パラメータ

パラメータ 説明

session

ユーザーを割り当てるセッション・オブジェクト

targetUser

認証に基づいて初期化されるExternalUserオブジェクト

enabledDynamicRoles

有効にする動的アプリケーション・ロール名のリスト

disabledDynamicRoles

無効にする動的アプリケーション・ロール名のリスト

externalRoles

有効にする外部ロールの集合

namespaceValues

ネームスペースおよび設定する対応属性のリスト

authenticationTime

ユーザーの認証時に示されたタイムスタンプ

例7-3に、Real Application Securityセッションを外部ユーザーに割り当てる方法を示します。assignUserメソッドは太字で示されています。

例7-3 Real Application Securityセッションを外部ユーザーに割り当てる方法

.
.
.
static Connection lws_conn =null;
static XSSessionManager sm = null;
.
.
.
lws_conn = DriverManager.getConnection(lws_conn_string, username, password);
sm = XSSessionManager.getSessionManager(privConn,20,29999999);
.
.
.
String cookie = "some_cookie";
String extuser = "ExtPrincp";
String extuuid = "ExtPrincp";

Session lws = null;

List<AttributeValue> nsavList = new ArrayList<AttributeValue>();

AttributeValue nsav1 = new AttributeValue("ATTR01","value1");
nsavList.add(nsav1);
AttributeValue nsav2 = new AttributeValue("ATTR02","value2");
nsavList.add(nsav2);

NamespaceValue nav = new NamespaceValue("NST01",nsavList);

List<NamespaceValue> nsList = new ArrayList();
nsList.add(nav);

List <String> dynamicRoles = new ArrayList <String>();
dynamicRoles.add("DYNROLE001");
dynamicRoles.add("DYNROLE002");

List <ExternalRole> extRoles = new ArrayList <ExternalRole>();
extRoles.add(new ExternalRole("EXTPRIN01"));
extRoles.add(new ExternalRole("MYEXTPRIN02"));

lws = sm.createAnonymousSession(lws_conn, cookie + "trusted", nsList, true);
sm.attachSession(lws_conn, lws, null, null, null, null, null);
sm.assignUser(lws, euser, dynamicRoles, dynamicRoles, extRoles, null, null);
sm.detachSession(lws);

lws = sm.createAnonymousSession(lws_conn, cookie + "secure", nsList, false);
sm.attachSession(lws_conn, lws, null, null, null, null, null);
sm.assignUser(lws, euser, dynamicRoles, dynamicRoles, extRoles, null, new Timestamp(System.currentTimeMillis()));
sm.detachSession(lws);


lws = sm.createAnonymousSession(lws_conn, cookie + "trusted", nsList, true);
sm.attachSession(lws_conn, lws, null, null, null, null, null);
sm.assignUser(lws, euser, dynamicRoles, dynamicRoles, null, nsList, null);
sm.detachSession(lws);

セッションの保存とセッションの中止

データベース・サーバーにセッションの変更を保存し、セッションを連結したままにするには、XSSessionManagerクラスのsaveSessionメソッドを使用します。

外部ユーザーの場合、このメソッドは現在のセッションを保存します。detachSessionメソッドと同様に、このメソッドはバック・エンドに対してすべてのセッション変更をコミットし、この操作を実行するにはデータベースのラウンドトリップが必要です。ただし、detachSessionメソッドとは異なり、このメソッドは連結されているセッションを保持します。このメソッドは、主にアプリケーション・コンテキスト(ネームスペース)の保存に使用されます。

データベース・サーバーでセッションの変更を中止し、セッションから連結解除するには、XSSessionManagerクラスのabortSessionメソッドを使用します。

構文

public abstract void saveSession(Session session)
                          throws java.sql.SQLException,
                                 NotAttachedException,
                                 XSSessionException

public abstract void abortSession(Session session)
                          throws java.sql.SQLException,
                                 NotAttachedException,
                                 XSException

例7-4に、Real Application Security外部ユーザー・セッションを保存する方法を示します。saveSessionメソッドは太字で示されています。

例7-4 Real Application Security外部ユーザー・セッションを保存する方法

.
.
.
static Connection lws_conn =null;
static XSSessionManager sm = null;
.
.
.
lws_conn = DriverManager.getConnection(lws_conn_string, username, password);
sm = XSSessionManager.getSessionManager(privConn,20,29999999);
.
.
.
String cookie = "some_cookie";
String extuser = "ExtPrincp";
String extuuid = "ExtPrincp";

Session lws = null;

List<AttributeValue> nsavList = new ArrayList<AttributeValue>();

AttributeValue nsav1 = new AttributeValue("ATTR01","value1");
nsavList.add(nsav1);
AttributeValue nsav2 = new AttributeValue("ATTR02","value2");
nsavList.add(nsav2);

NamespaceValue nav = new NamespaceValue("NST01",nsavList);

List<NamespaceValue> nsList = new ArrayList();
nsList.add(nav);

List <String> dynamicRoles = new ArrayList <String>();
dynamicRoles.add("DYNROLE001");
dynamicRoles.add("DYNROLE002");

List <ExternalRole> extRoles = new ArrayList <ExternalRole>();
extRoles.add(new ExternalRole("EXTPRIN01"));
extRoles.add(new ExternalRole("MYEXTPRIN02"));

lws = sm.createAnonymousSession(lws_conn, cookie + "trusted", nsList, true);
sm.attachSession(lws_conn, lws, null, null, null, null, null);
sm.assignUser(lws, euser, dynamicRoles, dynamicRoles, extRoles, null, null);
lws.deleteNamespace("NST01");
sm.saveSession(lws);