文書番号 166869.12 最終更新日 2004-07-23 公開区分 一般公開 文書タイプ PROBLEM
製品名(バージョン)[コンポーネント] GENERIC ( - ) []
プラットフォーム(バージョン) すべてのプラットフォーム ( - )
関連文書 166869.1  
概要 (和訳)Oracle9iASリリース1.0.2.2 SOAPのデフォルト設定におけるセキュリティ上の問題点
内容:
Article-ID:         <Note:166869.1>

 Circulation:        PUBLISHED (EXTERNAL)
 Folder:             internet.Applicationserver.Installer
 Topic:              Alerts
 Title:              Security Implications of the Oracle9iAS v.1.0.2.2 Default 
                     SOAP Configuration
 Document-Type:      ALERT
 Impact:             MEDIUM
 Skill-Level:        NOVICE
 Updated-Date:       02-DEC-2001 23:48:38
 References:         
 Shared-Refs:        
 Authors:            INFOSEC.US
 Attachments:        NONE
 Content-Type:       TEXT/PLAIN
 Keywords:           ALERTINFO; 
 Products:           1032/INSTALL (1.0.2.2); 
 Platforms:          GENERIC;  

Oracle9iASリリース1.0.2.2 SOAPのデフォルト設定におけるセキュリティ上の問題点
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 



影響のあるリリース
~~~~~~~~~~~~~~~~~~ 
  このリリースノートは、Oracle9i Application Serverリリース1.0.2.2 
  (Oracle9iASリリース1.0.2.2) のデフォルトのSOAP設定におけるセキュリティ
  の問題点について説明します。

  SOAPは、Oracle9iASリリース1.0.2.2インストレーションにより、標準でイン
  ストールされ利用可能となります。
 
影響のあるプラットフォーム 
~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  Windows NTを含むすべてのプラットフォーム。
 
問題 
~~~~ 
  Oracle9iASリリース1.0.2.2 では、SOAPサンプルが直ぐに使用できるように、
  デフォルト('標準'インストール)の設定では、SOAPが利用可能となっています。
  このデフォルト・インストレーションでは、SOAPサービスのデプロイ/アンデプ
  ロイが機能が制限されていないために、特に、インターネットを介してOracle9iAS
  リリース1.0.2.2 HTTPサーバーにアクセスする場合などに、セキュリティの問題が
  生じる可能性があります。このリリースノートでは、起こりうるセキュリティ問題
  の特徴を詳しくご説明し、Oracle9iASリリース1.0.2.2のデフォルトSOAPインスト
  レーションを、不正に利用した侵入に対処するための方法をご説明致します。

  次の事項を強くお薦めします。
  (実際の手順につきましては、後述の「回避策」をご参照ください)
 
     1. SOAPを利用していなければ SOAP を無効にする。あるいは、
     2. デプロイ/アンデプロイ機能を無効にする。あるいは、
     3. 以下の方法を用いて、SOAPのデプロイ/アンデプロイ機能へのアクセスを、
        管理者またはテスト担当者に制限する。

  Oracle9iAS リリース1.0.2.2のSOAPデフォルト設定では、urn:soap-service-manager
  と呼ばれるオートデプロイサービスにアクセスすることによって、SOAPサービスを
  デプロイ/アンデプロイすることが可能です。さらに、Oracle SOAP設定には、SOAP
  サービスとしてJavaクラスをデプロイできるビルトインJavaプロバイダが用意され
  ています。デフォルトSOAP設定では、誰もがすでにサーブレットで利用できる
  デフォルトの SOAP URL /soap/servlet/soaprouter にアクセスして、Javaクラスを
  SOAPサービスとしてデプロイすることが可能になります。こうした動作を望まない
  場合は、urn:soap-service-managerへのアクセスを制限するか、または無効にする
  よう、SOAP設定を変更することが不可欠です。デフォルトSOAP URLがファイアウォー
  ルの外部から利用できる場合、このことはさらに重要です。ファイルシステムへの
  書込み権限がなければ、カスタムJavaクラスとして実装されるSOAPサービスの追加は
  できないことにご注意ください。


