5.4. ワークフローの例: 既存の Maven バイナリーからの OpenShift アプリケーションの作成および Red Hat Single Sign-On を使用したセキュリティー保護
OpenShift に既存のアプリケーションをデプロイするには、バイナリーソース の機能を使用できます。
5.4.1. EAP 6.4 / 7.1 JSPサービス呼び出しアプリケーションのバイナリビルドをデプロイし、Red Hat Single Sign-On を使用して保護
以下の例は、app-jee-jsp および service-jee-jaxrs クイックスタートの両方を使用して、Red Hat Single Sign-On を使用して認証する EAP 6.4 / 7.1 JSP サービスアプリケーションをデプロイします。
前提条件:
本書では、Red Hat Single Sign-On for OpenShift イメージが、以下のテンプレートのいずれかを使用してデプロイされている ことを前提としています。
- sso74-postgresql
- sso74-postgresql-persistent
- sso74-x509-postgresql-persistent
5.4.1.1. EAP 6.4 / 7.1 JSP アプリケーションの Red Hat Single Sign-On レルム、ロール、およびユーザーの作成
EAP 6.4 / 7.1 JSP サービスアプリケーションには、Red Hat Single Sign-On を使用して認証できるように専用の Red Hat Single Sign-On レルム、ユーザー名、およびパスワードが必要です。Red Hat Single Sign-On for OpenShift イメージをデプロイした後に、以下の手順を実行します。
Red Hat Single Sign-On レルムの作成
Red Hat Single Sign-On サーバーの管理コンソールにログインします。
https://secure-sso-sso-app-demo.openshift.example.com/auth/admin
- カーソルをサイドバーの上部にあるレルム名前空間 (デフォルトは Master) の上に置き、Add Realm をクリックします。
-
レルム名を入力して (この例では
demo
を使用)、Create をクリックします。
公開鍵のコピー
新規に作成された demo
レルムで Keys タブをクリックしてから Active タブを選択し、生成したタイプ RSA の公開鍵をコピーします。
OpenShift イメージバージョン 7.4.10.GA 用の Red Hat Single Sign-On は、デフォルトで複数のキーを生成します( HS256、RS256、AES など)。OpenShift 7.4.10.GA イメージの Red Hat Single Sign-On の公開鍵情報をコピーするには、Keys タブをクリックしてから Active タブを選択し、キーテーブルのその行の Public key ボタンをクリックします。ここで、キーのタイプは RSA に一致します。次に、表示されるポップアップウィンドウの内容を選択し、コピーします。
Red Hat Single Sign-On 対応 EAP 6.4 / 7.1 JSP アプリケーションを 後でデプロイ するには、公開鍵に関する情報が必要になります。
Red Hat Single Sign-On のロールの作成
service-jee-jaxrs クイックスタートはサービスによって 3 つのエンドポイントを公開します。
-
public
- 認証は必要ありません。 -
secured
-user
ロールを持つユーザーが呼び出すことができます。 -
admin
-admin
ロールを持つユーザーが呼び出すことができます。
Red Hat Single Sign-On で user
ロールおよび admin
ロールを作成します。これらのロールは Red Hat Single Sign-On アプリケーションユーザーに割り当てられ、ユーザーアプリケーションへのアクセスを認証します。
Configure サイドバーの Roles をクリックし、このレルムのロールを一覧表示します。
注記これは新しいレルムであるため、デフォルト (
offline_access
およびuma_authorization
) ロールのみが必要です。- Add Role をクリックします。
-
ロール名 (
user
) を入力し、Save をクリックします。
admin
ロールについてこれらの手順を繰り返します。
Red Hat Single Sign-On レルム管理ユーザーの作成
- Manage サイドバーで Users をクリックし、レルムのユーザー情報を表示します。
- Add User をクリックします。
-
有効な Username を入力し (この例ではユーザー
appuser
を使用)、Save をクリックします。 ユーザー設定を編集します。
-
ユーザースペースの Credentials タブをクリックして、ユーザーのパスワードを入力します (この例ではパスワード
apppassword
を使用しています)。 - Temporary Password オプションを Off に設定して、後でパスワードの変更を要求しないようにし、Reset Password をクリックしてユーザーパスワードを設定します。ポップアップウィンドウが表示され、確認を求められます。
-
ユーザースペースの Credentials タブをクリックして、ユーザーのパスワードを入力します (この例ではパスワード
5.4.1.2. レルム管理ユーザーに、Red Hat Single Sign-On ロール user
を割り当て
以前に作成した appuser
を、Red Hat Single Sign-On ロール user
と関連付けるには、以下の手順を実行します。
-
Role Mappings をクリックし、レルムおよびクライアントロール設定を一覧表示します。Available Roles で、以前に作成した
user
ロールを選択し、Add selected> をクリックします。 Client Roles をクリックし、一覧から realm-management エントリーを選択し、Available Roles のリストで各レコードを選択します。
注記Ctrl キーを保持し、最初の
偽装
エントリーを同時にクリックすることで、複数の項目を一度に選択できます。Ctrl キーとマウスの左ボタンを押したままにしておくと、一覧の最後をview-clients
エントリーに移動し、各レコードが選択されていることを確認します。- Add selected> をクリックしてロールをクライアントに割り当てます。
5.4.1.3. EAP 6.4 / 7.1 JSP アプリケーションの OpenShift デプロイメント向けの Red Hat Single Sign-On 認証の準備
EAP 6.4 / 7.1 JSP アプリケーションの新しいプロジェクトを作成します。
$ oc new-project eap-app-demo
view
ロールをデフォルト
のサービスアカウントに追加します。これにより、サービスアカウントがeap-app-demo
名前空間のすべてのリソースを表示できるようになります。これは、クラスターの管理に必要です。$ oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default
EAP テンプレートには、SSL キーストアと JGroups キーストア が必要です。この例では、Java Development Kit に含まれるパッケージの
keytool
を使用して、これらのキーストアの自己署名証明書を生成します。SSL キーストアのセキュアなキーを生成します (この例では、キーストアのパスワードとして
password
を使用します)。$ keytool -genkeypair \ -dname "CN=secure-eap-app-eap-app-demo.openshift.example.com" \ -alias https \ -storetype JKS \ -keystore eapkeystore.jks
JGroups キーストアに、セキュリティーで保護されたキーを生成します (この例では、キーストアのパスワードとして
password
を使用します)。$ keytool -genseckey \ -alias jgroups \ -storetype JCEKS \ -keystore eapjgroups.jceks
SSL および JGroup キーストアファイルで、OpenShift シークレットの EAP 6.4 / 7.1 を生成します。
$ oc create secret generic eap-ssl-secret --from-file=eapkeystore.jks
$ oc create secret generic eap-jgroup-secret --from-file=eapjgroups.jceks
EAP アプリケーションシークレットを
default
サービスアカウントに追加します。$ oc secrets link default eap-ssl-secret eap-jgroup-secret
5.4.1.4. EAP 6.4 / 7.1 JSP アプリケーションのバイナリービルドのデプロイ
ソースコードのクローンを作成します。
$ git clone https://github.com/keycloak/keycloak-quickstarts.git
- Red Hat JBoss Middleware Maven リポジトリー を 設定 します。
service-jee-jaxrs アプリケーションと app-jee-jsp アプリケーションの両方をビルドします。
service-jee-jaxrs
アプリケーションをビルドします。$ cd keycloak-quickstarts/service-jee-jaxrs/
$ mvn clean package -DskipTests [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Keycloak Quickstart: service-jee-jaxrs 3.1.0.Final [INFO] ------------------------------------------------------------------------ ... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.153 s [INFO] Finished at: 2017-06-26T12:06:12+02:00 [INFO] Final Memory: 25M/241M [INFO] ------------------------------------------------------------------------
maven-enforcer-plugin
プラグインのapp-jee-jsp/config/keycloak.json
要件を コメントアウト し、app-jee-jsp
アプリケーションをビルドします。service-jee-jaxrs]$ cd ../app-jee-jsp/
app-jee-jsp]$ sed -i /\<executions\>/s/^/\<\!--/ pom.xml
app-jee-jsp]$ sed -i '/\(<\/executions>\)/a\-->' pom.xml
app-jee-jsp]$ mvn clean package -DskipTests [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Keycloak Quickstart: app-jee-jsp 3.1.0.Final [INFO] ------------------------------------------------------------------------ ... [INFO] Building war: /tmp/github/keycloak-quickstarts/app-jee-jsp/target/app-jsp.war [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.018 s [INFO] Finished at: 2017-06-26T12:22:25+02:00 [INFO] Final Memory: 35M/310M [INFO] ------------------------------------------------------------------------
重要app-jee-jsp クイックスタートではアダプターの設定が必要で、アダプター設定ファイル (
keycloak.json
) がクイックスタートのルートのconfig/
ディレクトリーにあり、クイックスタートを正常にビルドする必要があります。ただし、この例では、EAP 6.4 / 7.1 for OpenShift イメージで利用可能な選択された環境変数を使用して後でアダプターを設定するため、現時点でkeycloak.json
アダプター設定ファイルの形式を指定する必要はありません。
ローカルファイルシステムでディレクトリー構造を準備します。
メインのバイナリービルドディレクトリーの deployments/ サブディレクトリーにあるアプリケーションアーカイブは、OpenShift でビルドされるイメージの 標準のデプロイメントディレクトリー に直接コピーされます。アプリケーションをデプロイするには、web アプリケーションデータが含まれるディレクトリー階層が正しく構成される必要があります。
ローカルファイルシステム上にバイナリービルド用のメインディレクトリーと、そのディレクトリー内に deployments/ サブディレクトリーを作成します。service-jee-jaxrs および app-jee-jsp クイックスタートの両方のビルドされた WAR アーカイブを deployments/ サブディレクトリーにコピーします。
app-jee-jsp]$ ls config pom.xml README.md src target
app-jee-jsp]$ mkdir -p sso-eap7-bin-demo/deployments
app-jee-jsp]$ cp target/app-jsp.war sso-eap7-bin-demo/deployments/
app-jee-jsp]$ cp ../service-jee-jaxrs/target/service.war sso-eap7-bin-demo/deployments/
app-jee-jsp]$ tree sso-eap7-bin-demo/ sso-eap7-bin-demo/ |__ deployments |__ app-jsp.war |__ service.war 1 directory, 2 files
注記標準の deployments ディレクトリーの場所は、アプリケーションのデプロイに使用された基礎となるベースイメージによって異なります。以下の表を参照してください。
表5.1 デプロイメントディレクトリーの標準的な場所
基礎となるベースイメージの名前 デプロイメントディレクトリーの標準的な場所 EAP for OpenShift 6.4 and 7.1
$JBOSS_HOME/standalone/deployments
Java S2I for OpenShift
/deployments
JWS for OpenShift
$JWS_HOME/webapps
EAP 6.4 / 7.1 イメージのイメージストリームを特定します。
$ oc get is -n openshift | grep eap | cut -d ' ' -f 1 jboss-eap64-openshift jboss-eap71-openshift
イメージストリームおよびアプリケーション名を指定して、新しいバイナリービルドを作成します。
注記--image-stream=jboss-eap71-openshift
パラメーターを、以下の oc コマンドの--image-stream=jboss-eap64-openshift
に置き換え、JBoss EAP 6.4 for OpenShift イメージに JSP アプリケーションをデプロイします。$ oc new-build --binary=true \ --image-stream=jboss-eap71-openshift \ --name=eap-app --> Found image 31895a4 (3 months old) in image stream "openshift/jboss-eap71-openshift" under tag "latest" for "jboss-eap71-openshift" JBoss EAP 7.3 ------------- Platform for building and running JavaEE applications on JBoss EAP 7.3 Tags: builder, javaee, eap, eap7 * A source build using binary input will be created * The resulting image will be pushed to image stream "eap-app:latest" * A binary build was created, use 'start-build --from-dir' to trigger a new build --> Creating resources with label build=eap-app ... imagestream "eap-app" created buildconfig "eap-app" created --> Success
バイナリービルドを開始します。直前の手順で 作成したバイナリービルドのメインディレクトリーを OpenShift ビルドのバイナリー入力が含まれるディレクトリーとして使用するよう
oc
実行ファイルに指示します。app-jee-jsp の作業ディレクトリーで、次のコマンドを実行します。app-jee-jsp]$ oc start-build eap-app \ --from-dir=./sso-eap7-bin-demo/ \ --follow Uploading directory "sso-eap7-bin-demo" as binary input for the build ... build "eap-app-1" started Receiving source from STDIN as archive ... Copying all war artifacts from /home/jboss/source/. directory into /opt/eap/standalone/deployments for later deployment... Copying all ear artifacts from /home/jboss/source/. directory into /opt/eap/standalone/deployments for later deployment... Copying all rar artifacts from /home/jboss/source/. directory into /opt/eap/standalone/deployments for later deployment... Copying all jar artifacts from /home/jboss/source/. directory into /opt/eap/standalone/deployments for later deployment... Copying all war artifacts from /home/jboss/source/deployments directory into /opt/eap/standalone/deployments for later deployment... '/home/jboss/source/deployments/app-jsp.war' -> '/opt/eap/standalone/deployments/app-jsp.war' '/home/jboss/source/deployments/service.war' -> '/opt/eap/standalone/deployments/service.war' Copying all ear artifacts from /home/jboss/source/deployments directory into /opt/eap/standalone/deployments for later deployment... Copying all rar artifacts from /home/jboss/source/deployments directory into /opt/eap/standalone/deployments for later deployment... Copying all jar artifacts from /home/jboss/source/deployments directory into /opt/eap/standalone/deployments for later deployment... Pushing image 172.30.82.129:5000/eap-app-demo/eap-app:latest ... Pushed 6/7 layers, 86% complete Pushed 7/7 layers, 100% complete Push successful
ビルドに基づいて新規の OpenShift アプリケーションを作成します。
$ oc new-app eap-app --> Found image 6b13d36 (2 minutes old) in image stream "eap-app-demo/eap-app" under tag "latest" for "eap-app" eap-app-demo/eap-app-1:aa2574d9 ------------------------------- Platform for building and running JavaEE applications on JBoss EAP 7.3 Tags: builder, javaee, eap, eap7 * This image will be deployed in deployment config "eap-app" * Ports 8080/tcp, 8443/tcp, 8778/tcp will be load balanced by service "eap-app" * Other containers can access this service through the hostname "eap-app" --> Creating resources ... deploymentconfig "eap-app" created service "eap-app" created --> Success Run 'oc status' to view your app.
現在の名前空間で EAP 6.4 / 7.1 JSP アプリケーションの実行中のコンテナーをすべて停止します。
$ oc get dc -o name deploymentconfig/eap-app
$ oc scale dc/eap-app --replicas=0 deploymentconfig "eap-app" scaled
デプロイメントの前に EAP 6.4 / 7.1 JSP アプリケーションをさらに設定します。
Red Hat Single Sign-On サーバーインスタンスに関する適切な詳細でアプリケーションを設定します。
警告以下の SSO_PUBLIC_KEY 変数の値を、コピー された
demo
レルムの RSA 公開鍵の実際の内容に置き換えるようにしてください。$ oc set env dc/eap-app \ -e HOSTNAME_HTTP="eap-app-eap-app-demo.openshift.example.com" \ -e HOSTNAME_HTTPS="secure-eap-app-eap-app-demo.openshift.example.com" \ -e SSO_DISABLE_SSL_CERTIFICATE_VALIDATION="true" \ -e SSO_USERNAME="appuser" \ -e SSO_PASSWORD="apppassword" \ -e SSO_REALM="demo" \ -e SSO_URL="https://secure-sso-sso-app-demo.openshift.example.com/auth" \ -e SSO_PUBLIC_KEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkdhXyKx97oIoO6HwnV/MiX2EHO55Sn+ydsPzbjJevI5F31UvUco9uA8dGl6oM8HrnaWWv+i8PvmlaRMhhl6Xs68vJTEc6d0soP+6A+aExw0coNRp2PDwvzsXVWPvPQg3+iytStxu3Icndx+gC0ZYnxoRqL7rY7zKcQBScGEr78Nw6vZDwfe6d/PQ6W4xVErNytX9KyLFVAE1VvhXALyqEM/EqYGLmpjw5bMGVKRXnhmVo9E88CkFDH8E+aPiApb/gFul1GJOv+G8ySLoR1c8Y3L29F7C81odkVBp2yMm3RVFIGSPTjHqjO/nOtqYIfY4Wyw9mRIoY5SyW7044dZXRwIDAQAB" \ -e SSO_SECRET="0bb8c399-2501-4fcd-a183-68ac5132868d" deploymentconfig "eap-app" updated
SSL および JGroups キーストアの両方の詳細を使用してアプリケーションを設定します。
$ oc set env dc/eap-app \ -e HTTPS_KEYSTORE_DIR="/etc/eap-secret-volume" \ -e HTTPS_KEYSTORE="eapkeystore.jks" \ -e HTTPS_PASSWORD="password" \ -e JGROUPS_ENCRYPT_SECRET="eap-jgroup-secret" \ -e JGROUPS_ENCRYPT_KEYSTORE_DIR="/etc/jgroups-encrypt-secret-volume" \ -e JGROUPS_ENCRYPT_KEYSTORE="eapjgroups.jceks" \ -e JGROUPS_ENCRYPT_PASSWORD="password" deploymentconfig "eap-app" updated
先に作成した SSL および JGroups のシークレット両方に対して OpenShift ボリュームを定義します。
$ oc volume dc/eap-app --add \ --name="eap-keystore-volume" \ --type=secret \ --secret-name="eap-ssl-secret" \ --mount-path="/etc/eap-secret-volume" deploymentconfig "eap-app" updated
$ oc volume dc/eap-app --add \ --name="eap-jgroups-keystore-volume" \ --type=secret \ --secret-name="eap-jgroup-secret" \ --mount-path="/etc/jgroups-encrypt-secret-volume" deploymentconfig "eap-app" updated
アプリケーションのデプロイメント設定を、
default
の OpenShift サービスアカウントでアプリケーション Pod を実行するように設定します (デフォルト設定)。$ oc patch dc/eap-app --type=json \ -p '[{"op": "add", "path": "/spec/template/spec/serviceAccountName", "value": "default"}]' "eap-app" patched
変更されたデプロイメント設定を使用して EAP 6.4 / 7.1 JSP アプリケーションのコンテナーをデプロイします。
$ oc scale dc/eap-app --replicas=1 deploymentconfig "eap-app" scaled
サービスをルートとして公開します。
$ oc get svc -o name service/eap-app
$ oc get route No resources found.
$ oc expose svc/eap-app route "eap-app" exposed
$ oc get route NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD eap-app eap-app-eap-app-demo.openshift.example.com eap-app 8080-tcp None
5.4.1.5. アプリケーションにアクセス
URL http://eap-app-eap-app-demo.openshift.example.com/app-jsp を使用して、ブラウザーでアプリケーションにアクセスします。次の画像のような出力が表示されます。
アプリケーションをテストするには、以下を実行します。
INVOKE PUBLIC ボタンをクリックして、認証を必要としない
public
エンドポイントにアクセスします。Message: public 出力が表示されるはずです。
LOGIN ボタンをクリックして、ユーザー認証用に
demo
レルムに対して Red Hat Single Sign-On サーバーインスタンスにリダイレクトされます。以前に設定した Red Hat Single Sign-On ユーザーのユーザー名とパスワード (
appuser
/apppassword
) を指定します。Log in をクリックします。以下のイメージで説明されているように、アプリケーションの変更を確認できます。セキュリティー保護された
エンドポイントにアクセスするには、INVOKE SECURED ボタンをクリックします。Message: secured 出力が表示されるはずです。
INVOKE ADMIN ボタンをクリックして
admin
エンドポイントにアクセスします。403 Forbidden 出力が表示されるはずです。
注記admin
エンドポイントでは、admin
Red Hat Single Sign-On ロールを持つユーザーが適切に呼び出す必要があります。appuser
へのアクセスは、user
ロール権限のみで禁止され、セキュリティー保護された
エンドポイントへのアクセスが可能になります。appuser
を Red Hat Single Sign-On ロールadmin
に追加するには、以下の手順を実行します。Red Hat Single Sign-On サーバーのインスタンスの管理コンソールにアクセスします。
https://secure-sso-sso-app-demo.openshift.example.com/auth/admin.
-
Manage サイドバーで Users をクリックし、
demo
レルムのユーザー情報を表示します。 - View all users ボタンをクリックします。
- appuser の ID リンクをクリックします。あるいは、Actions 列の Edit ボタンをクリックします。
- Role Mappings タブをクリックします。
-
Realm Roles 行の Available Roles リストから
admin
エントリーを選択します。 -
Add selected> ボタンをクリックし、
admin
ロールをユーザーに追加します。 EAP 6.4 / 7.1 JSP サービスアプリケーションに戻ります。
http://eap-app-eap-app-demo.openshift.example.com/app-jsp.
-
LOGOUT ボタンをクリックして、
appuser
のロールマッピングを再読み込みします。 -
再度 LOGIN ボタンをクリックし、プロバイダー
appuser
認証情報をクリックします。 再度 INVOKE ADMIN ボタンをクリックします。
Message: admin というメッセージが表示されるはずです。