适用于:在 Windows Server 上运行的 AKS
Windows Server 上的 AKS 使用证书和基于令牌的身份验证的组合来保护负责平台内不同作的服务(或代理)之间的通信。 基于证书的身份验证在授予对资源的访问权限之前使用数字证书来识别实体(代理、计算机、用户或设备)。
云代理
在 Windows Server 上部署 AKS 时,AKS 会安装用于在群集中执行各种功能的代理。 这些代理包括:
- 云代理:负责基础平台业务流程的服务。
- 节点代理:驻留在每个节点上的服务,执行虚拟机创建、删除等实际工作。
- 密钥管理系统 (KMS) Pod:负责密钥管理的服务。
- 其他服务:云操作员、证书管理器等。
AKS 中的云代理服务负责协调基础结构组件的创建、读取、更新和删除(CRUD)操作,例如虚拟机(VM)、虚拟网络接口(VNIC)和群集中的虚拟网络(VNET)。
若要与云代理进行通信,客户端需要预配证书以保护此通信。 每个客户端都需要一个与之关联的标识,该标识定义了与客户端关联的基于角色的访问控制 (RBAC) 规则。 每个标识由两个实体组成:
- 一个令牌,用于初始身份验证,这会返回一个证书
- 从上述登录过程中获得的证书,用于任何通信中的身份验证。
每个实体具有特定的有效期(默认为 90 天),在此期限结束时,该实体将会过期。 若要继续访问云代理,每个客户端需要续订证书并轮换令牌。
证书类型
Windows Server 上的 AKS 中使用了两种类型的证书:
- 云代理 CA 证书:用于对客户端证书进行签名/验证的证书。 此证书有效期为 365 天(1 年)。
- 客户端证书:由云代理 CA 证书颁发的证书,供客户端向云代理进行身份验证。 这些证书通常有效期为 90 天。
Microsoft 建议在新版本发布后 60 天内更新群集,这不仅是为了确保内部证书和令牌保持最新,而且是为了确保你能够访问新功能、bug 修复,并随时了解关键安全修补程序。 在这些每月更新期间,更新过程会轮换群集正常运行期间无法自动轮换的任何令牌。 证书和令牌的有效性重置为默认值,自群集更新之日起 90 天。
在 Windows Server 上使用 AKS 中的证书确保通信安全
证书用于在群集内组件之间建立安全通信。 AKS 为 Kubernetes 内置组件提供零接触的现成证书预配和管理。 本文介绍如何在 Windows Server 上的 AKS 中预配和管理证书。
证书和 CA
AKS 生成并使用以下证书颁发机构(CA)和证书。
群集 CA
- API 服务器具有群集 CA,用于对证书进行从 API 服务器到
kubelet
的单向通信签名。 - 每个
kubelet
还会创建一个证书签名请求(CSR),该请求由群集 CA 签名,以便从kubelet
到 API 服务器的通信。 - etcd 密钥值存储具有群集 CA 签名的证书,用于从 etcd 与 API 服务器通信。
etcd CA
etcd 密钥值存储具有 etcd CA,用于对证书进行签名,以便在群集中的 etcd 副本之间进行身份验证和授权数据复制。
前端代理 CA
Front Proxy CA 保护 API 服务器与扩展 API 服务器之间的通信。
证书预配
使用 kubelet
为 预配证书。 对于所有其他证书,请使用基于 YAML 的密钥和证书创建。
- 证书存储在 /etc/kubernetes/pki 中。
- 密钥为 RSA 4096、EcdsaCurve:P384
注意
根证书有效期为 10 年。 所有其他非根证书的生存期较短且有效期为四天。
证书续订和管理
非根证书会自动续订。 除以下证书外,Kubernetes 的所有控制平面证书均会被托管:
- Kubelet 服务器证书
- Kubeconfig 客户端证书
作为安全最佳做法,应使用 Active Directory 单一登录 进行用户身份验证。
证书吊销
证书吊销应很少见,应在证书续订时完成。
获得要吊销的证书序列号后,请使用 Kubernetes 自定义资源来定义和保留吊销信息。 每个吊销对象可以包含一个或多个吊销条目。
要执行撤销操作,请使用以下方法之一:
- 序列号
- 组
- DNS 名称
- IP 地址
可以指定一 notBefore
个时间,以仅撤销在特定时间戳之前颁发的证书。 如果未指定 notBefore
时间,则所有与撤销匹配的现有和未来证书都将被撤销。
注意
目前还不能撤销 kubelet
服务器证书。
如果在执行吊销时使用序列号,可以使用如下所示的 Repair-AksHciClusterCerts
PowerShell 命令将群集进入工作状态。 如果使用前面列出的其他任何字段,请确保指定 notBefore
时间。
apiVersion: certificates.microsoft.com/v1
kind: RenewRevocation
metadata:
name: my-renew-revocation
namespace: kube-system
spec:
description: My list of renew revocations
revocations:
- description: Revoked certificates by serial number
kind: serialnumber
notBefore: "2020-04-17T17:22:05Z"
serialNumber: 77fdf4b1033b387aaace6ce1c18710c2
- description: Revoked certificates by group
group: system:nodes
kind: Group
- description: Revoked certificates by DNS
dns: kubernetes.default.svc.
kind: DNS
- description: Revoked certificates by DNS Suffix
dns: .cluster.local
kind: DNS
- description: Revoked certificates by IP
ip: 170.63.128.124
kind: IP