デフォルトSOAP設定
~~~~~~~~~~~~~~~~~~
  Oracle9iASリリース1.0.2.2のSOAP設定は、インストレーション・プロセスの
  一部として、JServで実行するサーブレットとしてインストールされます。
  デフォルト・インストールでは、2つのSOAPサービスが有効になります。

    1. urn:soap-service-manager
    2. urn:soap-provider-manager

  これら2つのサービスにより、SOAPサービスおよびSOAPプロバイダをそれぞれデプロイ
  /アンデプロイをすることができます。Oracle9iASリリース1.0.2.2のSOAP設定は、
  Apache SOAPに基づいており、付属の Javaプロバイダがデフォルトで動作しています。
  このプロバイダによって、SOAPサービスとして任意のJavaクラスをデプロイすることが
  可能となってしまっています。

  なお、SOAPサービスとしてJava クラスを実行させるには、以下の条件が必要です。

    1. サービスとして使用されるJavaクラスは、soapサーブレットから利用
       可能でなければならない(JServクラスパスまたはサーブレット・ゾーン・
       リポジトリの一部でなければならない)。
    2. サービスとして使用されるJavaクラスは、パブリックな引数なしコンストラクタ
       を持たなければならない。
    3. リモート・クライアントによって使用できるサービス・クラス内の
       メソッドは、デシリアライズ化可能なすべの引数およびシリアライズ化可能な
       戻り値を持たなければならない。Oracle9iASリリース1.0.2.2のSOAP設定には、
       次に挙げるJava型向けのシリアライザー/デシリアライザーが含まれている。
       : Javaビルトイン型/ラッパークラス、JavaBeans、Hashtable、Vector、
         org.w3c.dom.Element、base64バイナリ、Parameter、QName、
         配列(サポートされる型の)。
       他の型については、シリアライザー/デシリアライザーがカスタムに
       記述およびデプロイされなければならない。

  urn:soap-service-managerを実行する際に、セキュリティの問題が発生します。
  サービスurn:soap-service-manager に対応する URLにアクセスするクライアントは、
  他のSOAPサービスを任意にデプロイ/アンデプロイすることができます。
  また、サービスurn:soap-provider-manager に対応する URLにアクセスしている
  クライアントは、任意にSOAPプロバイダをデプロイ/アンデプロイできます。このため、
  これらのサービスを「適切に」保護することが不可欠です。この「適切な」保護の
  レベルは、環境およびセキュリティ要件によって異なります。SOAPサービスと
  SOAPサーブレット間のn対1マッピングなど、同じサービスが複数のサービスに
  対応できることに注意してください。これは、Apacheアクセス・コントロールが、
  すべて許可かすべて不許可かの保護を提供することを意味します。
  (サービスはXMLペイロードで識別され、Apacheはこれを理解しないためです)

  デフォルトの設定で実行可能なサンプルである、'アドレス帳'(urn:AddressFetcher)
  サービスを持つSOAPサーブレットを考えます。デフォルトのSOAP URLは、
  /soap/servlet/soaprouter です。すなわち、クライアントは、urn:AddressFetcherへ
  のアクセスおよび urn:soap-service-manager へのアクセスを行なうために、相対URI
  /soap/servlet/soaprouter を使用します。これは、クライアントが urn:AddressFetcher
  に アクセスできる場合には、urn:soap-service-managerにもアクセスできることを意味
  しています。

  開発およびテストの状況以外では、このように、アクセスを「すべて許可」「すべて
  不許可」に設定するのは適切ではありません。Oracle9iASリリース1.0.2.2のSOAP 設定
  には、サービスごとに1つのサーブレットを実行したり、あるいは、SOAPサーブレットへの
  フロントエンドを持つなどといった個々の設定に加え、urn:soap-service-manager
  およびurn:soap-provider-managerサービスを保護するための機能が用意されています。
  以下は、アクセス制限を加えるための設定例です。

   1. Oracle9iASリリース1.0.2.2のSOAPでは、urn:soap-service-managerおよび
      urn:soap-provider-managerのアクセスに必要なURLを指定することができます。
      指定されたURLが使用されなかった場合、サーブレットは要求を拒否します。
      Apacheを使用して、同じサーブレットを指し示す2種類(以上)のURLを
      設定することができます。これらの 2 つの URL を'A'および'B'とします。
      'A'は、あるレベルの保護を設定しておき、サービスマネージャー用に使用される
      SOAP 設定の中でこれを指定します。一方 'B'は別のレベルの保護を設定しておき
      ます。これは、クライアントが'A'にアクセスできる場合、サービスをデプロイ/
      アンデプロイすることができ、他のサービスにもアクセスできることを意味します。
      'B'にアクセスでき'A'にアクセスできないクライアントは、サービスをデプロイ/
      アンデプロイすることはできませんが、他のサービスにはアクセスすることがで
      きます。以下は設定の例です。

      urn:soap-service-managerに必要なURIをserviceManager要素
     (ファイル$ORACLE_HOME/soap/webapps/soap/WEB-INF/config/soapConfig.xmlの中)の
      下部に次の要素を追記してください。

           <osc:option name="requiredRequestURI" value="アクセスを許可するURI" />           

      urn:soap-provider-managerに必要なURIをproviderManager要素の下部に
      次の要素を追記してください。

           <osc:option name="requiredRequestURI" value="アクセスを許可するURI" />                      

      たとえば、URL /soap/servlet/soaprouterを使用して、カスタムsoapサービス
      (urn:AddressFetcherなど)にアクセスすることができるとします。Apacheおよび
      JServディレクティブを使用して、同じサーブレット(soaprouter)
      を実行することができる様に URL /soap/admin/servicemanager
      および /soap/admin/providermanager として設定することができます。
      標準のApacheおよびJServの認証/制限機能を使用して、これら3つのパス
      /soap/servlet/soaprouter、/soap/admin/servicemanagerおよび
      /soap/admin/providermanagerを保護することができます。
     (/soap/admin/servicemanager および /soap/admin/providermanager に対する
      アクセスを単一のローカルホストのみに認める、あるいは、クライアント認証に
      SSLを要求するなどの方法があります)。

   2. 前述のように Oracle9iASリリース1.0.2.2のデフォルトのSOAP設定では、
      オートデプロイが有効となっています。必要なサービスのデプロイが既に
      終了しており、新しいサービスのデプロイや既存のサービスのアンデプロイを
      必要としない場合には、オートデプロイの機能を無効にしてください。

      SOAP設定ファイル($ORACLE_HOME/soap/werbapps/soap/WEB-INF/config
      /soapConfig.xml)において、serviceManager要素の下部に次の行を追加します。

           <osc:option name="autoDeploy" value="false" /> 
      
      上記の設定は、urn:soap-service-managerおよびurn:soap-provider-manager
      サービスを無効にします。デフォルトの設定では、autoDeploy属性がtrueに
      設定されています。これは、サービスがデプロイ/アンデプロイ可能であることを
      意味します。すなわち、デフォルトの設定では /soap/servlet/soaprouterに
      アクセス可能なクライアントは、任意にサービスをデプロイ/アンデプロイ
      することが可能となります。このようなクライアントは、JServクラスパス
     (たとえば、パッケージjava.lang.*、java.util.* などのクラス)および
      サーブレットゾーンリポジトリから利用可能な(引数なしコンストラクタを持つ)
      クラスを実行することが可能となります。こうした実行クラスのメソッドを
      呼び出すには、上記でご説明した通り、適切なシリアライザー/デシリアライ
      ザーが設定されていることが条件となります。


