ヘッダーをスキップ
Oracle® Application Expressアプリケーション・ビルダー・ユーザーズ・ガイド
リリース4.2 for Oracle Database 12c
B71338-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

15.1 セキュリティに関する管理者のベスト・プラクティスの理解

このセクションでは、Oracle Application Express管理者のためのセキュリティのベスト・プラクティスについて説明します。

内容は次のとおりです。

15.1.1 埋込みPL/SQLゲートウェイを使用する場合のセキュリティに関する考慮事項

埋込みPL/SQLゲートウェイは、Oracle XML DB HTTPリスナーの一部としてデータベースで実行されます。Oracle XML DB HTTPリスナーおよび埋込みPL/SQLゲートウェイには、Oracle HTTP Serverおよびmod_plsqlと同等の主要機能があります。HTTPリスナーは、Oracle Application Expressがインストールされているデータベースと同じデータベースで実行されるため、HTTPリスナーをデータベースから分けることはできません。このため、インターネット上で実行されるアプリケーションに埋込みPL/SQLゲートウェイを使用することはお薦めしません。また、埋込みPL/SQLゲートウェイでは、mod_plsqlを使用するOracle HTTP Serverほどに柔軟な構成および詳細なログは提供されません。

15.1.2 Oracle Application Expressでのmod_plsqlを使用したOracle HTTP Serverの構成について

Oracle HTTP Serverは、mod_plsqlプラグインを使用してOracle Database内のOracle Application Expressエンジンと通信します。mod_plsqlファンクションは、WebサーバーとOracle Database内のOracle Application Expressエンジン間の通信ブローカとして機能します。

mod_plsqlの各リクエストは、Database Access Descriptor(DAD)というデータベースにアクセスする際に使用する一連の構成値に関連付けられます。mod_plsqlには、リクエストされたプロシージャのさらなる処理を許可または禁止することができるPlsqlRequestValidationFunctionというDADパラメータがあります。このパラメータを使用すると、DADからの実行の許可対象にしないパッケージおよびプロシージャのコールをブロックすることで、PL/SQLアプリケーションにさらに強力なセキュリティを実装できます。Oracle Application ExpressのDAD構成では、PlsqlRequestValidationFunctionディレクティブに値wwv_flow_epg_include_modules.authorizeを使用することをお薦めします。

PlsqlRequestValidationFunctionパラメータの目的は、mod_plsqlによってどのプロシージャが起動されるかを制御することです。デフォルトでは、Oracle Application Expressのパブリックなエントリ・ポイントのみが許可されます。これは、Oracle Application Expressに付属する検証ファンクションを使用して拡張できます。詳細は、『Oracle Application Express管理ガイド』のデータベース・アクセス記述子(DAD)によるOracle Application Expressへのアクセスの制限に関する説明を参照してください。

15.1.3 Secure Sockets Layer (SSL)の使用

Secure Sockets Layer(SSL)は、インターネット上に転送されるデータのセキュリティを管理するためのプロトコルです。SSLは、HTTPSプロトコルを使用してWebアプリケーションに実装されます。機密データが暗号化されていない(クリアテキストの)通信チャネルに送信されないように、SSL (HTTPSプロトコル)を使用してOracle Application Expressアプリケーションを実行することをお薦めします。

Oracle Application Express管理サービスのセキュリティ設定ページで「HTTPSが必要」属性を「はい」に設定すると、Oracle Application Expressインスタンスとすべての関連アプリケーションで、HTTPSを要求できます。

「HTTPSが必要」属性を「はい」に設定してログアウトすると、プロトコルにHTTPSが使用されないかぎり、Oracle Application Express管理サービスおよびOracle Application Expressワークスペースに開発者または管理者としてログインできなくなります。


関連項目:

Oracle Application Express管理ガイドの「HTTPSの必要性」

15.1.4 Oracle BI Publisherとの統合

Oracle Application ExpressとOracle BI Publisherを統合する場合は、Secure Sockets Layer(SSL)を使用することをお薦めします。Oracle BI Publisherサーバー用にSSL(HTTPSプロトコル)を構成したら、ウォレットを作成して、内部管理環境設定でレポート・サーバーにHTTPSプロトコルを指定する必要があります。


関連項目:

Oracle Application Express管理ガイドの「ウォレット情報の構成」および「レポート出力の構成」

15.1.5 パスワードの複雑性ルールの設定について

