阿里云容器服务Kubernetes版ACK和阿里云服务网格ASM提供的多云混合云方案具有统一的集群管理,动态弹性和服务治理能力。在注册外部Kubernetes集群时,ACK Register Agent组件提供了多集群的管理能力,同时提供了在外部集群上应用的部署和生命周期管理能力。本文主要介绍ACK和ASM服务在实现多云混合云方案中进行外部集群注册和管理过程中的最佳安全实践。

组件说明

组件名称 组件功能
ACK Console ACK容器服务管理控制台。
ACK Register Agent ACK集群注册Agent,以deployment形式部署在指定外部集群中,用于接收ACK集群注册代理组件的请求并转发给对应的K8s API Server,同时接收K8s API Server的返回并发送给ACK集群注册代理组件。
ACK Stub ACK集群注册代理组件,部署在容器服务管控侧,每一个注册外部集群都会部署一个与之对应的Stub代理组件,用于代理转发ACK管控组件和指定外部集群中注册Agent组件之间的请求。
K8s API Server 注册集群中运行的K8s API Server组件。

连接架构

通过ACK Stub和ACK Register Agent组件,可以将您在ACK控制台上的请求下发到指定的外部集群API server,其中Register Agent组件会以Deployment双实例的形式部署在指定的外部集群中,并且和ACK管控平台中的Stub代理组件连通。Agent组件通过下图中的流程将请求发送到您指定的API server。连接架构

当用户完成外部集群注册流程后,ACK Register Agent组件会完成部署并与ACK管控侧建立TLS 1.2的长链接。对于已授权用户或授权后的ACK管控服务,ACK Console组件通过链路向指定的外部集群发送请求,请求会首先发送到Stub代理组件,然后请求被转发到对应的Agent,并最终由Agent组件将请求发送到外部API server。API server在收到请求后,会经过认证(Authentication)、鉴权(Authorization)和准入控制(Admission control)流程,在完成审计后返回请求。请求返回的路径同样经由Agent,Stub代理组件并最终返回给ACK管控服务。所有请求在链路上都经过了认证鉴权流程,保证了集群访问的安全可控。

组件访问安全

架构所有组件之间的访问均需要经过认证授权,所有访问目标都是经过安全校验后的合法对象,保证数据只在可信的对象之间传输。组件访问认证架构

在认证上,访问组件之间通过RAM账号的登录认证和组件之间的双向TLS认证,保证所有访问链接数据在传输过程中的TLS加密。而鉴权采用基于阿里云RAM服务的访问控制和x509证书校验中的白名单机制。

请求链路安全

在多云混合云管理请求链路上的所有访问凭证均包含了请求者的身份信息,包括用户使用阿里云容器服务下发的访问凭证和容器服务内部组件访问凭证,以保证所有发送到外部集群API server的请求都能够经过鉴权和审计处理。

终端用户请求链路
所有终端用户的请求都需要使用ACK管控签发的带有用户身份的集群访问凭证,对于外部集群的访问流程如下图所示。终端用户请求链路

在阿里云平台侧,集群的管理人员可以通过RAM访问控制策略配置指定终端用户对外部集群的控制权限。经过RAM鉴权的用户可以在容器服务控制台获取指定外部集群的访问凭证,该访问凭证会作为认证凭据在Stub和Agent组件处认证,且组件间所有的访问链路都经过TLS加密。在Agent组件完成认证后,会将用户访问凭证中的身份信息作为请求目标API server的身份扮演header,在API server中会根据接收到的用户身份完成认证,鉴权和请求审计等操作。

服务组件请求链路
ACK和ASM服务内部组件访问外部API server的请求链路与终端用户访问链路类似,首先管控组件会使用集群注册时下发的Agent组件访问证书发起请求,在Stub和Agent组件完成请求认证后,经由Agent以身份扮演的方式向目标API server作7层代理转发,最终在API server完成请求的RBAC鉴权和审计。整个请求链路均经过了加密保证数据传输的安全性。服务组件请求链路

集群内部安全

Agent组件请求在目标集群API server中的请求流程如下图所示。Agent请求
在集群API server内部,首先会在认证阶段校验请求凭据的合法性。
  • 如果请求凭据不是一个合法的凭据,则API server会直接返回401的认证失败错误。
  • 如果认证通过,API server会查看请求是否有指定格式的身份扮演header,如果存在的话会以指定的身份扮演身份去进行下一段的鉴权流程。
在鉴权流程中,API server会判断传入的用户身份是否有对目标资源的指定操作权限。
  • 如果鉴权失败,则API server返回403的鉴权失败错误。
  • 如果鉴权成功,则经过审计流程后返回请求结果。

Agent组件是Go语言编写的代理转发和集群注册组件,代码的编写和发布均经过了阿里云相关团队的安全审核。与此同时,指定集群的管理员也需要根据Kubernetes相关的最佳安全实践规范保护集群节点的安全性,通过对基础设施和应用相关的安全配置保障Agent组件和集群的安全性。