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 レルムの作成

  1. Red Hat Single Sign-On サーバーの管理コンソールにログインします。

    https://secure-sso-sso-app-demo.openshift.example.com/auth/admin

    Red Hat Single Sign-On 管理者ユーザーの認証情報 を使用します。

  2. カーソルをサイドバーの上部にあるレルム名前空間 (デフォルトは Master) の上に置き、Add Realm をクリックします。
  3. レルム名を入力して (この例では demo を使用)、Create をクリックします。

公開鍵のコピー

新規に作成された demo レルムで Keys タブをクリックしてから Active タブを選択し、生成したタイプ RSA の公開鍵をコピーします。

注記

OpenShift イメージバージョン 7.4.10.GA 用の Red Hat Single Sign-On は、デフォルトで複数のキーを生成します( HS256RS256AES など)。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 アプリケーションユーザーに割り当てられ、ユーザーアプリケーションへのアクセスを認証します。

  1. Configure サイドバーの Roles をクリックし、このレルムのロールを一覧表示します。

    注記

    これは新しいレルムであるため、デフォルト (offline_access および uma_authorization) ロールのみが必要です。

  2. Add Role をクリックします。
  3. ロール名 (user) を入力し、Save をクリックします。

admin ロールについてこれらの手順を繰り返します。

Red Hat Single Sign-On レルム管理ユーザーの作成

  1. Manage サイドバーで Users をクリックし、レルムのユーザー情報を表示します。
  2. Add User をクリックします。
  3. 有効な Username を入力し (この例ではユーザー appuser を使用)、Save をクリックします。
  4. ユーザー設定を編集します。

    1. ユーザースペースの Credentials タブをクリックして、ユーザーのパスワードを入力します (この例ではパスワード apppassword を使用しています)。
    2. Temporary Password オプションを Off に設定して、後でパスワードの変更を要求しないようにし、Reset Password をクリックしてユーザーパスワードを設定します。ポップアップウィンドウが表示され、確認を求められます。

5.4.1.2. レルム管理ユーザーに、Red Hat Single Sign-On ロール user を割り当て

以前に作成した appuser を、Red Hat Single Sign-On ロール user と関連付けるには、以下の手順を実行します。

  1. Role Mappings をクリックし、レルムおよびクライアントロール設定を一覧表示します。Available Roles で、以前に作成した user ロールを選択し、Add selected> をクリックします。
  2. Client Roles をクリックし、一覧から realm-management エントリーを選択し、Available Roles のリストで各レコードを選択します。

    注記

    Ctrl キーを保持し、最初の 偽装 エントリーを同時にクリックすることで、複数の項目を一度に選択できます。Ctrl キーとマウスの左ボタンを押したままにしておくと、一覧の最後を view-clients エントリーに移動し、各レコードが選択されていることを確認します。

  3. Add selected> をクリックしてロールをクライアントに割り当てます。

5.4.1.3. EAP 6.4 / 7.1 JSP アプリケーションの OpenShift デプロイメント向けの Red Hat Single Sign-On 認証の準備

  1. EAP 6.4 / 7.1 JSP アプリケーションの新しいプロジェクトを作成します。

    $ oc new-project eap-app-demo
  2. view ロールを デフォルト のサービスアカウントに追加します。これにより、サービスアカウントが eap-app-demo 名前空間のすべてのリソースを表示できるようになります。これは、クラスターの管理に必要です。

    $ oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default
  3. EAP テンプレートには、SSL キーストアと JGroups キーストア が必要です。この例では、Java Development Kit に含まれるパッケージの keytool を使用して、これらのキーストアの自己署名証明書を生成します。

    1. SSL キーストアのセキュアなキーを生成します (この例では、キーストアのパスワードとして password を使用します)。

      $ keytool -genkeypair \
      -dname "CN=secure-eap-app-eap-app-demo.openshift.example.com" \
      -alias https \
      -storetype JKS \
      -keystore eapkeystore.jks
    2. JGroups キーストアに、セキュリティーで保護されたキーを生成します (この例では、キーストアのパスワードとして password を使用します)。

      $ keytool -genseckey \
      -alias jgroups \
      -storetype JCEKS \
      -keystore eapjgroups.jceks
    3. 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
    4. EAP アプリケーションシークレットを default サービスアカウントに追加します。

      $ oc secrets link default eap-ssl-secret eap-jgroup-secret