ワークスペースの管理者および開発者は、Oracle Application Expressの開発環境にログインし、ワークスペース内で開発されたアプリケーションに対するエンド・ユーザーの認証を行うためのユーザー・アカウントを作成できます。Oracle Application Express管理者は、これらのアカウントのパスワードに対して、パスワードの複雑性ルール(またはポリシー)を作成できます。これらのルールは、全ワークスペースで、インストールのすべてのアカウントに適用されます。

次に、パスワードの複雑性ポリシーの例を示します。

すべてのパスワードには、次が含まれている必要があります。

  • 1つ以上の大文字。

  • 1つ以上の数字。

  • 6つ以上の文字。

他にも多くのバリエーションが考えられることに注意してください。各Oracle Application Expressインスタンスに対して、管理者がパスワードの複雑性ポリシーを作成することをお薦めします。詳細は、『Oracle Application Express管理ガイド』のすべてのワークスペースに対するログイン制御の有効化に関する説明、厳密なパスワード・ポリシーに関する説明およびワークスペースに対するログイン制御の有効化に関する説明を参照してください。

15.1.5.1 パスワードの再利用の制限

サイト管理者は、すべての管理者アカウント、開発者アカウントおよびエンド・ユーザー・アカウントに対し、そのアカウントに以前使用されたパスワードの履歴に基づいて、パスワードの再利用を制限することができます。

パスワードの再利用を制限するには、次のステップを実行します。

  1. SQL*Plusを起動して、Oracle Application Expressがインストールされたデータベースに、apex_administrator_roleロールを使用するか、SYSDBAロールを指定するSYSとして接続します。次に例を示します。

    • Windowsの場合:

      SYSTEM_DRIVE:\ sqlplus /nolog
      SQL> CONNECT SYS as SYSDBA
      Enter password: SYS_password
      
    • UNIXおよびLinuxの場合:

      $ sqlplus /nolog
      SQL> CONNECT SYS as SYSDBA
      Enter password: SYS_password
      

    ヒント:

    APEX_ADMINISTRATOR_ROLEは、別のデータベース・ロールを介してではなく、ユーザーに直接付与される必要があります。

  2. 次の文を実行します。

    ALTER SESSION SET CURRENT_SCHEMA = APEX_040200;
    
    
  3. 次の文を実行します。

    BEGIN
    APEX_INSTANCE_ADMIN.SET_PARAMETER('PASSWORD_HISTORY_DAYS',365);
    COMMIT;
    END;
    /
    

    これによって、作成または更新するパスワードは、過去365日間にそのアカウント用として使用されていないものに制限されます。以前に使用されたパスワード(実際は、パスワードのハッシュ表現)は、Oracle Application Expressをインストールしたときから記録されます。

  4. この機能を無効にするには、パラメータ値に0を指定して前述のブロックを実行します。次に例を示します。

    BEGIN
    APEX_INSTANCE_ADMIN.SET_PARAMETER('PASSWORD_HISTORY_DAYS',0);
    COMMIT;
    END;
    /
    

ヒント:

開発者は、Oracle Application Express APIリファレンスに記載されているAPEX_UTIL.STRONG_PASSWORD_CHECKプロシージャおよびAPEX_UTIL.STRONG_PASSWORD_VALIDATIONファンクションも使用することができます。

15.1.6 Oracle Application Expressのランタイム環境の利点

Oracle Application Expressのランタイム環境では本番アプリケーションを実行できますが、管理用のWebインタフェースは使用できず、これらのアプリケーションを直接開発することはできません。

機密の本番Oracle Application Expressアプリケーションは、Oracle Application Expressのランタイム・インストールで実行することをお薦めします。ランタイム・インストールでは、Webベースのアプリケーション開発環境が使用されないため、Application Builder、SQL Workshopおよび本番インストールに関係するユーティリティが使用できません。また、ランタイム環境に含まれるのは、アプリケーションの実行に必要なOracle Application Expressデータベース・オブジェクトおよび権限のみであるため、より堅牢な環境になります。


関連項目:

Oracle Application Express管理ガイドの「ランタイム環境の管理」

15.1.7 セッション・タイムアウトの理解

