2 アプリケーション・ユーザーおよびアプリケーション・ロールの構成

関連項目:

XS_PRINCIPALパッケージ

2.1 アプリケーション・ユーザーの構成について

2.1.1 アプリケーション・ユーザー・アカウントについて

従来のデータベース・ユーザーは、データベース・スキーマを所有し、それらのスキーマに対して通常の重量データベース・セッションを作成できます。

アプリケーション・ユーザーはデータベース・スキーマを所有しませんが、表にアクセスするための適切なオブジェクト権限を持つロールが付与されていれば、中間層を介してデータベースに対してアプリケーション・セッションを作成できます。アプリケーション・ユーザーは、これらのアカウントがスキーマに関連付けられ、XSCONNECTアプリケーション・ロールがこれらのアプリケーション・ユーザーに付与されていれば、直接ログイン・アプリケーション・ユーザー・アカウントを介してデータベースに直接接続することで、重量データベース・セッションを作成することもできます。各アプリケーション・ユーザーにプロファイルを作成して割り当てることもできます。

この項の内容は次のとおりです: アプリケーション・ユーザー・アカウントを作成する一般的な手順

2.1.1.1 アプリケーション・ユーザー・アカウントを作成する一般的な手順

アプリケーション・ユーザー・アカウントを作成する一般的な手順は、次のとおりです。

  1. セキュリティ・マネージャsec_mgrを次のように作成し、このユーザーにcreate sessionデータベース権限とReal Application Security xs_session_adminデータベース・ロールを付与します。次に、xs_admin_util.grant_system_privilegeコールを実行してReal Application Securityの最小システム権限PROVISIONをデータベース・ユーザーとしてのsec_mgrに付与します。Real Application Securityの最小システム権限を使用して、セキュリティ・マネージャとしてユーザーやロールを作成したり、パスワードの設定やセッションの管理ができるようになります。
    sqlplus /nolog
    SQL> connect sys/password as sysdba
    SQL> grant create session, xs_session_admin to sec_mgr identified by password;
    SQL> exec sys.xs_admin_util.grant_system_privilege('provision', 'sec_mgr', sys.xs_admin_util.ptype_db);
  2. Real Application SecurityのPROVISIONシステム権限またはデータベースのCREATE USERシステム権限のいずれかを持つユーザーとしてSQL*Plusにログインします。
    sqlplus sec_mgr
    Enter password: password
    Connected. 

    XS_PRINCIPALパッケージの詳細は、「XS_PRINCIPALパッケージ」を参照し、特に「CREATE_USERプロシージャ」を確認してください。

    アプリケーション・ユーザーおよびロールを作成、変更または削除するために必要な権限を持っている必要があります。これらの権限は、データベース・ユーザーおよびロールを作成、変更または削除するために必要な同じシステム権限によって制御されます。これらを含むSQL文の詳細は、Oracle Database SQL言語リファレンスを参照してください。

  3. XS_PRINCIPAL.CREATE_USERプロシージャでアプリケーション・ユーザーを作成します。
2.1.1.1.1 その他のタスク

アプリケーション・ユーザー・アカウントを作成したら、アプリケーション・ユーザーの権限を提供するロールをそのアカウントに付与できます。詳細は、既存のアプリケーション・ユーザーへのアプリケーション・ロールの付与を参照してください。

2.1.2 単純なアプリケーション・ユーザー・アカウントの作成

注意:

SQL*Plusでは、小文字と特殊文字で大/小文字の区別が問題となるため、次のガイドラインに従ってください。

  • 名前に小文字または特殊文字が含まれるアプリケーション・ユーザーは、アカウント名を二重引用符で囲んでSQL*Plusに接続する必要があります。

    たとえば、次のようになります。

    CONNECT "lwuser1"
    Enter password: password
    Connected.
    
  • 小文字または特殊文字が含まれるアプリケーション・ロールの名前は、二重引用符で囲んでSQL*Plusに入力する必要があります。

    たとえば、次のようになります。

    GRANT cust_role TO "app_regular_role";

単純なアプリケーション・ユーザー・アカウントを作成する場合、スキーマ引数には、未修飾の名前を解決するために使用するスキーマ名を指定します。これは、権限の付与とは無関係で、名前解決目的のみに使用されます。スキーマ名を指定しない場合、XS$NULLが使用されます。

単純なアプリケーション・ユーザー・アカウントを作成するには、次の手順を実行します。

  1. ログインします。

    たとえば、sec_mgrCREATE USER権限を持っている場合、次のようにログインします。

    sqlplus sec_mgr
    Enter password: password
    Connected. 
    
  2. アプリケーション・ユーザー・アカウントを作成します。

    たとえば、次のようになります。

    BEGIN
      SYS.XS_PRINCIPAL.CREATE_USER('lwuser1');
    END;
    /
    

    DBAロールを持つユーザーは、次のようにDBA_XS_USERSデータ・ディクショナリ・ビューを問い合せて、ユーザーの作成を確認できます。詳細は、「DBA_XS_USERS」を参照してください。

    SELECT NAME FROM DBA_XS_USERS;
     
    NAME
    --------------------------
    XSGUEST
    LWUSER1
    

    この出力には、既存のアプリケーション・ユーザー・アカウントが表示されます。XSGUESTユーザー・アカウントは、すでに存在するか、事前定義されているシステム定義のユーザー・アカウントです。

    XS_PRINCIPAL.CREATE_USERプロシージャの詳細は、「CREATE_USERプロシージャ」を参照してください。

    XS_PRINCIPAL.DELETE_PRINCIPALプロシージャを使用してアプリケーション・ユーザー・アカウントを削除できます(「DELETE_PRINCIPALプロシージャ」を参照)。

