将 Red Hat Single Sign-On 迁移到 Keycloak

本指南介绍如何将运行在 OpenShift 上的 Red Hat Single Sign-On (RH-SSO) 7.x 中的身份数据迁移到运行在 Kubernetes 上的 Alauda Application Services Identity Management E1。

概述

Red Hat Single Sign-On (RH-SSO) 7.x 是由 Red Hat 基于 Keycloak Community Edition 开发的商业发行版。两者在核心数据模型和存储结构方面完全兼容。

此次迁移使用官方推荐的导出/导入机制,可完整迁移以下数据:

  • Realm 配置
  • 用户(包括凭证和状态)
  • Realm 角色和客户端角色
  • 客户端及其权限映射
  • 组合角色和内置管理权限

迁移流程

RH-SSO (OpenShift)
   ↓ Export as JSON file
Local machine
   ↓ Copy the migration file
Keycloak (Kubernetes)
   ↓ Import JSON file
Migration complete

前提条件

  • 具有在 OpenShift 上访问 RH-SSO Pod 的权限,并拥有 oc rsh 权限。
  • Kubernetes 上正在运行的 Alauda Application Services Identity Management E1 实例。
  • 对目标 Kubernetes 集群具有 kubectl 访问权限。
  • 本地计算机上具有足够的磁盘空间,用于保存导出的 JSON 文件。

步骤 1:从 RH-SSO 导出数据

服务影响

导出命令会在偏移端口上启动一个辅助的独立服务器进程。它不会中断正在运行的 RH-SSO 服务,但应计划在低流量时段执行此操作,以最大程度地降低风险。

连接到 RH-SSO Pod 并运行导出命令:

# Connect to the RH-SSO Pod
oc rsh <rh-sso-pod-name>

# Run the export command inside the Pod
/opt/eap/bin/standalone.sh \
  -c standalone-openshift.xml \
  -Dkeycloak.migration.action=export \
  -Dkeycloak.migration.provider=singleFile \
  -Dkeycloak.migration.file=/tmp/sso-export.json \
  -Dkeycloak.migration.usersExportStrategy=REALM_FILE \
  -Djboss.socket.binding.port-offset=502

等待导出完成。该进程会输出日志,然后退出。导出的文件将保存到 Pod 内的 /tmp/sso-export.json。

步骤 2:复制导出文件

将导出文件从 RH-SSO Pod 复制到本地计算机,然后再复制到 Keycloak Pod:

# Copy from RH-SSO Pod (OpenShift) to local machine
oc cp <rh-sso-pod-name>:/tmp/sso-export.json /tmp/sso-export.json

# Copy from local machine to Keycloak Pod (Kubernetes)
kubectl cp /tmp/sso-export.json \
  <namespace>/<keycloak-pod-name>:/tmp/sso-export.json

步骤 3:将数据导入 Keycloak

连接到 Keycloak Pod 并运行导入命令:

# Connect to the Keycloak Pod
kubectl exec -it <keycloak-pod-name> -n <namespace> -- /bin/bash

# Run the import command inside the Pod
/opt/keycloak/bin/kc.sh import \
  --file /tmp/sso-export.json \
  --override true
覆盖模式

--override true 标志会替换目标 Keycloak 实例中名称相同的现有 Realm。如果希望在存在冲突 Realm 时导入失败并保留当前数据,请移除此标志。

步骤 4:验证迁移

导入完成后,验证所有数据是否已正确迁移:

  1. 登录 Keycloak Admin Console。
  2. 确认导入的 Realm 出现在 Realm 下拉菜单中。
  3. 在每个导入的 Realm 中验证以下内容:
    • 用户数量与源 RH-SSO 匹配

    • Client 配置完整

    • 角色分配正确

    • Composite 角色和权限映射均已保留

      # Check imported Realms
      kubectl exec -it <keycloak-pod-name> -n <namespace> -- \
        /opt/keycloak/bin/kc.sh show-config

注意事项

  • 导入成功指示器:执行导入命令后,日志会打印 Realm '<realm-name>' imported,以确认导入成功。最后的 ERROR: Address already in use 消息表示导入过程中的端口冲突,不会影响数据导入结果。
  • 凭证兼容性:RH-SSO 7.x 和 Keycloak 26.x 使用兼容的凭证存储格式。用户密码会被迁移,并在导入后保持有效。
  • Client 密钥:Client 密钥包含在导出文件中。请验证导入后这些密钥是否已保留。
  • 覆盖模式:--override true 标志会替换名称相同的现有 Realm。如果希望在存在冲突 Realm 时导入失败,请移除此标志。

参考文档