このセクションでは、Oracle Application Express管理者のためのセキュリティのベスト・プラクティスについて説明します。
この項に含まれる内容は次のとおりです。
埋込みPL/SQLゲートウェイは、XML DB HTTPプロトコル・リスナーの一部としてデータベースで実行されます。XML DB HTTP Protocol Listenerおよび埋込みPL/SQLゲートウェイには、Oracle HTTP Serverおよびmod_plsql
と同等の主要機能があります。HTTPリスナーはOracle Application Expressがインストールされているデータベースと同じデータベースで実行されるため、データベースから分離できません。このため、インターネット上で実行されるアプリケーションには、埋込みPL/SQLゲートウェイを使用しないことをお薦めします。また、埋込みPL/SQLゲートウェイでは、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管理ガイドのOracle Application Expressへのアクセスの制限に関するセクションを参照してください。
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の必要性」 |
Oracle Application ExpressとOracle BI Publisherを統合する場合は、Secure Sockets Layer(SSL)を使用することをお薦めします。Oracle BI Publisherサーバー用にSSL(HTTPSプロトコル)を構成したら、ウォレットを作成して、内部管理環境設定でレポート・サーバーにHTTPSプロトコルを指定する必要があります。
関連項目: Oracle Application Express管理ガイドの「ウォレット情報の構成」および「レポート出力の構成」 |
ワークスペースの管理者および開発者は、Oracle Application Expressの開発環境にログインし、ワークスペース内で開発されたアプリケーションに対するエンド・ユーザーの認証を行うためのユーザー・アカウントを作成できます。Oracle Application Express管理者は、これらのアカウントのパスワードに対して、パスワードの複雑性ルール(またはポリシー)を作成できます。これらのルールは、全ワークスペースで、インストールのすべてのアカウントに適用されます。
次に、パスワードの複雑性ポリシーの例を示します。
すべてのパスワードには、次が含まれている必要があります。
1つ以上の大文字。
1つ以上の数字。
6つ以上の文字。
他にも多くのバリエーションが考えられることに注意してください。各Oracle Application Expressインスタンスに対して、管理者がパスワードの複雑性ポリシーを作成することをお薦めします。詳細は、Oracle Application Express管理ガイドの「すべてのワークスペースに対するログイン制御の有効化」、「パスワード・ポリシーについて」および「ワークスペースに対するログイン制御の有効化」を参照してください。
サイト管理者は、すべての管理者アカウント、開発者アカウントおよびエンド・ユーザー・アカウントに対し、そのアカウントに以前使用されたパスワードの履歴に基づいて、パスワードの再利用を制限することができます。
パスワードの再利用を制限するには、次のステップを実行します。
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
次の文を実行します。
ALTER SESSION SET CURRENT_SCHEMA = APEX_030200;
次の文を実行します。
BEGIN APEX_INSTANCE_ADMIN.SET_PARAMETER('PASSWORD_HISTORY_DAYS',365); COMMIT; END; /
これによって、作成または更新するパスワードは、過去365日間にそのアカウント用として使用されていないものに制限されます。以前に使用されたパスワード(実際は、パスワードのハッシュ表現)は、Oracle Application Express 3.2をインストールしたときから記録されます。
この機能を無効にするには、パラメータ値に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ファンクションも使用することができます。 |
Oracle Application Expressのランタイム環境では本番アプリケーションを実行できますが、管理用のWebインタフェースは使用できず、これらのアプリケーションを直接開発することはできません。
機密の本番Oracle Application Expressアプリケーションは、Oracle Application Expressのランタイム・インストールで実行することをお薦めします。ランタイム・インストールでは、Webベースのアプリケーション開発環境が使用されないため、Application Builder、SQL Workshopおよび本番インストールに関係するユーティリティが使用できません。また、ランタイム環境に含まれるのは、アプリケーションの実行に必要なOracle Application Expressデータベース・オブジェクトおよび権限のみであるため、より堅牢な環境になります。
関連項目: Oracle Application Express管理ガイドの「ランタイム環境の管理」 |
「セッション・タイムアウト」属性を構成すると、アプリケーションの公開を抑制できます。ユーザーは、長時間コンピュータを操作しなかったり、アプリケーションを終了せずにコンピュータの元を離れることが頻繁にあります。このため、アプリケーションのユーザー・アイデンティティが、権限のないユーザーによって簡単に引き継がれる可能性があります。セッション・タイムアウトおよびアイドル・タイムアウトを設定すると、指定したタイムアウトの後、ユーザーは自動的にアプリケーションからログアウトされます。
「セッション・タイムアウト」属性には、次のものがあります。
最大セッションの長さ
セッション・タイムアウトURL
最大セッション・アイドル時間
アイドル・タイムアウトURL
アプリケーション・レベルでのこれらの属性の構成の詳細は、「セッション・タイムアウト」を参照してください。Oracle Application Expressインスタンス全体でのこれらの属性の構成の詳細は、Oracle Application Express管理ガイドの「セッション・タイムアウトの構成」を参照してください。
Oracle Database 11g リリース1 (11.1)では、ネットワーク・サービスとの通信機能がデフォルトで無効になっています。このため、Oracle Database 11g リリース1 (11.1)でOracle Application Expressを実行している場合は、新しいDBMS_NETWORK_ACL_ADMIN
パッケージを使用して、APEX_030200
データベース・ユーザーにすべてのホストに対する接続権限を付与する必要があります。これらの権限を付与しないと、次の動作で問題が発生します。
Oracle Application Expressでアウトバウンド・メールを送信する。
ユーザーはAPEX_MAIL
パッケージからメソッドをコールできますが、アウトバンド・メールの送信時に問題が発生します。
Oracle Application ExpressでWebサービスを使用する。
PDF/レポートを印刷する。
オンライン・ヘルプのコンテンツ検索(検索リンクの使用)
この項に含まれる内容は次のとおりです。
ヒント: このセクションで示されている例を実行するには、データベースのcompatible初期化パラメータが11.1.0.0.0以上に設定されている必要があります。11g データベースではデフォルトでパラメータが正しく設定されますが、以前のバージョンから11g にアップグレードされたデータベースでは正しく設定されていない場合があります。データベース初期化パラメータの変更については、『Oracle Database管理者ガイド』の「Oracle Databaseの作成および構成」を参照してください。 |
次の例では、APEX_030200
データベース・ユーザーにホストに対する接続権限を付与する方法が示されています。
DECLARE ACL_PATH VARCHAR2(4000); ACL_ID RAW(16); BEGIN -- Look for the ACL currently assigned to '*' and give APEX_030200 -- the "connect" privilege if APEX_030200 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, make sure 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_030200' -- 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_030200', 'connect') IS NULL THEN DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(ACL_PATH, 'APEX_030200', 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_030200', 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_030200 -- the "connect" privilege if APEX_030200 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, make sure 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_030200' -- 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_030200', 'connect') IS NULL THEN DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(ACL_PATH, 'APEX_030200', 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_030200', TRUE, 'connect'); DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('local-access-users.xml','localhost'); END; / COMMIT;
前述のスクリプトを実行した後に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_030200
ユーザーにACLを適用する必要があります。詳細は、「ホストへの接続権限の付与」を参照してください。
Oracle Application Expressオンライン・ヘルプを検索する機能がOracle TextおよびURLデータストアによって実現します。Oracle TextのURLデータストアをOracle Database 11gリリース2以上で使用する場合のデフォルトの動作と権限に変更があります。
Oracle Database 11gリリース2でOracle Application Expressオンライン・ヘルプを検索しようとすると次のエラーが表示される場合は、Oracle TextのURLデータストアを使用する権限がデータベース・ユーザーAPEX_030200
に付与されていません。
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine ORA-20000: Oracle Text error: DRG-10758: index owner does not have the privilege to use file or URL data store
Oracle Application Expressでオンライン・ヘルプの索引付けを有効にするには、Oracle TextのURLデータストアを使用するための権限がAPEX_030200
データベース・ユーザーに付与されている必要があります。それには、この権限をデータベース・ロールに割り当てた後、このロールをAPEX_030200
データベース・ユーザーに付与します。
Oracle Text URLデータストアを使用するための権限がデータベース・ロールにすでに付与されているかどうかを判断するには、次のステップを実行します。
SQL*Plusを起動し、Oracle Application Expressがインストールされているデータベースに、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
次のコマンドを実行します。
SELECT par_value FROM ctxsys.ctx_parameters WHERE par_name = 'FILE_ACCESS_ROLE';
これによって、NULL
か、またはOracle Text URLデータストアを使用するための権限が付与されているデータベース・ロールが戻されます。
ステップ2で何も値が戻されない場合は、次の例に示すように新しいデータベース・ロールを作成します。
CREATE ROLE APEX_URL_DATASTORE_ROLE;
次の文を使用して、このロールをデータベース・ユーザーAPEX_030200
に付与します。
GRANT APEX_URL_DATASTORE_ROLE to APEX_030200;
ステップ2で値が戻された場合は、例のAPEX_URL_DATASTORE_ROLE
のかわりに、このデータベース・ロール名を使用します。
最後に、ステップ2で値が戻されなかった場合は、Oracle Text APIを使用して、次の文で新しく作成したデータベース・ロールに権限を付与します。
EXEC ctxsys.ctx_adm.set_parameter('file_access_role', 'APEX_URL_DATASTORE_ROLE');