Oracle® Application Expressアプリケーション・ビルダー・ユーザーズ・ガイド リリース4.2 for Oracle Database 12c B71338-03 |
|
前 |
次 |
このセクションでは、Oracle Application Express管理者のためのセキュリティのベスト・プラクティスについて説明します。
内容は次のとおりです。
埋込み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ほどに柔軟な構成および詳細なログは提供されません。
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へのアクセスの制限に関する説明を参照してください。
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
ヒント: APEX_ADMINISTRATOR_ROLE は、別のデータベース・ロールを介してではなく、ユーザーに直接付与される必要があります。 |
次の文を実行します。
ALTER SESSION SET CURRENT_SCHEMA = APEX_040200;
次の文を実行します。
BEGIN APEX_INSTANCE_ADMIN.SET_PARAMETER('PASSWORD_HISTORY_DAYS',365); COMMIT; END; /
これによって、作成または更新するパスワードは、過去365日間にそのアカウント用として使用されていないものに制限されます。以前に使用されたパスワード(実際は、パスワードのハッシュ表現)は、Oracle Application Expressをインストールしたときから記録されます。
この機能を無効にするには、パラメータ値に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 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の作成と構成に関する項を参照してください。 |
次の例は、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;
前述のスクリプトの実行後に「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を適用する必要があります。「接続権限の付与」を参照してください。