5.4.1.4. EAP 6.4 / 7.1 JSP アプリケーションのバイナリービルドのデプロイ

  1. ソースコードのクローンを作成します。

    $ git clone https://github.com/keycloak/keycloak-quickstarts.git
  2. Red Hat JBoss Middleware Maven リポジトリー設定 します。
  3. service-jee-jaxrs アプリケーションと app-jee-jsp アプリケーションの両方をビルドします。

    1. 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] ------------------------------------------------------------------------
    2. 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 アダプター設定ファイルの形式を指定する必要はありません。

  1. ローカルファイルシステムでディレクトリー構造を準備します。

    メインのバイナリービルドディレクトリーの 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

  2. EAP 6.4 / 7.1 イメージのイメージストリームを特定します。

    $ oc get is -n openshift | grep eap | cut -d ' ' -f 1
    jboss-eap64-openshift
    jboss-eap71-openshift
  1. イメージストリームおよびアプリケーション名を指定して、新しいバイナリービルドを作成します。

    注記

    --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
  2. バイナリービルドを開始します。直前の手順で 作成したバイナリービルドのメインディレクトリーを 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
  3. ビルドに基づいて新規の 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.
  4. 現在の名前空間で 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
  5. デプロイメントの前に EAP 6.4 / 7.1 JSP アプリケーションをさらに設定します。

    1. 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
    2. 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
    3. 先に作成した 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
    4. アプリケーションのデプロイメント設定を、default の OpenShift サービスアカウントでアプリケーション Pod を実行するように設定します (デフォルト設定)。

      $ oc patch dc/eap-app --type=json \
      -p '[{"op": "add", "path": "/spec/template/spec/serviceAccountName", "value": "default"}]'
      "eap-app" patched
  6. 変更されたデプロイメント設定を使用して EAP 6.4 / 7.1 JSP アプリケーションのコンテナーをデプロイします。

    $ oc scale dc/eap-app --replicas=1
    deploymentconfig "eap-app" scaled
  7. サービスをルートとして公開します。

    $ 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 を使用して、ブラウザーでアプリケーションにアクセスします。次の画像のような出力が表示されます。

Red Hat Single Sign-On Example JSP Application

アプリケーションをテストするには、以下を実行します。

  • INVOKE PUBLIC ボタンをクリックして、認証を必要としない public エンドポイントにアクセスします。

    Message: public 出力が表示されるはずです。

  • LOGIN ボタンをクリックして、ユーザー認証用に demo レルムに対して Red Hat Single Sign-On サーバーインスタンスにリダイレクトされます。

    以前に設定した Red Hat Single Sign-On ユーザーのユーザー名とパスワード (appuser / apppassword) を指定します。Log in をクリックします。以下のイメージで説明されているように、アプリケーションの変更を確認できます。

    sso app jee jsp logged 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 に追加するには、以下の手順を実行します。

    1. Red Hat Single Sign-On サーバーのインスタンスの管理コンソールにアクセスします。

      https://secure-sso-sso-app-demo.openshift.example.com/auth/admin.

      Red Hat Single Sign-On 管理者ユーザーの認証情報 を使用します。

    2. Manage サイドバーで Users をクリックし、demo レルムのユーザー情報を表示します。
    3. View all users ボタンをクリックします。
    4. appuser の ID リンクをクリックします。あるいは、Actions 列の Edit ボタンをクリックします。
    5. Role Mappings タブをクリックします。
    6. Realm Roles 行の Available Roles リストから admin エントリーを選択します。
    7. Add selected> ボタンをクリックし、admin ロールをユーザーに追加します。
    8. EAP 6.4 / 7.1 JSP サービスアプリケーションに戻ります。

      http://eap-app-eap-app-demo.openshift.example.com/app-jsp.

    9. LOGOUT ボタンをクリックして、appuser のロールマッピングを再読み込みします。
    10. 再度 LOGIN ボタンをクリックし、プロバイダー appuser 認証情報をクリックします。
    11. 再度 INVOKE ADMIN ボタンをクリックします。

      Message: admin というメッセージが表示されるはずです。