2.1.3 直接ログイン・アプリケーション・ユーザー・アカウントの作成について

2.1.3.1 直接ログイン・アプリケーション・ユーザー・アカウントの作成

アプリケーション・ユーザー・アカウントを使用してデータベースに直接ログインできます。これは、SSOやWebインタフェースを通じてログインせずに、SQL*Plusに直接ログインするような機能を実行する必要があるユーザーに役立ちます。直接ログイン・ユーザーには、パスワードが必要です。

2.1.3.2 直接ログイン・アプリケーション・ユーザー・アカウントを作成する手順

直接ログイン・アプリケーション・ユーザー・アカウントを作成するには、次の手順を実行します。

  1. アプリケーション・ユーザー・アカウントを作成する一般的な手順の説明に従ってログインします。
    sqlplus sec_mgr
    Enter password: password
    Connected. 
  2. アプリケーション・ユーザー・アカウントを作成します。

    たとえば、デフォルト・データベース・スキーマがHRであるアプリケーション・ユーザー・アカウントlwuser1を作成するには、次のようにします。

    BEGIN
      SYS.XS_PRINCIPAL.CREATE_USER
          (name       => 'lwuser1',
           schema     => 'HR');
    END;/
    

    注意:

    スキーマが存在しない場合、直接ログインは失敗します。

    このReal Applicationユーザーが問合せで未修飾のデータベース・オブジェクトの名前解決のためにデータベースに直接接続すると、HRスキーマがデフォルト・スキーマとして使用されます。たとえば、次のようになります。

    SELECT COUNT(*) FROM EMPLOYEES;
    
  3. アプリケーション・ユーザー・アカウントのパスワードを作成します。

    たとえば、次のようになります。

    BEGIN
          SYS.XS_PRINCIPAL.SET_PASSWORD('lwuser1', 'password');
    END;
    /
    

    「SET_PASSWORDプロシージャ」の説明に従ってパスワードを設定します。SET_PASSWORDプロシージャを使用すると、パスワードおよびtypeパラメータに基づいて検証機能が自動的に作成され、その検証機能とtypeパラメータの値がディクショナリ表に挿入されます。

    注意:

    passwordはセキュアなパスワードに置き換えてください。パスワードのガイドラインの詳細は、Oracle Databaseセキュリティ・ガイドを参照してください。

  4. profというプロファイルを作成し、このプロファイルをアプリケーション・ユーザー・アカウントに割り当てます。

    たとえば、次のようになります。

    CREATE PROFILE prof LIMIT PASSWORD_REUSE_TIME 1/1440 PASSWORD_REUSE_MAX 3 PASSWORD_VERIFY_FUNCTION Verify_Pass;
    
    BEGIN
      SYS.XS_PRINCIPAL.SET_PROFILE('lwuser1','prof');
    END;
    

    このプロファイルを割り当てるユーザーは、ALTER_USER権限を持っている必要があります。詳細は、「SET_PROFILEプロシージャ」を参照してください。

  5. ロールXSCONNECTをユーザーに付与してデータベースへのアクセスを許可します。
    たとえば、次のようになります。
    BEGIN
          SYS.XS_PRINCIPAL.GRANT_ROLES('lwuser1', 'XSCONNECT');
    END;
    /
    

次に、アプリケーション・ユーザー・アカウントに権限を割り当てます。プリンシパルへのアプリケーション権限の付与についてに移動してください。

その後、ユーザーは次のようにデータベースに接続できます。たとえば、次のようになります。

CONNECT lwuser1
Password: password
2.1.3.3 直接アプリケーション・ユーザー・アカウントのためのパスワード検証の設定

オプションで、このパスワードにパスワード検証(ハッシュ変換パスワード)を設定することで、管理者は、パスワードではなく検証機能の情報付きでReal Application Securityにユーザーを移行できます。パスワード検証を設定しない場合のデフォルトのハッシュ・アルゴリズムは、XS_SHA512です。詳細は、「SET_PASSWORDプロシージャ」および「SET_VERIFIERプロシージャ」を参照してください。

例2-1では、次のステップに従い、アプリケーション・ユーザー・アカウントLWUSER1のハッシュ・アルゴリズムXS_SHA512を使用して、パスワード検証をXS$VERIFIERSディクショナリ表の問合せで決定した値に設定するためのXS_PRINCIPAL.SET_VERIFIERプロシージャの使用方法を示します。
  1. DBA_XS_OBJECTSビューを問い合せて、ユーザーLWUSER1のID値を取得します。

  2. IDが2147493730であるユーザーLWUSER1XS$VERIFIERSディクショナリ表を問い合せます。検証機能の値には、タイプが値"T"で含まれ、その後にコロン(:)が続き、XS_SHA512の検証機能タイプであることを示します。これはタイプ#2であることも示されます。

  3. "T:"を含む検証値全体を使用して、ユーザーLWUSER1の検証を設定します。次の例は、これらの各ステップを示します。

