AWS中的Keycloak跨数据中心设置

2018年1月15日,星期一,由Hynek mlna ř í k发布

AWS环境中的Keycloak跨数据中心设置示例

借助Keycloak 3.3.0,可以支持跨多个数据中心 (也称为跨站点,X站点,跨数据中心,跨DC) 的大规模部署。 关于如何在云环境中利用这种支持的自然问题出现了。 这篇博客文章跟进了以前的博客文章关于在本地设置跨DC,并通过如何在Amazon Web Services (AWS) 中设置此类部署的示例对其进行了增强。
强烈建议至少使用版本3.4.3.Final,因为自第一个具有跨DC功能的版本以来,围绕跨DC支持进行了一些重要的修复。

建筑

详细描述了跨DC部署的一般架构在Keycloak文档中并简要显示在下图中。 有几个数据中心 (站点1站点2在可以找到完整比例的图片中在文档中)。 这些站点有一个复制的数据库,理想情况下是在多主同步复制模式下设置的。 每个站点都有一个Keycloak节点集群和一个Infinispan节点集群。 Keycloak节点的集群隐藏在私有子网中的负载平衡器后面; Infinispan节点在相应的数据中心内形成集群,此外还利用中继协议在数据中心之间相互备份。

示例

这篇文章基于三个CloudFormation模板,这些模板逐渐构建了两个带有Keycloak实例的数据中心,每个数据中心在单独的AWS可用性区域中共享相同的虚拟私有云 (VPC)。 请注意,模板是有意的仅用于尝试/测试目的,不用于生产。 模板描述如下:
  1. 专有网络栈 此堆栈创建了一个新的VPC,其中有四个子网: 其中两个在一个可用性区域中,另外两个在另一个可用性区域中。 每个可用区中的一个子网是私有的,用于Keycloak实例; 每个可用区中的另一个子网用于负载平衡器和Infinispan (以便它们可以通过internet进行通信)。

    此堆栈中唯一的参数是数字B在VPC ip地址范围10中。B.0.0/16。

    单击下面的按钮启动此堆栈:
  2. 数据库和AMI堆栈 此堆栈创建与RDS Aurora MySQL兼容的数据库实例,从源构建Keycloak,通过S3_PING协议创建动态节点发现所需的S3存储桶,并生成包含Keycloak和Infinispan预配置以形成适当集群的AMI映像。 它依赖于AWS Lambda支持的自定义资源,因此为了创建它们,需要此模板为这些lambda创建一个角色。 要启动此模板,因此需要用户授予能力 _ iam能力

    Keycloak和Infinispan服务器的准备方式与用于运行跨DC测试,然后放入/opt/测试路径及其配置的相关部分已更新,以适应AWS部署。

    这个模板有几个参数,大部分都是自我描述的:
    -VPC栈名称:上一步创建的堆栈名称
    -构建镜像的实例类型
    -数据库实例类型:RDS中提供的数据库类型
    -安装诊断工具:标志是否应安装诊断工具
    -用于构建的Maven存储库的URL:为了加快构建速度,而不是下载每个Maven工件,URL带有。可以提供包含整个 $ HOME/.m2目录的zip文件,该文件将在实际构建之前解压缩并提供工件,从而加快了构建速度。
    -Keycloak Git存储库Git标签/分支/提交: Git存储库和标签,构建应该从其中开始。

    单击下面的按钮启动此堆栈:
  3. Keycloak部署堆栈。 此堆栈在每个数据中心的公共子网中创建了一个Infinispan节点,给定每个数据中心的群集中加入的私有子网中的Keycloak服务器数量,并创建了一个AWS应用程序负载平衡器,以在实际的Keycloak服务器之间分散负载。 如果不从备份中恢复数据库,它还会创建一个初始用户管理员使用密码管理员在主领域,并配置主领域允许不安全的http访问管理控制台 (记住,它只是一个测试实例,不要在生产中这样做!)。

    这个模板有几个参数,大部分都是自我描述的:
    -AMI堆栈名称:上一步创建的堆栈名称
    -每个数据中心的Keycloak实例: 每个数据中心的Keycloak节点数量
    -Keycloak服务器的实例类型
    -Infinispan服务器的实例类型
    -SSH密钥名称:用于实例初始化的EC2 ssh密钥名称
    -负载平衡器方案:此设置确定将仅为负载平衡器分配公共IP还是专用IP。 见AWS文档有关更多信息。
    -数据库备份URL:如果您有Keycloak MySQL/MariaDB数据库的转储,则可以通过向该转储提供URL来初始化数据库。 转储可能是可选的gzip,。该转储的gz后缀是强制性的。

    单击下面的按钮启动此堆栈:
