《OpenShift / RHEL / DevSecOps / Ansible 汇总目录》
说明:本文已经在 OpenShift 4.11 环境中验证
本文将部署一个应用,然后用 RHSSO 对应用访问进行身份认证,并对不同的登录用户和应用资源进行访问授权。
安装环境
- 执行命令安装 OpenJDK 11 环境。
$ cd ~
$ curl -LO https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz
$ tar xzvf openjdk-11.0.2_linux-x64_bin.tar.gz
$ JAVA_PATH=~/jdk-11.0.2/
$ PATH=$PATH:$JAVA_PATH/bin
- 执行命令安装 Maven 环境。
$ curl -LO https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
$ tar xzvf apache-maven-3.8.6-bin.tar.gz
$ PATH=$PATH:~/apache-maven-3.8.6/bin
- 执行命令安装 Make 环境。
$ yum install make
- 在 OpenShift 控制台的 OperatorHub 中将 Red Hat Single Sign-On Operator 使用默认配置安装到 sso 项目中,然后使用默认配置在名为 sso 的项目中创建一个 Keycloak 实例,名称为 my-keycloak。
- 执行以下命令获得 RHSSO 控制台的访问地址和 admin 用户的密码,即可登录 RHSSO 控制台。
$ RH_SSO_HOST=$(oc get route keycloak -o jsonpath='{.spec.host}' -n sso) && echo $RH_SSO_HOST
$ oc get secret credential-my-keycloak -n sso -o go-template --template="{{.data.ADMIN_PASSWORD | base64decode}}"
部署应用并配置登录和授权
部署应用
- 在新建的 demo-app 项目中部署 quarkus-petclinic 应用。
$ oc new-project demo-app
$ git clone -b sso-base https://github.com/liuxiaoyu-git/quarkus-petclinic.git && cd quarkus-petclinic
$ ./ocp-deploy.sh
- 获得访问应用的 Route 地址,然后访问应用,此时应用还无需登录即可访问。
$ oc get route quarkus-petclinic -o jsonpath='{.spec.host}' -n deom-app
配置 RHSSO 的用户和组
本节将创建属于 vet 角色的 angel 用户以及属于 assistant 角色的 elisa 用户。
- 在 RHSSO 的控制台中点击 Master,然后点击 Add realm。
- 设置 Name 为 demo,然后点击 Create。
- 点击菜单的 Roles,然后点击 Add Role 按钮。
- 在 Add Role 页面中为 Role Name 设为 vet ,然后点击 Create。
- 重复步骤再创建名一个为 assistant 的 Role。
- 点击菜单的 Users,然后点击 Add user 按钮。
- 在 Add user 页面中为 Username 设为 angel,然后点击 Save。
- 进入 angel 用户的 Credentials 栏目,设置用户密码后点击 Set Password。
- 进入 angel 用户的 Role Mappings 栏目,给用户赋予 vet 角色。
- 重复以上步骤创建名为 elisa 的用户,并赋予 assistant 角色。
- 点击菜单的 Groups,然后点击 New 按钮。
- 在 Create group 页面中设置 Name 为 staff,然后点击 Save。
- 再次点击菜单的 Groups,然后在 User Groups 页面中选中 staff,点击 New 按钮。
- 在 Create group 页面中设置 Name 为 Personal staff,然后 Save。
- 最后应该在 User Groups 页面中看到下图的组关系。
配置应用身份认证
本节将实现对应用 http://quarkus-petclinic-sso.apps.cluster-72c7x.72c7x.sandbox2951.opentlc.com 的访问进行身份认证。
- 点击菜单的 Clients,然后点击 Create 按钮。
- 在 Add Client 页面中设置 Client ID 为 quarkus-petclinic,然后点击 Save。
- 在 quarkus-petclinic 的 Setting 页面根据下表进行配置,然后点击 Save。
属性 | 值 |
---|---|
Access Type | confidential |
Authorization Enabled | ON |
Valid Redirect URIs | http://quarkus-petclinic-sso.apps.cluster-72c7x.72c7x.sandbox2951.opentlc.com/* |
其中 Valid Redirect URIs 地址是应用的 route。
$ oc get route quarkus-petclinic -o jsonpath='{.spec.host}' -n demo-app
说明:此时如果跳转到 “为应用配置登录和访问授权”,会发现用户访问应用必须先要登录,但是 2 个登录用户都可以访问全部的应用栏目。下面就根据用户进行访问授权,让不同的登录用户能访问不同的应用栏目。
配置应用访问授权
本节将配置只允许 vet 角色的用户才能访问应用的 VETERINARIANS 栏目,属于 demo realm 的其他用户可以访问应用的其他栏目。
- 点击菜单的 Clients,然后进入 quarkus-petclinic 的 Authorization → Resources。
- 点击 Name 为 Default Resource 一行后的 Create Permission 按钮。
- 在 Add Resource Permission 页面中设置 Name 为 Default Resource Permission,然后点击 Create Policy… → Group。
- 在 Add Group Policy 页面中设置 Name 为 Default Group Policy;然后先选中 Groups 的 staff 再点击 Select,在出现的表中选则 Extend to Children,再将 Logic 设为 Negative,最后点击 Save。
- 页面会跳转回 Add Resource Permission 页面,点击 Save。
- 在 Authorization → Resources 中点击 Create。
- 在 Add Resource 页面中将 Name 和 Display name 设为 Vets Resource,将 URI 设为 /vets.html,然后点击 Save。
- 进入 Authorization → Resources 页面,在 Vets Resource 一行点击 Create Permission 按钮。
- 在 Add Resource Permission 页面中设置 Name 为 Vets Resource Permission, 在 Apply Policy 的 Create Policy 下拉框中选中Role。
- 在 Add Role Policy 页面中设置 Name 为 Vet Role Policy,为 Realm Roles 选择出 vet,然后选中 Required,最后点击 Save。
- 页面会再次跳回 Add Resource Permission 页面,点击 Save 按钮。
为应用配置登录和访问授权
- 在 quarkus-petclinic 的 Clients 的 Credentials 栏目中记下下图中的 Secret 内容。
- 执行命令,基于 Secret 内容创建 configmap 和 secret。
$ MY_SSO_CLIENT_SECRET=kFJFDBluHlQIVCQg9S0aF3WAzUwXABto
$ oc create configmap quarkus-petclinic-config --from-literal=SSO_HOST=${RH_SSO_HOST} -n demo-app
$ oc create secret generic quarkus-petclinic-secret --from-literal=SSO_CLIENT_SECRET=${MY_SSO_CLIENT_SECRET} -n demo-app
- 执行命令,将一下配置追加到应用的 application.properties 配置文件中。
$ cat >> ~/quarkus-petclinic/src/main/resources/application.properties << EOF
quarkus.oidc.auth-server-url=https://${RH_SSO_HOST}/auth/realms/demo
quarkus.oidc.client-id=quarkus-petclinic
quarkus.oidc.credentials.secret=${MY_SSO_CLIENT_SECRET}
quarkus.oidc.tls.verification=none
quarkus.oidc.roles.source=accesstoken
quarkus.oidc.application-type=web-app
quarkus.oidc.webapp.auth-server-url=\${quarkus.oidc.auth-server-url}
quarkus.oidc.webapp.client-id=\${quarkus.oidc.client-id}
quarkus.oidc.webapp.credentials.secret=\${quarkus.oidc.credentials.secret}
quarkus.oidc.webapp.roles.source=\${quarkus.oidc.roles.source}
quarkus.keycloak.policy-enforcer.enable=true
EOF
- 执行以下命令,为应用 pom.xml 文件增加扩展,然后重新部署运行应用。
$ ./mvnw quarkus:add-extension -Dextensions='oidc,keycloak-authorization'
$ ./ocp-deploy.sh
- 分别用 angel 和 elisa 用户登录,确认他们都需要登录才能访问应用。并且 elisa 无法访问应用的 VETERINARIANS 栏目,而 angel 可以访问 VETERINARIANS 栏目。
演示视频
参考
https://olleb.com/rhsso-workshop/index.html