例2-1 ハッシュ・アルゴリズムXS_SHA512を使用したパスワード検証の設定

sqlplus sec_mgr
Enter password: password
Connected.
 
SQL> column name format A10;
SQL> column owner format A6;
SQL> select NAME, OWNER, ID, TYPE, STATUS from  DBA_XS_OBJECTS where NAME = 'LWUSER1';

NAME       OWNER          ID TYPE               STATUS
---------- ------ ---------- ------------------ --------
LWUSER1    SYS    2147493730 PRINCIPAL          VALID

SQL> column user# format 9999999999;
SQL> column type# format 99;
SQL> column verifier format A62;
SQL> select USER#, VERIFIER, TYPE# from XS$VERIFIERS where USER# = '2147493730';

      USER# VERIFIER                                                       TYPE#
----------- -------------------------------------------------------------- -----
 2147493730 T:9BA95FEF2C2630A2BAACF2E7C5E41B0D50CDC7B0B60C88AD4FE81F8155D0     2
            02F99EEAF9D95477E4749870C67FDE870E154ED17809C359777F979E269010
            823FB981B2A998915EB1439FE3C6C1542A239C

SQL> BEGIN
SYS.XS_PRINCIPAL.SET_VERIFIER('lwuser1','T:9BA95FEF2C2630A2BAACF2E7C5E41B0D50CDC7B0B6
0C88AD4FE81F8155D002F99EEAF9D95477E4749870C67FDE870E154ED17809C359777F979E269010823FB
981B2A998915EB1439FE3C6C1542A239C', XS_PRINCIPAL.XS_SHA512);
END;
/  2    3    4    5

PL/SQL procedure successfully completed.

この手順を正常に完了するには、検証の値とタイプの両方が、検証が設定されているユーザーのXS$VERIFIERSディクショナリ表のVERIFIER列の情報と一致している必要があります。アプリケーション・ユーザーのパスワードを変更すると、検証機能タイプを変更するオプションで自動的に検証値が変更されます。

この例では、検証をまったく同じ値に設定して、含まれるステップを表示します。検証値が設定した検証機能タイプと一致するかぎり、XS$VERIFIERSディクショナリ表を問い合せたときにアプリケーション・ユーザーに表示される任意の検証値にパスワードの検証を設定するオプションがあります。たとえば、検証値と検証機能タイプをXS_SALTED_SHA1に変更する場合は、次の手順を実行します。

SQL> BEGIN
SYS.XS_PRINCIPAL.SET_VERIFIER('lwuser1','S:14DC0F5ABB72FC869549B1F845C548E0BEF7B863A116DB24DFAE22F0501E', 
XS_PRINCIPAL.XS_SALTED_SHA1);
END;
/  2    3    4

PL/SQL procedure successfully completed.

SET_VERIFIERプロシージャに示すように、これは、アプリケーション・ユーザーLWUSER3に設定された検証値および検証タイプと同じであることに注意してください。

2.1.3.4 Oracle Label Securityコンテキストの直接ログイン・セッションでの確立

Real Application SecurityユーザーのためのOracle Label Securityのサポートについて説明します。

Oracle Database 12cリリース2 (12.2)からは、Oracle Label SecurityでReal Application Securityユーザーがサポートされるようになりました。これは、Real Application Securityユーザーが直接ログオンを介してReal Application Securityユーザー・セッションと連結したときに、独自のOracle Label Security認可を行使できることを意味します。Oracle Label Securityコンテキストはセッションの連結中に確立されます。

関連項目:

2.1.4 SQL*Plus PASSWORDコマンドを使用したアプリケーション・ユーザーのパスワードのリセット

セキュリティ管理者sec_mgrとして、create sessionデータベース権限とReal Application Securityのxs_session_adminデータベース・ロールを持ち、さらに、sec_mgrにはデータベース・ユーザーとしてReal Application SecurityのPROVISION最小システム権限が付与されます。Real Application Securityの最小システム権限を使用して、セキュリティ・マネージャとしてユーザーやロールを作成したり、パスワードの設定やセッションの管理ができるようになります。例2-2に、セキュリティ管理者がSQL*PlusのPASSWORDコマンドを使用してユーザーlwuser2のパスワードをリセットする方法を示します。

ただし、ユーザーlwuser2として、明示的に連結されているセッション(JavaのATTACH_SESSIONプロシージャまたはattachSession()メソッドを使用して連結されたセッション)から呼び出されたSQL*Plus PASSWORDコマンドを使用してセルフ・パスワード変更を行う場合、セッションにはALTER_USER権限が必要で、PASSWORDコマンドにユーザー名を指定する必要があります。

例2-3に、セッションに明示的に連結されているアプリケーション・ユーザーlwuser2が、セルフ・パスワード変更を実行し、ユーザー・セッションにALTER USER権限がないため、この操作に失敗したことを示します。

例2-4に、ALTER USER権限を持つセッションに明示的に連結されているアプリケーション・ユーザーlwuser2が、セルフ・パスワード変更を実行できることを示します。ユーザーのセルフ・パスワード変更は成功します。

SET_PASSWORDプロシージャでは、古いパスワードのプロンプトは表示されませんが、最小権限としてのReal Application Security PROVISION権限またはデータベースのALTER USER権限のいずれかが必要になります。(SET_PASSWORDはReal Application Security PL/SQLプロシージャであり、SQL*Plus PASSWORDではないことに注意してください。)ユーザーのセッションにPROVISION最小権限またはALTER USER権限がある場合、任意のアプリケーション・ユーザー・セッション(明示的に連結されている直接ログオン・セッションを含む)またはデータベース・ユーザー・セッション(そのセッションにPROVISION最小権限またはALTER USER権限がある場合)から任意のアプリケーション・ユーザーのパスワードをリセットできます。他のアプリケーション・ユーザーのパスワードを変更する場合、SQL*PlusのPASSWORDコマンドは旧パスワードの入力を求めません。

例2-2 セッションに明示的に連結されていない場合に、DBAがパスワード変更操作でユーザーlwuser2のパスワードをリセットする

sqlplus sec_mgr
Enter password: password
Connected. 
SQL> BEGIN
  2 SYS.XS_PRINCIPAL.CREATE_USER('lwuser2');
  3 END;
  4/

PL/SQL orocedure successfully completed.

SQL> PASSWORD lwuser2
Changing password for lwuser2
New password: password
Retype new password: password
Password changed

例2-3 セッションに明示的に連結されている場合に、ユーザーlwuser2はセルフ・パスワード変更を実行しましたが、セッションにALTER USER権限がなかったため、操作に失敗しました

sqlplus sec_mgr
Enter password: password
Connected. 
SQL> DECLARE
  2 SESSIONID RAW(16);
  3 BEGIN
  4 SYS.DBMS_XS_SESSIONS.CREATE_SESSION('lwuser2', sessionid);
  5 SYS.DBMS_XS_SESSIONS.ATTACH_SESSION(sessionid);
  6 END;
  7 /
 
PL/SQL procedure successfully completed.

SQL> CONNECT lwuser2
Enter password: password
Connected.
SQL> SELECT SYS.XS_SYS_CONTEXT('XS$SESSION','USERNAME') FROM DUAL;
 
XS_SYS_CONTEXT('XS$SESSION','USERNAME')
--------------------------------------------------------------------------------
LWUSER2
 
SQL> PASSWORD lwuser2
Changing password for lwuser2

Old password: password
New password: password
Retype new password: password
ERROR:
ORA-01031: insufficient privileges


Password unchanged

例2-4 セッションに明示的に連結されており、ユーザーlwuser2のセッションにALTER USER権限がある場合、セルフ・パスワード変更は成功します

sqlplus sec_mgr
Enter password: password
Connected. 
SQL> CREATE ROLE pwdchg;
 
Role created.
 
SQL> GRANT ALTER USER TO pwdchg;
 
Grant succeeded.
 
SQL> EXEC SYS.XS_PRINCIPAL.CREATE_ROLE(NAME => 'resetpwd_role', ENABLED => TRUE);
 
PL/SQL procedure successfully completed.
 
SQL> GRANT pwdchg TO resetpwd_role;
 
Grant succeeded.
 
SQL>  EXEC SYS.XS_PRINCIPAL.GRANT_ROLES('lwuser2','resetpwd_role');
 
PL/SQL procedure successfully completed.
 
SQL> CONNECT lwuser2
Enter password: password
Connected.

SQL> SELECT SYS.XS_SYS_CONTEXT('XS$SESSION','USERNAME') FROM DUAL;
 
SYS.XS_SYS_CONTEXT('XS$SESSION','USERNAME')
--------------------------------------------------------------------------------
LWUSER2

SQL> PASSWORD lwuser2
Changing password for lwuser2
Old password: password
New password: password
Retype new password: password
Password changed
SQL>

2.1.5 アプリケーション・ユーザーの切替えの構成

XS_PRINCIPAL.ADD_PROXY_USERプロシージャを使用すると、アプリケーション・ユーザーを追加して別のアプリケーション・ユーザーを代理し、そのアプリケーション・ユーザーのアプリケーション・ロールを継承できます。プロキシ・ユーザーを追加している場合、DBMS_XS_SESSIONS.SWITCH_USERプロシージャを使用してセッションでアプリケーション・ユーザーを切り替えることができます。

app_user1がアプリケーション・ロールrole1およびrole2を持っているとします。例2-5では、app_user1のアプリケーション・ロールrole1およびrole2app_user2に代理取得させています。add_proxy_user('app_user1', 'app_user2', pxy_roles)というコールによって、app_user2app_user1に切り替わり、app_user1のロールであるrole1およびrole2を継承できます。これによって、app_user2にロールは付与されません。

DBA_XS_ROLE_GRANTSビューの問合せによって、ロールroles1およびroles2が付与されているのはapp_user1のみでapp_user2には付与されていないこと、およびapp_user2はプロキシ・ユーザーとしてのみこれらのロールを引き受けることが示されます。

DBA_XS_PROXY_ROLESビューの問合せによって、app_user2はプロキシ・ユーザーで、app_user1がターゲット・ユーザーであり、ターゲット・ロールはrole1およびrole2であることが示されます。

DBA_XS_SESSIONSビューの問合せによって、app_user2がこのセッションのプロキシ・ユーザーであることも示されます。

DBAロールを持つアプリケーション・ユーザーは、例2-6に示すとおり、app_user2のセッションを作成してアプリケーション・ユーザーをapp_user1に切り替えることができます。

この例では、最初にapp_user2でセッションを作成し、それに連結しています。次に、app_user2app_user1に切り替え、app_user1のロールであるrole1およびrole2を継承しています。

DBA_XS_ROLE_GRANTSビューの問合せによって、ロールroles1およびroles2が付与されているのはapp_user1のみでapp_user2には付与されていないこと、およびapp_user2はプロキシ・ユーザーとしてのみこれらのロールを引き受けることが示されます。

DBA_XS_SESSION_ROLESビューの問合せによって、ロールrole1およびrole2は、app_user1app_user2に切り替えられた同じセッションIDに関連付けられていることが示されます。

DBA_XS_SESSIONSビューの問合せによって、app_user2がこのセッションのプロキシ・ユーザーであることも示されます。

例2-5 プロキシ・アプリケーション・ユーザーの構成

sqlplus sec_mgr
Enter password: password
Connected. 
SQL> EXEC SYS.XS_PRINCIPAL.CREATE_ROLE('role1',true);
SQL> EXEC SYS.XS_PRINCIPAL.CREATE_ROLE('role2',true);
SQL> EXEC SYS.XS_PRINCIPAL.CREATE_USER('app_user1','HR');
SQL> EXEC SYS.XS_PRINCIPAL.SET_PASSWORD('app_user1', 'password');
SQL> EXEC SYS.XS_PRINCIPAL.CREATE_USER('app_user2','HR');
SQL> EXEC SYS.XS_PRINCIPAL.SET_PASSWORD('app_user2', 'password');
SQL> EXEC SYS.XS_PRINCIPAL.GRANT_ROLES('app_user1', 'role1');
SQL> EXEC SYS.XS_PRINCIPAL.GRANT_ROLES('app_user1', 'role2');
DECLARE
  pxy_roles XS$NAME_LIST; 
begin
  pxy_roles := XS$NAME_LIST('role1','role2');
  sys.xs_principal.add_proxy_user(target_user => 'app_user1', proxy_user => 'app_user2', target_roles => pxy_roles);
end;
/
SQL> SELECT grantee, granted_role FROM DBA_XS_ROLE_GRANTS;
SQL> SELECT proxy_user, target_user, target_role FROM DBA_XS_PROXY_ROLES;
SQL> SELECT user_name, sessionid, proxy_user FROM DBA_XS_SESSIONS;

例2-6 セッションの作成とアプリケーション・ユーザーの切替え

sqlplus sec_mgr
Enter password: password
Connected. 
SQL> EXEC SYS.XS_PRINCIPAL.CREATE_USER('app_user1','HR');
SQL> EXEC SYS.XS_PRINCIPAL.SET_PASSWORD('app_user1', 'password');
SQL> EXEC SYS.XS_PRINCIPAL.CREATE_USER('app_user2','HR');
SQL> EXEC SYS.XS_PRINCIPAL.SET_PASSWORD('app_user2', 'password');
SQL> EXEC SYS.XS_PRINCIPAL.CREATE_ROLE('role1',true);
SQL> EXEC SYS.XS_PRINCIPAL.CREATE_ROLE('role2',true);
SQL> EXEC SYS.XS_PRINCIPAL.CREATE_USER('app_user1','HR');
SQL> EXEC SYS.XS_PRINCIPAL.SET_PASSWORD('app_user1', 'password');
SQL> EXEC SYS.XS_PRINCIPAL.CREATE_USER('app_user2','HR');
SQL> EXEC SYS.XS_PRINCIPAL.SET_PASSWORD('app_user2', 'password');
SQL> EXEC SYS.XS_PRINCIPAL.GRANT_ROLES('app_user1', 'role1');
SQL> EXEC SYS.XS_PRINCIPAL.GRANT_ROLES('app_user1', 'role2');
declare
  sessionid raw(16);
begin
  sys.dbms_xs_sessions.create_session('app_user2', sessionid);
  sys.dbms_xs_sessions.attach_session(sessionid);
  sys.dbms_xs_sessions.switch_user('app_user1');
end;
/
SQL> SELECT grantee, granted_role FROM DBA_XS_ROLE_GRANTS;
SQL> SELECT sessionid, role FROM DBA_XS_SESSION_ROLES;
SQL> SELECT user_name, sessionid, proxy_user FROM DBA_XS_SESSIONS;

2.1.6 アプリケーション・ユーザーの検証

管理構成の変更後は、必ずReal Application Securityオブジェクトを検証することをお薦めします。XS_DIAGパッケージには、これらの変更がReal Application Securityオブジェクト間の複雑な関係に悪影響を与えないようにする検証APIのセットが含まれます。アプリケーション・ユーザー・アカウントを検証するには、XS_DIAG.VALIDATE_PRINCIPALファンクションを使用します。コール元は、このパッケージに対する実行者権限を持っており、XS_DIAGパッケージを実行するためのADMIN_ANY_SEC_SECURITY権限を持っている必要があります。

詳細は、「VALIDATE_PRINCIPALファンクション」を参照してください。

2.2 アプリケーション・ロールの構成について

2.2.1 アプリケーション・ロールについて

アプリケーション・ロールは、アプリケーション・ユーザーまたは別のアプリケーション・ロールにのみ付与できるロールです。アプリケーション・ロールは、アプリケーションにアクセスするために、ACL内で識別される共通のアプリケーション権限を持つ必要のあるアプリケーション・ユーザーをグループ化する手段です。XS_PRINCIPAL.CREATE_ROLEプロシージャでは、標準アプリケーション・ロールを作成できます。XS_PRINCIPAL.CREATE_DYNAMIC_ROLEプロシージャでは、動的アプリケーション・ロール(アプリケーション・ロールの一種)を作成できます。

アプリケーション・ロールは、概念的にはエンタープライズ・ロールと似ています。エンタープライズ・ロールは、エンタープライズ・ユーザーにのみ付与することが可能で、その権限付与はデータベースの外部で発生します。同様に、アプリケーション・ロールは、アプリケーション・ユーザーまたはアプリケーション・ロールにのみ付与することが可能で、その権限付与は、データベースの標準的な権限付与メカニズムの外部で発生します。動的ロールは、アプリケーション・ユーザーまたは別のアプリケーション・ロールには付与できず、連結セッション・コールのパラメータとして、アプリケーション・セッションでのみ有効にできます(動的アプリケーション・ロールを参照)。

関連項目:

2.2.2 標準および動的アプリケーション・ロール

Real Application Securityでは、標準アプリケーション・ロールと動的アプリケーション・ロールを使用できます。

この項では、次の項目について説明します。
2.2.2.1 標準アプリケーション・ロール

標準アプリケーション・ロールは、アプリケーション・ユーザーまたは別のアプリケーション・ロール(標準または動的)に付与できるアプリケーション・ロールです。標準アプリケーション・ロールはデフォルトで有効にするかどうかを指定できます。

2.2.2.2 動的アプリケーション・ロール

動的アプリケーション・ロールは、ユーザーがSSLを使用してログオンする場合や、特定の期間ログオンする場合など、一定の状況下でのみ有効になるアプリケーション・ロールです。動的アプリケーション・ロールは、平日に接続を行うすべてのアプリケーション・ユーザーに付与されるアプリケーション権限がある場合などに使用できます。一定の基準に一致すると、アプリケーションによってこれらのアプリケーション・ロールが有効化されます。

動的アプリケーション・ロールを有効にする基準は、アプリケーションによって決定されますが、この基準はアプリケーションのリクエストで、アプリケーションまたはデータベースによって評価されます。

  • アプリケーションが基準を評価する場合

    アプリケーションが基準を評価し、アプリケーション・ロールがそれに一致する場合、アプリケーションは、アプリケーション・セッションに連結されていれば、アプリケーション・ユーザーの動的アプリケーション・ロールを有効にできます。アプリケーションがアプリケーション・セッションから連結解除すると、動的アプリケーション・ロールは自動的に無効になります。

    セキュリティ上の理由から、セッション中は動的アプリケーション・ロールを無効にできません。これは、それらが拒否的なアプリケーション権限を推測させる可能性があるため、特に重要です。

  • データベースが基準を評価する場合

    データベースが基準を評価し、アプリケーション・ロールがそれに一致する場合、データベースは、アプリケーション・ユーザーのアプリケーション・ロールを有効にできます。データベースは、2つのタイプのタイムアウト(セッションが最後にアクセスされた時点からのタイムアウトと、セッションが最後に認証された時点からのタイムアウト)に基づいて、動的アプリケーション・ロールを無効にできます。Oracle Databaseは、セッションが最初に連結されたときにこれらのタイムアウトを確認します。

前もってユーザーに動的アプリケーション・ロールを正式に付与する必要はありません。標準の有効化および無効化APIを通じて動的アプリケーション・ロールを有効または無効にする方法はありません。動的アプリケーション・ロールを他のアプリケーション・ロールに付与することはできませんが、他のアプリケーション・ロールを動的ロールに付与することは可能です。

2.2.3 アプリケーション・ロールの構成について

2.2.3.1 標準アプリケーション・ロールの作成

標準アプリケーション・ロールを作成するには、CREATE ROLEシステム権限を持つユーザーsec_mgrとしてSQL*Plusにログインし、XS_PRINCIPAL.CREATE_ROLEプロシージャを使用します。

例2-7に、app_regular_roleという標準アプリケーション・ロールを作成する方法を示します。start_dateおよびend_dateパラメータで、このアプリケーション・ロールのアクティブな開始時間と終了時間を指定します。enableパラメータはTRUEに設定します。

標準アプリケーション・ロールを作成したら、それを1つ以上のアプリケーション・ユーザーまたはアプリケーション・ロールに付与できます。次の項を参照してください。

アプリケーション・ユーザーへのアプリケーション・ロールの付与について

例2-7 標準アプリケーション・ロールの作成

sqlplus sec_mgr
Enter password: password
Connected. 
DECLARE 
  st_date TIMESTAMP WITH TIME ZONE;
  ed_date TIMESTAMP WITH TIME ZONE;
BEGIN
  st_date := SYSTIMESTAMP;
  ed_date := TO_TIMESTAMP_TZ('2013-06-18 11:00:00 -5:00','YYYY-MM-DD HH:MI:SS');
  SYS.XS_PRINCIPAL.CREATE_ROLE 
      (name        => 'app_regular_role',
      enabled      =>  TRUE,
      start_date   =>  st_date,
      end_date     =>  ed_date);
END;
/
2.2.3.2 動的アプリケーション・ロールの作成

動的アプリケーション・ロールを作成するには、CREATE ROLEシステム権限を持つユーザーsec_mgrとしてSQL*Plusにログインし、XS_PRINCIPAL.CREATE_DYNAMIC_ROLEプロシージャを使用します。

例2-8に、app_dynamic_roleという動的アプリケーション・ロールを作成する方法を示します。オプションのdurationパラメータでは、アプリケーション・ロールのアクティブ期間(分)を指定します。scopeパラメータは、このロールの有効範囲を指定します。SESSION_SCOPE (デフォルト値)またはREQUEST_SCOPEのいずれかを指定できます。SESSION_SCOPEでは、有効化された動的ロールは、セッションから連結解除して再度セッションに連結した場合でも、有効な状態が続きます(セッションの再連結時に無効化するように明示的に指定していない場合)。REQUEST_SCOPEでは、ロールはセッションの連結解除後に無効になります。

この例では、動的アプリケーション・ロールは40分間アクティブであり、有効範囲は現在のアプリケーション・セッションのSESSION_SCOPEに設定されます。そのため、動的アプリケーション・ロールは、セッションの連結を解除してセッションを再度連結した場合も、動的アプリケーション・ロールの作成後の時間制限40分を超えないかぎりはアクティブです。

例2-8 動的アプリケーション・ロールの作成

sqlplus sec_mgr
Enter password: password
Connected. 
BEGIN
  SYS.XS_PRINCIPAL.CREATE_DYNAMIC_ROLE
      (name         => 'app_dynamic_role',
      duration      => 40,
      scope         => XS_PRINCIPAL.SESSION_SCOPE);
END;
/
2.2.3.3 アプリケーション・ロールの検証

管理構成の変更後は、必ずReal Application Securityオブジェクトを検証することをお薦めします。XS_DIAGパッケージには、これらの変更がReal Application Securityオブジェクト間の複雑な関係に悪影響を与えないようにする検証APIのセットが含まれます。アプリケーション・ロールを検証するには、XS_DIAG.VALIDATE_PRINCIPALファンクションを使用します。詳細は、「VALIDATE_PRINCIPALファンクション」を参照してください。

トラブルシューティングのアドバイスは、Oracle Database Real Application Securityのトラブルシューティングを参照してください。

2.2.4 事前定義された標準アプリケーション・ロールおよび動的アプリケーション・ロール

Real Application Securityセッションで事前定義された動的アプリケーション・ロールを使用すると、アプリケーション・ユーザーは、その実行時の状態に基づいてアプリケーション権限を取得できます。これらのアプリケーション・ロールは、権限付与では取得できません。

例として、企業ファイアウォール内から接続するアプリケーション・ユーザーに対してアプリケーション・ロールを有効にし、ファイアウォールの外部から接続する場合よりもアプリケーション・ユーザーに対して多くのアプリケーション権限を付与する場合があげられます。

Real Application Securityの事前定義された標準アプリケーション・ロール、動的アプリケーション・ロールおよびデータベース・ロールの詳細は、ロールを参照してください。

標準アプリケーション・ロールはアプリケーション・ユーザーに付与できますが、動的アプリケーション・ロールは付与できません。動的アプリケーション・ロールは、ユーザーの状態に基づいて有効化されます。

詳細は、標準および動的アプリケーション・ロールを参照してください。

2.3 アプリケーション・ユーザーおよびアプリケーション・ロールの有効日

アプリケーション・ユーザー、アプリケーション・ロールおよびロールの権限付与に有効日を指定できます。アプリケーション・ユーザーまたはアプリケーション・ロールは、有効な開始日および終了日によって定義された期間内でのみ使用できます。例2-9に、アプリケーション・ユーザーの有効日を指定する方法を示します。

有効日の制限は、アプリケーション・ユーザーまたはアプリケーション・ロールの属性にする必要がない場合もあります。かわりに、ロールの権限付与ごとに有効日を制限するのみで済みます。この場合、アプリケーション・ロールの権限付与に対して有効な開始日と終了日を指定できます。これは、その特定のアプリケーション・ロールの権限付与を制限するのみで、ファイングレイン・アクセス制御ポリシーの実装に対応します。例2-10に、アプリケーション・ロールの有効日を指定する方法を示します。

有効日による制限の最も直接的な影響は次のとおりです。

  • アプリケーション・ユーザーが現在有効(開始日と終了日で定義された期間内)ではない場合、その特定のアプリケーション・ユーザーのセッションは作成できません。

  • アプリケーション・ロールが現在有効ではない場合、アプリケーション・ユーザーはセッションでそのアプリケーション・ロール(および任意の子)を使用できません。

  • 複数のアプリケーション・ロールの共有された子であるアプリケーション・ロールの場合、少なくとも1つの親が有効であれば、子のアプリケーション・ロールを使用できます。

  • アプリケーション・ロールの権限付与が現在有効ではない場合、権限が付与されるアプリケーション・ユーザーまたはアプリケーション・ロールは、そのアプリケーション・ロール(および任意の子)を使用できません。

注意:

有効日は、アプリケーション・ユーザーとアプリケーション・ロールの使用に加えられる制限の性質をよく検討してから、ポリシー内で使用する必要があります。

例2-9 アプリケーション・ユーザーの有効日の設定

sqlplus sec_mgr
Enter password: password
Connected. 
DECLARE
 startDate TIMESTAMP := TO_TIMESTAMP (
      '2012-01-01 11:00:00','YYYY-MM-DD HH:MI:SS');
 endDate TIMESTAMP := TO_TIMESTAMP (
      '2013-01-01 11:00:00','YYYY-MM-DD HH:MI:SS');

BEGIN
  SYS.XS_PRINCIPAL.CREATE_USER
      (name        => 'lwuser1',
      start_date   => startDate,
      end_date     => endDate);
END;
/

例2-10 アプリケーション・ユーザーのアプリケーション・ロールの有効日の設定

sqlplus sec_mgr
Enter password: password
Connected. 
DECLARE
 startDate TIMESTAMP := TO_TIMESTAMP ('2012-01-01 11:00:00','YYYY-MM-DD
 HH:MI:SS');
 endDate TIMESTAMP := TO_TIMESTAMP ('2013-01-01 11:00:00','YYYY-MM-DD
 HH:MI:SS');
BEGIN
  SYS.XS_PRINCIPAL.GRANT_ROLES
    (grantee      => 'lwuser1',
     role         => 'app_regular_role',
     start_date   => startDate,
     end_date     => endDate);
END;
/

2.4 プリンシパルへのアプリケーション権限の付与について

2.4.1 アプリケーション・ユーザーへのアプリケーション・ロールの付与について

この項では、次の項目について説明します。

2.4.1.1 新規アプリケーション・ユーザーの作成およびそのユーザーへのアプリケーション・ロールの付与

例2-11に、アプリケーション・ユーザー・アカウントの作成時にアプリケーション・ロールappl1_regular_roleをアプリケーション・ユーザーlwuser1に付与する方法を示します。

既存のアプリケーション・ロールのリストを確認するには、DBA_XS_ROLESデータ・ディクショナリ・ビューを問い合せます。

例2-11 新規アプリケーション・ユーザーの作成およびそのユーザーへのアプリケーション・ロールの付与

sqlplus sec_mgr
Enter password: password
Connected. 
BEGIN
  SYS.XS_PRINCIPAL.CREATE_USER('lwuser1');
  SYS.XS_PRINCIPAL.GRANT_ROLES('lwuser1', 'appl1_regular_role');
END;
/
2.4.1.2 既存のアプリケーション・ユーザーへのアプリケーション・ロールの付与

例2-12に、アプリケーション・ロールappl1_regular_roleを既存のアプリケーション・ユーザーlwuser1に付与する方法を示します。動的アプリケーション・ロールを既存のアプリケーション・ユーザーに付与することはできません。

DBA_XS_USERSビューを問い合せることで、既存のアプリケーション・ユーザー・アカウントのリストを確認できます。

例2-12 既存のアプリケーション・ユーザーへのアプリケーション・ロールの付与

sqlplus sec_mgr
Enter password: password
Connected. 
BEGIN
  SYS.XS_PRINCIPAL.GRANT_ROLES('lwuser1', 'appl1_regular_role');
END;
/

2.4.2 別のアプリケーション・ロールへのアプリケーション・ロールの付与

例2-13に、別の標準アプリケーション・ロールに標準アプリケーション・ロールを付与する方法を示します。動的アプリケーション・ロールを他の標準アプリケーション・ロールに付与することはできませんが、他の標準アプリケーション・ロールを動的アプリケーション・ロールに付与することは可能です。既存のアプリケーション・ロールのリストを確認するには、DBA_XS_ROLESビューを問い合せます(「DBA_XS_ROLES」を参照)。

例2-13 別の標準アプリケーション・ロールへの標準アプリケーション・ロールの付与

sqlplus sec_mgr
Enter password: password
Connected. 
BEGIN
  SYS.XS_PRINCIPAL.GRANT_ROLES(grantee => 'app_regular_role', role => 'appl1_regular_role');
END;
/

2.4.3 アプリケーション・ロールへのデータベース・ロールの付与

アプリケーション・ロールにデータベース・ロールを付与するには、SQL GRANT文を使用します。DBA_ROLESデータ・ディクショナリ・ビューを問い合せることで、既存のデータベース・ロールのリストを確認できます。

例2-14に、データベース・ロールcust_roleをアプリケーション・ロールapp_regular_roleに付与する方法を示します。

例2-14 アプリケーション・ロールへのデータベース・ロールの付与

sqlplus sec_mgr
Enter password: password
Connected. 
GRANT cust_role TO app_regular_role;