本页面介绍 GKE On-Prem(包括其基础架构的每一层)包含的安全功能,以及如何配置这些安全功能来满足您的需求。
概览
GKE On-Prem 提供了多项功能来帮助保护工作负载,包括容器映像的内容、容器运行时、集群网络以及对集群 API 服务器的访问权限。
最好采用分层方法来保护集群和工作负载。您可以针对提供给用户及工作负载的访问权限级别应用最小权限原则。您可能需要权衡取舍,以提供适当级别的灵活性和安全性。
身份验证和授权
您使用 OpenID Connect (OIDC)(通过 kubectl
)或 Kubernetes 服务帐号令牌(通过 Cloud Console)向 GKE On-Prem 集群进行身份验证。
如需在集群级层或 Kubernetes 命名空间内配置对 Kubernetes 资源的更精细的访问权限,您可以使用 Kubernetes 基于角色的访问控制 (RBAC)。通过 RBAC,您可以创建详细的政策来定义允许用户和服务帐号访问哪些操作和资源。您可以使用 RBAC 来控制所提供的任何已验证身份的访问权限。
为了进一步简化和精简 Kubernetes Engine 的身份验证和授权策略,GKE On-Prem 停用了旧版基于特性的访问权限控制 (ABAC)。
控制平面安全
控制层面组件包括 Kubernetes API 服务器、调度程序、控制器和保存 Kubernetes 配置 etcd 数据库。在 Kubernetes Engine 中,Kubernetes 控制层面组件由 Google 管理和维护,而本地管理员在 GKE On-Prem 中管理控制层面组件。
在 GKE On-Prem 中,控制层面组件在公司网络中运行。您可以使用现有的公司网络政策和防火墙来保护 GKE On-Prem 的 API 服务器。您还可以为 API 服务器分配专用 IP 地址,并限制对该专用地址的访问。
GKE On-Prem 中的所有通信都通过 TLS 通道进行,这些通道受三个证书授权机构 (CA) 的约束:etcd、cluster 和 org:
- etcd CA 可保护从 API 服务器到 etcd 副本之间的通信,以及 etcd 副本之间的流量。此 CA 是自签名的。
- 集群 CA 可保护 API 服务器与所有内部 Kubernete API 客户端(kubelet、控制器、调度程序)之间的通信。此 CA 是自签名的。
- 组织 CA 是一个外部 CA,用于向外部用户提供 Kubernetes API。您负责管理此 CA。
对于管理员控制层面,密钥存储在控制层面节点上。对于用户集群,密钥以 Kubernetes Secret 形式存储在管理员控制层面中。API 服务器使用由组织 CA 签名的用户提供的证书进行配置。API 服务器使用服务器名称指示 (SNI) 来确定是使用由集群 CA 签名的密钥,还是使用由组织 CA 签名的密钥。
GKE On-Prem 中的集群身份验证由证书和服务帐号不记名令牌处理。作为管理员,您可以使用 OIDC 或管理证书向控制层面进行身份验证;其中管理证书用于初始角色绑定创建或用于紧急用途。
证书轮替的处理方式如下:
- 对于 API 服务器、控制层面和节点,证书会在每次升级时创建或轮替。
- CA 很少进行轮替或按需轮替。
节点安全
GKE On-Prem 将您的工作负载部署在 VMware 实例中,这些实例以节点形式关联到集群。以下各个部分介绍如何利用 GKE On-Prem 中提供给您的节点级层安全功能。
Ubuntu
GKE On-Prem 使用优化版 Ubuntu 作为运行 Kubernetes 控制层面和节点的操作系统。Ubuntu 包含一组丰富的现代安全功能,GKE On-Prem 为集群实现了几项安全增强功能,包括:
- 优化的软件包集。
- Google Cloud 定制的 Linux 内核。
- 可选的自动操作系统安全更新。
- 受限用户帐号和停用 root 登录。
其他适用于 Ubuntu 的安全指南,例如:
节点升级
您应该定期升级节点。容器运行时、Kubernetes 本身或节点操作系统中的安全问题可能会不时地要求您升级节点,而且更加迫切。升级集群时,每个节点的软件会升级到最新版本。
保护工作负载
Kubernetes 允许用户快速预配、扩缩和更新基于容器的工作负载。本部分介绍可供管理员和用户使用的一些方法,这些方法旨在限制运行中的容器影响集群中的其他容器、运行它们的主机以及在其项目中启用的 GCP 服务的能力。
限制 Pod 容器进程权限
限制容器化进程的权限对于集群的总体安全性十分重要。Kubernetes Engine 允许您通过安全上下文对 pod 和容器设置安全相关选项。通过这些设置,您可以更改进程的安全设置,例如:
- 以其身份运行的用户和组。
- 可用的 Linux 功能。
- 提升权限。
Ubuntu 是默认的 GKE On-Prem 节点操作系统,它会针对 Kubernetes 启动的所有容器应用默认的 Docker AppArmor 安全政策。您可以在 GitHub 上查看配置文件的模板。配置文件有诸多限制,包括拒绝向容器提供以下能力:
- 直接写入进程 ID 目录 (/proc/) 中的文件。
- 写入 /proc/ 之外的文件。
- 写入 /proc/sys 中的文件(/proc/sys/kernel/shm* 除外)。
- 装载文件系统。
审核日志记录
通过 Kubernetes 审核日志记录,管理员可对 GKE On-Prem 环境中发生的事件执行保留、查询、处理和提醒操作。管理员可以使用日志中记录的信息执行取证分析、实时提醒,或者对一组 Kubernetes Engine 集群的使用方式和用户进行编目。
默认情况下,GKE On-Prem 会记录管理员活动。您还可以选择记录数据访问事件,具体取决于您有兴趣检查的操作类型。
Connect Agent 仅与在本地运行的本地 API 服务器通信,并且每个集群都应有自己的一组审核日志。用户通过 Connect 在界面中执行的所有操作均由该集群记录。
加密
Google Cloud Key Management Service (Cloud KMS) 是一项云托管密钥管理服务,可管理服务的加密密钥。您可以生成、使用、轮替和销毁 AES256、RSA 2048、RSA 3072、RSA 4096、EC P256 和 EC P384 加密密钥。Cloud KMS 已与 Cloud IAM 和 Cloud Audit Logging 集成,因而您可以分别管理各个密钥的权限,并监控它们的使用方式。使用 Cloud KMS 保护您需要存储的 Secret 和其他敏感数据。
如果您的 GKE On-Prem 和工作负载通过 Cloud VPN 安全地连接到 Google Cloud 服务,您可以使用 Cloud KMS 进行密钥管理。否则,您可以选择使用下述替代方法之一:
- Kubernetes Secret
- Hashicorp Vault
- 硬件安全模块 (HSM)
Kubernetes Secret
Kubernetes Secret 资源会存储集群中的密码、OAuth 令牌和 SSH 密钥等敏感数据。将敏感数据存储在 Secret 中比存储在明文 ConfigMap 或 pod 规范中更加安全。借助 Secret,您可以控制敏感数据的使用方式,并降低将该数据暴露给未经授权用户的风险。