「セッション・タイムアウト」属性を構成すると、アプリケーションの公開を抑制できます。ユーザーは、長時間コンピュータを操作しなかったり、アプリケーションを終了せずにコンピュータの元を離れることが頻繁にあります。このため、アプリケーションのユーザー・アイデンティティが、権限のないユーザーによって簡単に引き継がれる可能性があります。セッション・タイムアウトおよびアイドル・タイムアウトを設定すると、指定したタイムアウトの後、ユーザーは自動的にアプリケーションからログアウトされます。

「セッション・タイムアウト」属性には、次のものがあります。

  • 最大セッションの長さ

  • セッション・タイムアウトURL

  • 最大セッション・アイドル時間

  • アイドル・タイムアウトURL

アプリケーション・レベルでのこれらの属性の構成の詳細は、「セッション・タイムアウト」を参照してください。Oracle Application Expressインスタンス全体でのこれらの属性の構成の詳細は、Oracle Application Express管理ガイドの「セッション・タイムアウトの構成」を参照してください。

15.1.8 Oracle Database 12cのネットワーク・サービスの有効化

Oracle Database 12cでは、ネットワーク・サービスとの通信機能が、デフォルトで無効化されています。このため、Oracle Database 12cでOracle Application Expressを実行している場合は、新しいDBMS_NETWORK_ACL_ADMINパッケージを使用して、APEX_040200データベース・ユーザーにすべてのホストに対する接続権限を付与する必要があります。これらの権限を付与しないと、次の場合に問題が発生します。

  • Oracle Application Expressによる外部への電子メールの送信

    ユーザーはAPEX_MAILパッケージからメソッドをコールできますが、外部へ電子メールを送信するときに問題が発生します。

  • Oracle Application Express内のWebサービスの使用

  • PDF/レポートの印刷

内容は次のとおりです。


ヒント:

このセクションで示されている例を実行するには、データベースのcompatible初期化パラメータが11.1.0.0.0以上に設定されている必要があります。デフォルトでは、Oracle Database 12cのパラメータは事前に適切に設定されていますが、以前のリリースからOracle Database 12cにアップグレードされたデータベースのパラメータは適切に設定されていない場合があります。データベースの初期化パラメータの変更の詳細は、Oracle Database管理者ガイドのOracle Databaseの作成と構成に関する項を参照してください。

15.1.8.1 接続権限の付与

次の例は、APEX_040200データベース・ユーザーにすべてのホストに対する接続権限を付与する方法を示しています。この例では、Oracle Application Expressがインストールされているデータベースに、SYSDBAロールが指定されているSYSとして接続するとします。

DECLARE
  ACL_PATH  VARCHAR2(4000);
  ACL_ID    RAW(16);
BEGIN
  -- Look for the ACL currently assigned to '*' and give APEX_040200
  -- the "connect" privilege if APEX_040200 does not have the privilege yet.
 
  SELECT ACL INTO ACL_PATH FROM DBA_NETWORK_ACLS
   WHERE HOST = '*' AND LOWER_PORT IS NULL AND UPPER_PORT IS NULL;
 
  -- Before checking the privilege, ensure that the ACL is valid
  -- (for example, does not contain stale references to dropped users).
  -- If it does, the following exception will be raised:
  --
  -- ORA-44416: Invalid ACL: Unresolved principal 'APEX_040200'
  -- ORA-06512: at "XDB.DBMS_XDBZ", line ...
  --
  SELECT SYS_OP_R2O(extractValue(P.RES, '/Resource/XMLRef')) INTO ACL_ID
    FROM XDB.XDB$ACL A, PATH_VIEW P
   WHERE extractValue(P.RES, '/Resource/XMLRef') = REF(A) AND
         EQUALS_PATH(P.RES, ACL_PATH) = 1;
 
  DBMS_XDBZ.ValidateACL(ACL_ID);
   IF DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE(ACL_PATH, 'APEX_040200', 
     'connect') IS NULL THEN 
      DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(ACL_PATH, 
     'APEX_040200', TRUE, 'connect'); 
  END IF;
 
EXCEPTION
  -- When no ACL has been assigned to '*'.
  WHEN NO_DATA_FOUND THEN
  DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('power_users.xml',
    'ACL that lets power users to connect to everywhere',
    'APEX_040200', TRUE, 'connect');
  DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('power_users.xml','*');
END;
/
COMMIT;

次の例は、ローカル・ネットワーク・リソースへのアクセス権について、より少ない権限を付与する方法を示しています。この例では、Oracle Application Expressオンライン・ヘルプを索引付けできます。また、対象サーバーもローカル・ホスト上に存在する場合は、電子メールおよびPDFへの出力を行うことができる場合があります。

