ヒント: ファイアウォールの後ろでSOAPのためにプロキシ・ネットワーク・ライブラリを使う

SOCKSプロトコルでWebサービス・トラフィックに対処する

もしもファイアウォールの後ろ(イントラネット)側からSOAPサービスにアクセスしようとしているのにもかかわらずSOAPライブラリがプロキシ経由のネットワーク接続をサポートしていなければ、直接のリクエストが目的に到達できないかも知れません。このような場合、ソケットのリダイレクション・プログラムを使えばプロキシ・サーバを介した接続が確立できます。この記事でUche Ogbujiが、そのヒントを紹介します。

Uche Ogbuji, Principal Consultant, Fourthought, Inc.

Photo of Uche OgbujiUche Ogbuji は、次世代の Web 技術を専門とするサービスの会社である、Uli, LLC の代表者です。Ogbuji 氏は XML、RDF、およびナレッジ管理アプリケーション用のオープン・ソース・プラットフォームである 4Suite の開発リーダーであり、Versa RDF 照会言語の開発リーダーでもあります。ナイジェリア出身のコンピューター・エンジニア兼ライターで、米国コロラド州ボールダー在住です。彼に関して詳しくは、彼のブログである Copia を見てください。



2004年 3月 26日

セキュリティが企業にとって避けることのできない課題である今、(特に職場では)大半のコンピュータ・ユーザが何らかのファイアウォールを使っています。多くの重要な(Webブラウザなどに代表される)ユーザ・エージェントは、直接的な接続を確立することなしに、あるコンピュータのトラフィックを別のコンピュータに届けるような特別なサーバをサポートしています。そのために、Webの閲覧や電子メールのような一般的なインターネット・アクセスの必要性を阻むことはありません。このようなサーバは、プロキシ・サーバと呼ばれ、インターネットのプロキシ・サーバの最も一般的なプロトコルは、SOCKSとして知られています。SOCKSプロキシは、ファイアウォールの後ろ側から(限定的で統制されていますが・・・)インターネット・サーバに接続するときに、よく使われます。プロキシ・サーバは、特定のWebサイトへのアクセスを禁止したり、接続の前にユーザ認証を要求したり、などのポリシーを強制します。たいていのSOCKS実装は、最新の標準であるSOCKS Version 5をサポートしています。

SOAPとファイアウォール

ファイアウォールを介してSOAPを使用するのであれば、SOCKSプロキシを使う必要があるでしょう。これは、プログラムがSOCKSプロトコルを理解できることを確認する必要があることを意味します。SOCKSプロキシと共に機能するようにプログラムを設定する行為を、「プログラムをSOCKS化する」と呼んでいます。様々な方法でWebサービスの設定をSOCKS化できます。

  • コンピュータのネットワーク設備全体をSOCKSサーバにチャネルできるようにします。一部の利用可能なプログラム(著者が認識できる限りでは市販品のみですが・・・)は、この目的のために全てのネットワーク通信を透過的にコントロールすることができます。
  • SOCKSサーバを介して、選択されたネットワーク・トラフィックをリダイレクトすることができる特別なプログラムを使用します。この例は、後で紹介します。
  • SOCKSプロキシを介してホスティングされたアプリケーションのネットワーク接続をリダイレクトすることができるランタイム環境を使用します。例えば、たいていのJavaランタイムの最近のバージョンでは、socksProxyHostsocksProxyPort のようなプロパティを使用してプロキシを指定することを可能にします。これは、それ以降ソケットを使用する全てのオブジェクトに対しプロキシを使用します。
  • SOCKSプロキシをサポートするWebサービス・ツールキット(例:IBM Emerging Technologies Toolkit)を使用します。

簡単な例

例として、ファイアウォールの後ろ側から、SOAPpy Webサービス・ツールキット(version 0.11.3)を使用してみましょう。SOAPpyはPython用の使い勝手の良いツールキットで、過去の developerWorksで紹介しています( 参考文献参照)。しかしながら、それは組み込みでSOCKSをサポートしてはおりませんので、これはそれほど単純とは言えない場合の良い例になるでしょう。

SOAPpy に例として付属するweatherTest.pyスクリプトを、ファイアウォールの後ろ側から試してみます。重要な行は以下の部分です。