回避策 
~~~~~~
以下の何れかの方法をご検討ください。

($ORACLE_HOME は Oracle9iAS をインストールしたディレクトリを示します。また、
設定ファイル内のポート番号などは設定例であり、実際に設定されているものとは
異なりますのでご注意ください)


1. SOAPを使用しない場合には、Jservの設定ファイルファイルを編集し、以下の4行を
   コメントアウトすることによって SOAP 自体を無効にします。
   Jservの設定ファイルはhttpd.confで位置が指定されており、デフォルトでは
   UNIX版、Windows版でそれぞれ以下の位置に存在しています。

    -UNIX版     $ORACLE_HOME/Apache/Jserv/etc/jserv.conf

    ApJServGroup group2 1 1 $ORACLE_HOME/Apache/Jserv/etc/jservSoap.properties
    ApJServMount /soap/servlet ajpv12://localhost:8200/soap
    ApJServMount /dms2 ajpv12://localhost:8200/soap
    ApJServGroupMount /soap/servlet balance://group2/soap

    -Windows版  %ORACLE_HOME%\Apache\Jserv\conf\jserv.conf

    ApJServGroup group2 1 1 $ORACLE_HOME/Apache/Jserv/conf/jservSoap.properties
    ApJServMount /soap/servlet ajpv12://localhost:8200/soap
    ApJServMount /dms2 ajpv12://localhost:8200/soap
    ApJServGroupMount /soap/servlet balance://group2/soap