启动最后一个堆栈后,Keycloak将在负载平衡器地址处可用,该地址将显示在输出下第三个堆栈的选项卡LoadBalancerUrl键。

连接到节点

由于Infinispan节点分配了公共ip,并且安全组设置为允许SSH流量,因此您可以使用标准方式访问Infinispan节点。

访问Keycloak节点只是有点复杂,因为它们是在专用子网中产生的,并且只能通过Infinispan节点进行访问。 您可以将私钥复制到中间Infinispan节点并从那里使用它,或者 (更容易) 使用SSH代理转发,如下所示:
  1. 在你的本地主机,将您的AWS ssh密钥添加到代理:
    ssh-添加/路径/到/我的/aws_ssh_key
  2. 现在ssh到Infinispan主机,ssh添加了ForwardAgent选项:
    ssh -oForwardAgent = 是 \
      ec2-user @ ${InfinispanServerDcX.PublicDnsName}
  3. 从Infinispan主机,您现在可以ssh到Keycloak节点:
    ssh ec2-user @ ${KeycloakServerDcX.PrivateDnsName}

连接到Infinispan JConsole

正如你从跨DC指南,许多DC范围的操作需要在Infinispan JMX MBeans上运行JConsole和调用操作。 例如,要使DC脱机,必须首先禁用从其他DC到即将关闭的DC的备份,这是通过调用离线在CacheManager的操作全球xsiteadminoperationsMBean。

要连接,最容易通过SSH命令创建到Infinispan节点的隧道。 为了简化这种情况,连接到Infinispan服务器并创建隧道的ssh命令显示在输出下第三个堆栈的选项卡SshToInfinispanDcX键,它采用以下形式:

ssh -L 19990:127.0.0.1:9990 \
 -鸵鸟密钥检查 = 否 \
 -oUserKnownHostsFile =/dev/null \
 -oForwardAgent = 是 \
  ec2-user @ ${InfinispanServerDcX.PublicDnsName}

在上面的命令中,主机密钥检查被有效地禁用,因为这只是一次测试运行,在生产中不要这样做!
现在有必要添加一个Infinispan管理用户,以便可以填写JConsole凭据:

/opt/测试/缓存-服务器-infinispan/bin/add-user.sh -u admin -p pwd

最后一件事是运行实际的JConsole。 由于JConsole不支持Infinispan和Keycloak都使用的服务: jmx:remote + http协议,因此有必要修改JConsole classpath。 幸运的是,这项工作已经在WildFly中完成,因此我们可以使用已经在那里准备的脚本。 在你的本地主机,提取野蝇10 + 或Infinispan到路径Wf _ 根,并运行以下命令:

Wf _ 根/bin/jconsole.sh

在新连接窗口中,指定远程进程属性如下 (请注意,我们正在使用通过ssh安全转发到上面的实际管理端口的localhost上的端口19990,这需要上面的ssh命令在使用JConsole的整个时间内运行):
  • 远程进程:服务: jmx: 远程 + http:// localhost:19990
  • 用户名:管理员
  • 密码:pwd



现在,您可以连接到正在运行的实例,导航到所需的任何bean并根据需要执行操作。 备份站点名称由AMI堆栈dc-1dc-2




有关更多详细信息,请检查中的配置文件/opt/测试/身份验证服务器-wildfly/独立/配置/独立-哈-DC。xml/opt/测试/缓存-服务器-infinispan/独立/配置/集群-DC。xml

免责声明

这个博客是在Keycloak 3.4.3的时候写的。最终已经发布。 将来可能会有不兼容的更改,但是您仍然应该能够使用此版本运行模板。

对AWS细节进行故障排除

  • AWS中的Keycloak和Infinispan集群中的节点发现由S3_PING协议处理。 然而,该协议只能在支持版本2签名的区域运行,因为这个JGroups bug。 见亚马逊关于S3端点的文档对于支持版本2签名的区域。 请注意,可能可以使用新的本土 _ s3 _ 平协议,但由于以下原因,该协议尚未合并到Keycloak中这个野蝇问题。 作为一种解决方法,您可能可以使用其他发现协议,例如JDBC_PING。
  • 推荐的跨DC部署数据库产品只有那些在文档中列出(当前为MariaDB提供的Oracle数据库12c RAC和Galera集群)。 可以使用从亚马逊RDS服务。 此博客中的模板仅用于MySQL/MariaDB数据库。
  • 有可能使用亚马逊ALB相关目标群体设置为支持负载平衡器粘性。 ALB使用专有的负载平衡器cookie,并忽略在Keycloak cookie中设置的路由,因此将路由添加到cookie应该在Keycloak配置中禁用