4.4. 从 maven 二进制文件创建 OpenShift 应用并使用 Red Hat Single Sign-On 对其进行保护
要在 OpenShift 上部署现有应用,您可以使用二进制源功能。
4.4.1. 使用 Red Hat Single Sign-On 部署 Binary Build of EAP 6.4 / 7.1 JSP 服务 Invocation Application 并保护它
以下示例使用 app-jee-jsp 和 service-jee-jaxrs Quickstart 部署 EAP 6.4 / 7.1 / 7.1 / 7.1 JSP 服务应用,此应用使用红帽单点登录进行身份验证。
前提条件
- OpenShift 镜像的 Red Hat Single Sign-On 之前使用以下模板之一进行部署:
- sso75-postgresql
- sso75-postgresql-persistent
- sso75-x509-postgresql-persistent
4.4.1.1. 为 EAP 6.4 / 7.1 / 7.1 JSP 应用创建 Red Hat Single Sign-On Realm、role 和 User
EAP 6.4 / 7.1 / 7.1 服务应用需要专用的红帽单点登录域、用户名和密码才能使用 Red Hat Single Sign-On 进行身份验证。在部署了 Red Hat Single Sign-On for OpenShift 镜像后执行以下步骤:
创建 Red Hat Single Sign-On Realm
登录红帽单点登录服务器的管理控制台。
https://secure-sso-sso-app-demo.openshift.example.com/auth/admin
- 将光标悬停在侧边栏顶部的 realm 命名空间(默认为 Master),然后单击 Add Realm。
-
输入域名称(本例使用
demo
),然后单击 Create。
复制公钥
在新创建的 demo
域中,单击 Keys 选项卡,然后选择 Active 选项卡,然后复制已生成的 RSA 类型的公钥。
默认情况下,Red Hat Single Sign-On for OpenShift 镜像版本 7.5.3 生成多个密钥,如 HS256、RS256 或 AES。要为 OpenShift 7.5.3 镜像复制 Red Hat Single Sign-On 的公钥信息,请单击 Keys 选项卡,然后选择 Active 选项卡,然后单击 键表中的公钥 按钮,其中密钥与 RSA 匹配。然后选择并复制显示的弹出窗口的内容。
稍后需要有关公钥的信息,以便部署启用了 Red Hat Single Sign-On 的 EAP 6.4 / 7.1 JSP 应用。???
创建红帽单点登录角色
service-jee-jaxrs quickstart 通过该服务公开三个端点:
-
公共
- 不需要身份验证。 -
安全
- 可以被具有用户角色的用户调用。 -
admin
- 可由具有admin
角色的用户调用。
在 Red Hat Single Sign-On 中创建用户
和 admin
角色。这些角色将分配给红帽单点登录应用程序用户,以对用户应用程序的访问权限进行身份验证。
单击 Configure 栏中的 Roles,以列出此域的角色。
注意这是一个新域,因此只有默认(
offline_access
和uma_authorization
)角色。- 单击 Add Role。
-
输入角色名称(
用户
),然后单击 Save。
为 admin
角色重复上述步骤。
创建 Red Hat Single Sign-On Realm Management 用户
- 单击 Manage 栏中的 Users,以查看该域的用户信息。
- 点 Add User。
-
输入有效 用户名 (本例使用 user
appuser
),然后单击 Save。 编辑用户配置:
-
单击用户空间中的 Credentials 选项卡,再输入用户的密码(本例使用密码
apppassword
)。 - 确保 Temporary Password 选项设为 Off,以使其不会在稍后提示输入密码,然后单击 Reset Password 以设置用户密码。弹出窗口将提示您确认。
-
单击用户空间中的 Credentials 选项卡,再输入用户的密码(本例使用密码
4.4.1.2. 将用户角色分配给域管理用户
执行以下步骤将之前创建的 appuser
用户
与红帽 Single Sign-On 角色关联:
-
单击 Role 映射,以列出域和客户端角色配置。在 Available Roles 中,选择之前创建的
用户角色
,然后点击 Add selected>。 单击 Client Roles,从列表中选择 realm-management 条目,再选择 Available Roles 列表中的每条记录。
注意您可以通过按住 Ctrl 键并同时点击第一个
模拟
条目来一次性选择多个项目。在保持 Ctrl 键和左键键时,请将列表的末尾移至view-clients
条目,并确保选中每个记录。- 点 Add selected > 将角色分配给客户端。
4.4.1.3. 准备红帽单点登录身份验证,以进行 EAP 6.4 / 7.1 JSP 应用的 OpenShift 部署
流程
为 EAP 6.4 / 7.1 / 7.1 JSP 应用创建一个新项目。
$ oc new-project eap-app-demo
将
view
角色添加到default
服务帐户。这可让服务帐户查看eap-app-demo
命名空间中的所有资源,这是管理集群所必需的。$ oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default
EAP 模板需要 SSL 密钥存储和 JGroups 密钥存储 :本例使用
keytool
(由 Java Development Kit 附带的软件包)为这些密钥存储生成自签名证书。为 SSL 密钥存储生成安全密钥(本示例将
密码
用作密钥存储的密码)。$ keytool -genkeypair \ -dname "CN=secure-eap-app-eap-app-demo.openshift.example.com" \ -alias https \ -storetype JKS \ -keystore eapkeystore.jks
为 JGroups 密钥存储生成安全密钥(本示例将
密码
用作密钥存储的密码)。$ 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
4.4.1.4. 部署 EAP 6.4 / 7.1 JSP 应用的二进制构建
流程
克隆源代码。
$ git clone https://github.com/keycloak/keycloak-quickstarts.git
构建 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 用于 OpenShift 映像的所选环境变量配置适配器,因此此时不需要指定keycloak.json
适配器配置文件的形式。
在本地文件系统中准备目录结构。
主二进制构建目录的 deployments/ 子目录中的应用存档直接复制到 OpenShift 上构建的镜像的 标准部署目录中。若要部署应用,包含 Web 应用数据的目录层次结构必须正确结构化。
在本地文件系统和其中的 deployments/ 子目录中为二进制构建创建主目录。将之前构建的 WAR 存档(由 service-jee-jaxrs 和 app-jee-jsp Quickstart)复制到 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
注意标准部署目录的位置取决于用于部署应用的底层基础镜像。请查看下表:
表 4.1. Deployments 目录的标准位置 Base Image (s)的底层名称 Deployments 目录的标准位置 EAP for OpenShift 6.4 and 7.1
$JBOSS_HOME/standalone/deployments
用于 OpenShift 的 Java S2I
/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 的 JBoss EAP 6.4 顶部部署 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.4 ------------- Platform for building and running Jakarta EE applications on JBoss EAP 7.4 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
启动二进制构建。指示
oc
可执行文件使用在上一步中创建的二进制构建目录作为包含 OpenShift 构建的二进制输入的目录。???在 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 Jakarta EE applications on JBoss EAP 7.4 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 / 7.1 应用的容器。
$ 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
配置应用的部署配置,以在
默认的
OpenShift 服务帐户下运行应用容器集(默认设置)。$ 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 应用的容器。
$ 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
4.4.1.5. 访问应用程序
使用 URL http://eap-app-eap-app-demo.openshift.example.com/app-jsp 访问浏览器中的应用程序。您应该会在以下镜像中看到类似如下的输出:
流程
执行以下步骤来测试应用程序:
单击 INVOKE PUBLIC 按钮,以访问不需要身份验证的
公共端点
。您应看到 Message: public 输出。
单击 LOGIN 按钮,以根据
demo
域重定向到 Red Hat Single Sign-On 服务器实例。指定之前配置的 Red Hat Single Sign-On 用户的用户名和密码(
appuser
/apppassword
)。点登录。以下镜像中详述了应用程序更改:单击 INVOKE SECURED 按钮,以访问
安全
端点。您应看到 Message: secure 输出。
点击 INVOKE ADMIN 按钮访问
admin
端点。您应该看到 403 Forbidden 输出。
注意admin
端点要求具有admin
Red Hat Single Sign-On 角色的用户正确调用。对appuser
的访问是禁止的,因为它们只有用户角色
特权,允许他们访问受保护的
端点。
流程
执行以下步骤将 appuser
添加到 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 按钮,再单击 provider
appuser
凭据。 再次点击 INVOKE ADMIN 按钮。
您应看到 Message: admin 输出。