2. すでにSOAPを使用しており、必要なサービスがデプロイされており、追加や変更の
   デプロイ/アンデプロイが発生しない場合には、 以下の例の様な設定によってデプロイ/
   アンデプロイを無効にします。

   SOAP設定ファイル($ORACLE_HOME/soap/werbapps/soap/WEB-INF/config/soapConfig.xml)
   で、serviceManager要素の下に次の設定を行います。(

   例)
    <osc:serviceManager
        class="oracle.soap.server.impl.FileServiceManager">

        <!-- Please include the appropriate absolute path with the filename -->
        <osc:option name="filename"
                    value="$ORACLE_HOME/soap/webapps/soap/WEB-INF/services.dd" />
         <!-- auto-deploy providerManager and serviceManager as services -->
        <!-- <osc:option name="autoDeploy" value="true" /> -->

        <osc:option name="autoDeploy" value="false" />      <== ●設定
    </osc:serviceManager>


3. SOAPサービスをデプロイ/アンデプロイする為のURLを追加しアクセス制限を
   設定することによって、一般のユーザから実行ができないように設定する事が
   できます。設定の手順は次の通りです。

   3-1  Jservの設定ファイルを以下の例の様に編集しアクセスできるパスを追加します。

    Jservの設定ファイルはhttpd.confで位置が指定されており、デフォルトでは
    以下の位置に存在しています。
    UNIX版     $ORACLE_HOME/Apache/Jserv/etc/jserv.conf
    Windows版  %ORACLE_HOME%\Apache\Jserv\conf\jserv.conf

   例)
     # SOAP Entries
     ApJServGroup group2 1 1 $ORACLE_HOME/Apache/Jserv/etc/jservSoap.properties
     ApJServMount /soap/servlet ajpv12://localhost:8200/soap
     ApJServMount /dms2 ajpv12://localhost:8200/soap
     ApJServGroupMount /soap/servlet balance://group2/soap
     ApJServGroupMount /soap/admin balance://group2/soap      <== ●追加

   3-2  追加したパスに対するアクセス制限を以下の例の様に設定をします。
        この例では jserv.conf にて localhost からしかアクセスが
        できないようにしています。

   例)
     <Location /soap/admin/ >

       order deny,allow
       deny from all
       allow from localhost
     </Location>


   3-3  SOAP設定ファイル($ORACLE_HOME/soap/werbapps/soap/WEB-INF/config
        /soapConfig.xml)において、以下の例の様に serviceManager要素と
        providerManager要素の下部に次を設定し、デプロイ/アンデプロイを
        実行する URLを上記で設定した URLに設定をしてこのパスでしか
        実行ができないように制限します。

   例)
    <osc:providerManager
        class="oracle.soap.server.impl.FileProviderManager">
        <!-- filename is the absolute path to the filename -->
        <osc:option name="filename"

                    value="$ORACLE_HOME/soap/webapps/soap/WEB-INF/providers.dd" />
        <osc:option name="requiredRequestURI" value="/soap/admin/soaprouter" />  <== ●追加
    </osc:providerManager>

    <osc:serviceManager
        class="oracle.soap.server.impl.FileServiceManager">
        <!-- Please include the appropriate absolute path with the filename -->
        <osc:option name="filename"
                    value="$ORACLE_HOME/soap/webapps/soap/WEB-INF/services.dd" />

         <!-- auto-deploy providerManager and serviceManager as services -->
        <!-- <osc:option name="autoDeploy" value="true" /> -->
        <osc:option name="autoDeploy" value="true" />

        <osc:option name="requiredRequestURI" value="/soap/admin/soaprouter" />  <== ●追加
    </osc:serviceManager>

【追加情報】
デフォルトの httpd.conf の設定では以下のような設定がされています。

Alias /soapdocs/ "${ORACLE_HOME}/soap/"

悪意のあるユーザに意図しない情報を取得されるのを防ぐために、この設定を
削除するかもしくは以下のように変更して下さい。

[変更後]
Alias /soapdocs/ "${ORACLE_HOME}/soap/docs/"


【参考情報】
http://otn.oracle.co.jp/document/products/app_server/9ias/9ias_1022.html
Oracle9i Application Server Oracle9iAS SOAP 開発者ガイド リリース1.0.2.2

【更新情報】
2004/07/23 文書管理情報を更新
2004/02/17 jservSoap.properties のWindows版の位置を追記
2004/02/16 Jserv.confのWindows版の位置を追記
2004/01/29 【追加情報】を追加