DECLARE
  ACL_PATH  VARCHAR2(4000);
  ACL_ID    RAW(16);
BEGIN
  -- Look for the ACL currently assigned to 'localhost' and give APEX_040200
  -- the "connect" privilege if APEX_040200 does not have the privilege yet.
  SELECT ACL INTO ACL_PATH FROM DBA_NETWORK_ACLS
   WHERE HOST = 'localhost' AND LOWER_PORT IS NULL AND UPPER_PORT IS NULL;
 
  -- Before checking the privilege, ensure that the ACL is valid
  -- (for example, does not contain stale references to dropped users).
  -- If it does, the following exception will be raised:
  --
  -- ORA-44416: Invalid ACL: Unresolved principal 'APEX_040200'
  -- ORA-06512: at "XDB.DBMS_XDBZ", line ...
  --
 
  SELECT SYS_OP_R2O(extractValue(P.RES, '/Resource/XMLRef')) INTO ACL_ID
    FROM XDB.XDB$ACL A, PATH_VIEW P
   WHERE extractValue(P.RES, '/Resource/XMLRef') = REF(A) AND
         EQUALS_PATH(P.RES, ACL_PATH) = 1;
 
  DBMS_XDBZ.ValidateACL(ACL_ID);
   IF DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE(ACL_PATH, 'APEX_040200', 
     'connect') IS NULL THEN 
      DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(ACL_PATH, 
     'APEX_040200', TRUE, 'connect'); 
  END IF;
 
EXCEPTION
  -- When no ACL has been assigned to 'localhost'.
  WHEN NO_DATA_FOUND THEN
  DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('local-access-users.xml',
    'ACL that lets power users to connect to everywhere',
    'APEX_040200', TRUE, 'connect');
  DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('local-access-users.xml','localhost');
END;
/
COMMIT;

15.1.8.2 無効なACLエラーのトラブルシューティング

前述のスクリプトの実行後に「ORA-44416: 無効な ACL」エラーを受信したら、次の問合せを使用して無効なACLを識別します。

REM Show the dangling references to dropped users in the ACL that is assigned
REM to '*'.

SELECT ACL, PRINCIPAL
  FROM DBA_NETWORK_ACLS NACL, XDS_ACE ACE
 WHERE HOST = '*' AND LOWER_PORT IS NULL AND UPPER_PORT IS NULL AND
       NACL.ACLID = ACE.ACLID AND
       NOT EXISTS (SELECT NULL FROM ALL_USERS WHERE USERNAME = PRINCIPAL);

次に、次のコードを実行してACLを修正します。

DECLARE
  ACL_ID   RAW(16);
  CNT      NUMBER;
BEGIN
  -- Look for the object ID of the ACL currently assigned to '*'
  SELECT ACLID INTO ACL_ID FROM DBA_NETWORK_ACLS
   WHERE HOST = '*' AND LOWER_PORT IS NULL AND UPPER_PORT IS NULL;

  -- If just some users referenced in the ACL are invalid, remove just those
  -- users in the ACL. Otherwise, drop the ACL completely.
  SELECT COUNT(PRINCIPAL) INTO CNT FROM XDS_ACE
   WHERE ACLID = ACL_ID AND
         EXISTS (SELECT NULL FROM ALL_USERS WHERE USERNAME = PRINCIPAL);

  IF (CNT > 0) THEN

    FOR R IN (SELECT PRINCIPAL FROM XDS_ACE
               WHERE ACLID = ACL_ID AND
                     NOT EXISTS (SELECT NULL FROM ALL_USERS
                                  WHERE USERNAME = PRINCIPAL)) LOOP
      UPDATE XDB.XDB$ACL
         SET OBJECT_VALUE =
               DELETEXML(OBJECT_VALUE,
                         '/ACL/ACE[PRINCIPAL="'||R.PRINCIPAL||'"]')
       WHERE OBJECT_ID = ACL_ID;
    END LOOP;

  ELSE
    DELETE FROM XDB.XDB$ACL WHERE OBJECT_ID = ACL_ID;
  END IF;

END;
/

REM commit the changes.

COMMIT;

ACLの修正後、このセクションの最初のスクリプトを実行してAPEX_040200ユーザーにACLを適用する必要があります。「接続権限の付与」を参照してください。