6 RESTful Webサービスでのセキュリティ・アイデンティティの伝播
RESTful Webサービスでセキュリティ・アイデンティティを伝播できます。たとえば、ユーザーがブラウザ経由でWebポータルにアクセスし、資格証明の入力を求められた場合、Webポータルでユーザー・リクエストを完了するためにアクセスする必要があるバックエンド・サービスにこれらの資格証明が伝播される可能性があります。
この章の構成は、次のとおりです。
6.1 ユース・ケース: RESTful Webサービスによるセキュリティ・アイデンティティの伝播
ユース・ケースの説明、ソリューションのサマリー、関連するコンポーネントおよびリンクされたドキュメント・リソースを参照して、RESTful Webサービスでセキュリティ・アイデンティティを伝播できます。
- ユース・ケース
-
RESTful Webサービスでセキュリティ・アイデンティティを伝播します。たとえば、ユーザーがブラウザ経由でWebポータルにアクセスし、資格証明の入力を求められた場合、Webポータルでユーザー・リクエストを完了するためにアクセスする必要があるバックエンド・サービスにこれらの資格証明が伝播される可能性があります。
- 実装サマリー
-
RESTful Webサービスおよびクライアントを作成し、Oracle Web Services Manager (OWSM) SAMLポリシーを使用して保護します。
- コンポーネント
-
-
Oracle Fusion Middleware - Oracle Web Services Manager (OWSM)を含む
-
Oracle JDeveloper
-
- 必須ドキュメント
-
このユース・ケースを完了するには、次のドキュメント・リソースを参照してください。
-
Oracle JDeveloperによるアプリケーションの開発におけるRESTful Webサービスの開発および保護に関する項
このユース・ケースは、次の操作に必要なステップを示します。
-
JDeveloperを使用して簡単な
HelloWorld
RESTful Webサービスを作成します。 -
javax.ws.rs.core.SecurityContext
を使用して、出力メッセージに認証済ユーザーの名前を表示します。 -
WARファイルとしてRESTful WebサービスをWebLogic Serverにデプロイします。
-
HelloWorld
RESTful Webサービスをテストします。 -
JDeveloperを使用して、RESTful WebサービスのRESTfulクライアント・プロキシを作成および保護します。
-
SAMLセキュリティに必要なキーストアおよび証明書を設定します。
-
RESTfulクライアント・プロキシを検証します。
6.2 ユース・ケースの実装: RESTful Webサービスによるセキュリティ・アイデンティティの伝播
RESTful Webサービスでのセキュリティ・アイデンティティの伝播のユース・ケースを実装するには、RESTful WebサービスおよびRESTfulクライアントの作成、保護およびデプロイ、テスト・ユーザーの作成、キーストア・サービス(KSS)の設定の各タスクを順に実行する必要があります。
6.2.1 RESTful Webサービスによるセキュリティ・アイデンティティの伝播 - 前提条件
ユース・ケースを実装する前に、製品コンポーネントをダウンロードしてインストールし、WebLogicドメインを構成し、管理サーバーを起動し、Oracle Enterprise Manager Fusion Middleware ControlおよびOracle WebLogic Server管理コンソールへのアクセス権を取得します。
開始する前に、次のタスクが実行されていることを確認してください。
6.2.2 RESTful Webサービスの作成、保護およびデプロイ
RESTful Webサービスを作成、保護およびデプロイするには、RESTful Webサービスの作成、SecurityContextを使用したユーザーの認証、Webプロジェクトのサーブレット名の変更、RESTful Webサービスの保護とデプロイの各タスクを順に実行します。
6.2.2.1 RESTful Webサービスの作成
JDeveloperを使用した簡単なhelloworld RESTful Webサービスを作成するには:
注意:
JDeveloperを使用する場合のヘルプは、[F1]を押すか、「ヘルプ」をクリックします。
6.2.2.2 SecurityContextを使用したユーザーの認証
次の手順は、javax.ws.rs.core.SecurityContext
を使用した認証済ユーザーの取得方法を示しています。
詳細は、『Oracle WebLogic Server RESTful Webサービスの開発と保護』のSecurityContextを使用したRESTful Webサービスの保護に関する項を参照してください。
SecurityContext
を使用した認証済ユーザーを取得するには:
-
javax.ws.rs.core.Context
アノテーションを使用してインスタンスをクラス・フィールド、セッター・メソッドまたはメソッド・パラメータに注入することで、SecurityContext
にアクセスします。前のステップで作成した
hello()
メソッドを更新して、次のようにSecurityContext
を使用して取得した認証済ユーザー名を出力します。package examples.wsm.helloworld; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.Context; import java.security.Principal; @Path("helloworld") public class HelloWorldIdPropSample { public HelloWorldIdPropSample() { super(); } @GET @Produces("text/plain") @Path("user") public String hello(@Context SecurityContext sc) { String user = "No user"; if (sc != null) { Principal p = sc.getUserPrincipal(); if (p != null) { user = p.getName(); } } return "Hello " + user; } }
6.2.2.3 Webプロジェクトのサーブレット名の変更
「RESTful Webサービスの作成」の説明に従って「JavaクラスからのRESTfulサービスの作成」ウィザードを使用してRESTful Webサービスを作成した場合、JDeveloperにより、プロジェクトがWebプロジェクトに自動的に変更され、web.xml
ファイルが追加されました。デフォルトでは、Webプロジェクトのサーブレット名はjersey
です。
Web Content/WEB-INF
フォルダにあるweb.xml
ファイルを編集して、helloworldなどのわかりやすい名前を指定します。次に例を示します。
<?xml version = '1.0' encoding = 'windows-1252'?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<servlet>
<servlet-name>helloworld</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/resources/*</url-pattern>
</servlet-mapping>
</web-app>
6.2.2.4 RESTful Webサービスの保護
RESTful Webサービスを保護するために、いずれかのOWSM事前定義済セキュリティ・ポリシーをアタッチできます。OWSM事前定義済セキュリティ・ポリシーの詳細は、Oracle Web Services ManagerによるWebサービスの保護およびポリシーの管理のRESTful WebサービスおよびクライアントでサポートされているOWSMポリシーに関する項を参照してください。
「ポリシー」ウィザードを使用して次のポリシーをアタッチし、RESTful Webサービスを保護します: oracle/multi_token_rest_service_policy
web.xml
ファイルを右クリックして「RESTfulアプリケーションの保護」を選択し、「ポリシー」ウィザードを起動します。
セキュリティ・ポリシー構成がWeb Content/WEB-INF
フォルダの次に示すようなwsm-assembly.xml
デプロイメント・ディスクリプタ・ファイルに保存されます。wsm-assembly.xml
ファイルが存在しない場合は作成されます。
<orawsp:wsm-assembly xmlns:orawsp="http://schemas.oracle.com/ws/2006/01/policy"> <sca11:policySet xmlns:sca11="http://docs.oasis-open.org/ns/opencsa/sca/200912" name="policySet" appliesTo="REST-RESOURCE()" attachTo="SERVICE('helloworld')" orawsp:highId="1" xml:id="REST-RESOURCE__SERVICE__helloworld__"> <wsp:PolicyReference xmlns:wsp="http://www.w3.org/ns/ws-policy" DigestAlgorithm="http://www.w3.org/ns/ws-policy/Sha1Exc" URI="oracle/multi_token_rest_service_policy" orawsp:status="enabled" orawsp:id="1"/> </sca11:policySet> </orawsp:wsm-assembly>
完全な手順は、『Oracle JDeveloperによるアプリケーションの開発』のRESTfulサービスへのポリシーのアタッチに関する項を参照してください。
6.2.2.5 RESTful Webサービスのデプロイ
WARファイルとしてRESTful Webサービス・アプリケーションをWebLogic Serverにデプロイします。
RESTful Webサービスをデプロイするには:
-
Webアプリケーションのデプロイメント・プロファイルを作成します。
-
「デプロイメント・プロファイルの作成」ウィザードを使用して、プロファイルのタイプおよび名前を定義します。
serviceプロジェクトを右クリックして「デプロイ」→「新規デプロイメント・プロファイル」を選択して、「デプロイメント・プロファイルの作成」ウィザードを起動します。
次の特性を定義します。
- プロファイル・タイプ: WARファイル
- デプロイメント・プロファイル名: helloworld
-
「WARデプロイメント・プロファイルのプロパティの編集」ウィザードを使用して、Webアプリケーションのコンテキスト・ルートを定義します。
「デプロイメント・プロファイルの作成」ウィザードで「OK」をクリックすると、「WARデプロイメント・プロファイルのプロパティの編集」ウィザードが自動的に起動します。
次の特性を定義します。
- Java EE Webコンテキスト・ルートを指定: rest-saml-idprop
-
-
「<アプリケーション>のデプロイ」ウィザードを使用して、Webアプリケーションをデプロイします。
serviceアプリケーションを右クリックして「デプロイ」→「helloworld」を選択して、「<アプリケーション>のデプロイ」ウィザードを起動します。
次の特性を定義します。
-
デプロイメント・アクション: WARにデプロイ
-
-
構成されたプロジェクト・ディレクトリのWARファイルを表示します。次に例を示します。
c:\JDeveloper\mywork\rest-saml-idprop\service\deploy\helloworld.war
-
RESTful WebサービスをデプロイするWebLogic Serverを起動したことを確認してください。
Fusion Middleware Controlを起動し、WARファイルをデプロイします。
http://localhost:7001/em
-
Java EEアプリケーションのデプロイ・アシスタントを使用して、WARファイルをデプロイします。
Java EEアプリケーションのデプロイ・アシスタントにアクセスします。ナビゲーション・ペインの「WebLogicドメイン」→ domainname →「AdminServer」を選択し、コンテンツ・ペインの「Weblogicサーバー」→「デプロイメント」を選択して、「デプロイ」をクリックすることで、Java EEアプリケーションのデプロイ・アシスタントにアクセスします。
詳細は、『Oracle Fusion Middlewareの管理』のJava EEアプリケーションのデプロイに関する項を参照してください。
6.2.2.6 Fusion Middleware Controlを使用したRESTful Webサービスのテスト
Fusion Middleware Controlを使用して、RESTful Webサービス・アプリケーションをテストします。
RESTful Webサービスをテストするには:
-
Fusion Middleware Controlを起動します。
http://localhost:7001/em
-
RESTful Webサービス・アプリケーションのサマリー・ページを表示します。
-
ナビゲータ・ペインで、「アプリケーションのデプロイ」フォルダを開いてドメインのアプリケーションを開き、アプリケーションのデプロイを開き、helloworld (AdminServer)アプリケーション名を選択します。
-
コンテンツ・ペインで「アプリケーションのデプロイ」、「Webサービス」を順に選択します。
-
ページの「Webサービスの詳細」セクションで、「RESTfulサービス」タブをクリックし、アプリケーション名「helloworld」をクリックして「RESTfulサービス・アプリケーション」ページに移動します。
完全な手順は、『Webサービスの管理』のRESTfulサービス・アプリケーションの詳細の表示に関する項を参照してください。
-
-
「RESTfulサービスのテスト」をクリックします。
RESTful Webサービス・アプリケーションWADLファイルが自動的に解析されます。デフォルトでは、
GET(hello)
メソッドが選択されます(これがアプリケーションで使用可能な唯一のメソッドであるため)。 -
テスト・クライアントを構成します。
-
「リクエスト」タブで、「OWSMセキュリティ・ポリシー」を選択します。
-
「クライアント・ポリシー」リストのoracle/wss_http_token_client_policyを選択します。
-
構成プロパティのユーザー名とパスワード・フィールドにweblogicとpasswordを入力します。
-
-
「Webサービスのテスト」をクリックします。
次の情報が「レスポンス」タブで戻されます。
Hello weblogic
詳細は、『Webサービスの管理』のWebサービスのテストに関する説明を参照してください。
6.2.3 RESTfulクライアントの作成、保護およびデプロイ
セキュリティ・アイデンティティの伝播のユース・ケースを実装するには、RESTful Webサービスをデプロイした後で、RESTfulクライアントを作成、保護およびデプロイする必要があります。
6.2.3.2 HTTPサーブレットを変更したRESTfulクライアントの呼出し
次に太字で示されているように、HelloWorldServlet
HTTPサーブレットを変更して、RESTfulクライアントを呼び出します。
package examples.wsm.helloworld; ... import com.sun.jersey.api.client.Client; import examples.wsm.helloworld.HelloWorldRestClient.Helloworld; ... public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(CONTENT_TYPE); Client client = HelloWorldRestClient.createClient(); HelloWorldRestClient.Helloworld hello = HelloWorldRestClient.helloworld(client); String output = hello.user().getAsTextPlain(String.class); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>HelloWorldServlet</title></head>"); out.println("<body>"); out.println("<p>The servlet has received a GET. This is the reply.</p>"); out.println("<p>Output from RESTful service:" + output + "</p>"); out.println("</body></html>"); out.close(); } }
6.2.3.3 サーブレットWebアプリケーションの保護
次に示すようにWeb Content/WEB-INF
フォルダにあるrest-clientプロジェクトのweb.xml
ファイルを編集して、サーブレットWebアプリケーションを保護します。
web.xml
は、次のように更新されます。
<?xml version = '1.0' encoding = 'windows-1252'?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <servlet> <servlet-name>HelloWorldServlet</servlet-name> <servlet-class>examples.wsm.helloworld.HelloWorldServlet</servlet-class> </servlet> <security-constraint> <web-resource-collection> <web-resource-name>Success</web-resource-name> <url-pattern>/hellorestclient</url-pattern> </web-resource-collection> <auth-constraint> <role-name>webuser</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> </login-config> <security-role> <role-name>webuser</role-name> </security-role> </web-app>
6.2.3.4 weblogic.xmlデプロイメント・ディスクリプタの作成
weblogic.xml
デプロイメント・ディスクリプタを作成するには:
weblogic.xml
ファイルが次のように作成されます。
<?xml version = '1.0' encoding = 'windows-1252'?> <weblogic-web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.5/weblogic-web-app.xsd" xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"> <security-role-assignment> <role-name>webuser</role-name> <principal-name>weblogic</principal-name> </security-role-assignment> </weblogic-web-app>
6.2.3.5 RESTfulクライアントのデプロイ
WARファイルとしてRESTfulクライアント・アプリケーションをWebLogic Serverにデプロイします。
クライアントをデプロイするには:
-
Webアプリケーションのデプロイメント・プロファイルを作成します。
-
「デプロイメント・プロファイルの作成」ウィザードを使用して、プロファイルのタイプおよび名前を定義します。
rest-clientプロジェクトを右クリックし、「デプロイ」→「新規デプロイメント・プロファイル」を選択して、「デプロイメント・プロファイルの作成」ウィザードを起動します。
次の特性を定義します。
- プロファイル・タイプ: WARファイル
- デプロイメント・プロファイル名: helloworld-restclient
-
「WARデプロイメント・プロファイルのプロパティの編集」ウィザードを使用して、Webアプリケーションのコンテキスト・ルートを定義します。
「デプロイメント・プロファイルの作成」ウィザードで「OK」をクリックすると、「WARデプロイメント・プロファイルのプロパティの編集」ウィザードが自動的に起動します。
次の特性を定義します。
- 一般: Java EE Webコンテキスト・ルートを指定: rest-saml-idprop-client
-
-
「<アプリケーション>のデプロイ」ウィザードを使用して、Webアプリケーションをデプロイします。
rest-clientアプリケーションを右クリックして、「デプロイ」→helloworld-restclientを選択して、「<アプリケーション>のデプロイ」ウィザードを起動します。
次の特性を定義します。
-
デプロイメント・アクション: WARにデプロイ
-
-
構成されたプロジェクト・ディレクトリのWARファイルを表示します。次に例を示します。
c:\JDeveloper\mywork\rest-saml-idprop\rest-client\deploy\helloworld-restclient.war
-
Fusion Middleware Controlを起動し、WARファイルをデプロイします。
http://localhost:7001/em
詳細は、『Oracle Fusion Middlewareの管理』のJava EEアプリケーションのデプロイに関する項を参照してください。
6.2.3.6 RESTfulクライアントへのアクセスのテスト
次のステップ「キーストア・サービス(KSS)の設定」の説明に従ってキーストア・サービス(KSS)が構成されるまで、RESTful Webサービス・クライアントへのアクセスが失敗します。
ブラウザでRESTful Webサービス・クライアントにアクセスするには、ブラウザで次のURLを入力して、RESTful Webサービスをテストします。
http://<host>:<port>/rest-saml-idprop-client/hellorestclient
プロンプトが表示されたら、WebLogic Serverのユーザー名とパスワードを入力します。たとえば、weblogicとpasswordです。
次のエラーが戻されるので注意してください: Error 500--Internal Server Error.
6.2.4 キーストア・サービス(KSS)の設定
OWSMは公開キー暗号化を使用してSAMLベアラー・トークンに署名するため、キーストアの設定が必要です。
キーとキーストアにより、メッセージ保護を構成するための基本が提供されます。
6.2.4.1 KSSを使用する理由
KSSは、Oracle Platform Security Services (OPSS)によって提供されるサービスです。
KSSには、JKSを介した次の利点があります:
-
統合されたツール
- Fusion Middleware ControlまたはWLSTを使用して、KSSキーおよび証明書のCRUD操作を実行します。
- CA署名キーと証明書を生成する内部CA。
-
向上したライフサイクル管理
- 複数のドメインで同じキーストアを共有する機能は、記憶域を一元化して簡略化されます(たとえば、データベース記憶域など)。
- キーストアを分離する機能(たとえば、OWSMでは「ストライプ」の概念から独自のキーストアを持つことができます。)
- パスワードがキーストアの秘密キーにアクセスするために必要ない場合の簡略化された管理。
6.2.4.2 キーストア・サービスの設定
KSSキーストアを設定するには:
-
Fusion Middleware Controlを起動します。
http://localhost:7001/em
-
「キーストア」ページからキーストアを作成します。
「キーストア」ページに移動するには、「WebLogicドメイン」→「セキュリティ」→「キーストア」を選択します。
-
「ストライプの作成」をクリックして、次の特性を定義します。
- ストライプ名: owsm
-
リストでowsmを選択して、「キーストアの作成」をクリックして、次の特性を定義します。
- キーストア名: keystore
- 保護: ポリシー
- 権限の付与: 無効
完全な手順は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』のメッセージ保護のOPSSキーストア・サービスの使用に関する項を参照してください。
-
-
「キー・ペアの生成」ダイアログを使用して、キー・ペアを生成します。
「キー・ペアの生成」ダイアログに移動するには、「キーストア」ページのowsm→keystoreを選択し、「管理」、「キー・ペアの生成」の順にクリックします。
次の特性を定義します。
-
別名: orakey
-
共通名: orakey
-
組織単位: us
-
国: アメリカ合衆国
-
RSAキー・サイズ: 1024
完全な手順は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』のメッセージ保護のOPSSキーストア・サービスの使用に関する項を参照してください。
-
-
democa
CA証明書をowsm
ストライプにインポートします。デフォルトでは、キー・ペアはKSSに同梱されている
democa
CAによって署名されます。使用している証明書を表示するには、「キーストア」ページのowsm→keystoreを選択して、「管理」、orakey別名の順にクリックして、「別名: orakeyの証明書の詳細 」ダイアログを表示します。
OWSMエージェントが署名の証明書の証明書パスを検証できないため、CAを
owsm
キーストアにインポートするまで、サーバー側の証明書の検証に失敗します。system
ストライプ内のcastore
キーストアからdemoca
CA証明書をエクスポートし、owsm
ストライプ内のorakey
キーストアにインポートします。-
democa
CA証明書をエクスポートするには、「キーストア」ページの「system」→castoreを選択し、「管理」をクリックし、democa別名を選択し、「エクスポート」をクリックします。「証明書」ダイアログで、「証明書のエクスポート」をクリックしてローカル・ファイルに保存します(またはコンテンツを任意のファイルにコピーして貼り付けます)。
完全な手順は、『Oracle Platform Security Servicesによるアプリケーションの保護』のFusion Middleware Controlを使用した証明書または信頼できる証明書のエクスポートに関する項を参照してください。
-
democa
CA証明書をインポートするには、「キーストア」ページのowsm→keystoreを選択し、「管理」、「インポート」の順にクリックします。次の特性を定義します。
- 証明書タイプ: 信頼できる証明書
- 別名: democa
- 証明書または証明連鎖を含むファイルの選択: 有効
「ファイルの選択」をクリックし、エクスポートされた証明書ファイルに移動し、「開く」をクリックし、「OK」をクリックして証明書をインポートします。
完全な手順は、『Oracle Platform Security Servicesによるアプリケーションの保護』のFusion Middleware Controlを使用した証明書または信頼できる証明書のインポートに関する項を参照してください。
-
6.3 ユース・ケースの検証: RESTful Webサービスによるセキュリティ・アイデンティティの伝播
ブラウザから、RESTful Webサービスでのセキュリティ・アイデンティティの伝播のユース・ケースを検証できます。Fusion Middleware ControlのWeb Servicesテスト・クライアントまたは「Webサービスのテスト」ページを使用して、Webサービスの基本機能および拡張機能をテストできます。
ブラウザでRESTful Webサービス・クライアントにアクセスするには、ブラウザで次のURLを入力して、RESTful Webサービスをテストします。
http://<host>:<port>/rest-saml-idprop-client/hellorestclient
プロンプトが表示されたら、WebLogic Serverのユーザー名とパスワードを入力します。たとえば、weblogicとpasswordまたはtestuserとpasswordです。
次のメッセージがブラウザで戻されます。
The servlet has received a GET. This is the reply. Output from RESTful service: Hello testuser
Fusion Middleware ControlのWeb Servicesテスト・クライアントまたは「Webサービスのテスト」ページを使用して、Webサービスの基本機能および拡張機能をテストできます。詳細は、『Webサービスの管理』のWebサービスのテストに関する説明を参照してください。