SoapEndpointURL = 'http://services.xmethods.net:80/soap/servlet/rpcrouter'

これは、SOAPのエンド・ポイントとして、サーバ(services.xmethods.net)のポート80を呼び出すようにクライアントを設定します。このスクリプトを実行した場合、最初の結果は次のようなエラーとなるでしょう。

socket.gaierror: (-2, 'Name or service not known')

このエラーは、ファイアウォールを使用するときに最初に直面する一般的な問題を表しています。多くのシステムでは、ネーム・サーバはファイアウォール内でアドレスを解決するのみです。実際には、最終的な接続を確立するためだけでなく、外部ドメイン名を解決するためにプロキシ・サーバを使用しなくてはなりません。SOCKS化されたクライアントのメソッドの多くは、このようなプロキシを介したDNSクエリのリダイレクションをサポートしますが、(単純化のために)ここでは単にSOAPのエンド・ポイントとして実際のIPアドレスを使用するように変更し、通常のDNSルックアップを回避します。修正された行は以下のとおりです。

SoapEndpointURL = 'http://66.28.98.121:80/soap/servlet/rpcrouter'

結果として生じるエラーは、以下のようなものです。

socket.error: (111, 'Connection refused')

これは多くを物語るエラーです・・・。ファイアウォールは、66.28.98.121(ポート80)にあるサーバへの直接接続の試みを阻止します。SOCKSプロキシを通して要求を発送しなくてはなりません。そうするために、ソケットをリダイレクトするユーティリティとしてよく知られている connect.c (参考文献参照)をダウンロードします。ダウンロード後に、以下のようにビルドします(これはLinux上での例です)。

gcc connect.c -o proxyconnect

ビルドされたproxyconnectコマンドは、ローカル・ポートをリスニングし、そしてプロキシを通してリモート・サーバにそれ(リクエスト)を転送することにより、ポートをリダイレクトすることができます。ここではローカル・ポート8888をリスンし、66.28.98.121のポート80にリダイレクトするようにしたいと思います。私の環境では、SOCKSサーバのアドレスが192.168.1.254で、ポート1080でSOCKS接続を受け入れます。この設定における適切なproxyconnectコマンドは、以下の通りです。

proxyconnect -p 8888 -S 192.168.1.254:1080 66.28.98.121 80

これを別のセッションまたはバックグラウンドで実行すれば、それ(リクエスト)をローカルでリダイレクトされたソケットに向けることにより、SOAPのエンド・ポイントに転送することができます。つまり、先ほどのコードでの重要な行は、以下のようになります。

SoapEndpointURL = 'http://localhost:8888/soap/servlet/rpcrouter'

これでSOAP呼び出しが見事に動作します。


まとめ

今回の例は、少し要領が悪いかも知れません・・・。まず一つには、使いたいそれぞれのリモートのエンド・ポイントのためにリダイレクトされたソケットを設定する必要があります。ここでは、最悪の事態を想定した状況を例として扱いたいと思ってこうしています。多くの場合、WebサービスをSOCKS化するうえでの選択肢は、もっと単純かも知れません。SOAPに対する野心に水を注すものの一つとして、(最近の製品に見受けられるように)SOAPを拒絶するポリシーをSOCKSプロキシが設定している可能性があげられます。仮にそうであれば、許可されたWebサービスへのアクセスのために特別なプロキシを設定するように、IT部門と協力する以外に道はありません。いつものことですが、利便性とセキュリティのバランスを保つのは難しいのです。

参考文献

  • プロトコルで手を汚したいですか?RFC 1928: SOCKS Protocol Version 5 を良く調べてください。
  • WebサービスとGridコンピューティング機能を提供するIBM Emerging Technologies Toolkit をダウンロードしてください。
  • developerWorksのWebサービスXML ゾーンで、これら2つの人気の高い技術に関する幅広い記事、コラム、チュートリアル、そしてヒントを見いだしてください。
  • developerWorksのDeveloper Bookstore にはXML関連の技術書籍が豊富に取り揃えられていますので、ご覧下さい。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, SOA and web services
ArticleID=242158
ArticleTitle=ヒント: ファイアウォールの後ろでSOAPのためにプロキシ・ネットワーク・ライブラリを使う
publish-date=03262004