【容器云】Kubernetes API 访问安全加固(3)
2. 保护对 Kubernetes 控制平面(API 服务器)的访问
Kubernetes 中的 API 访问控制是一个三步过程。 首先,对请求进行身份验证,然后检查请求的有效授权,然后执行请求准入控制,最后授予访问权限。 但在身份验证过程开始之前,确保正确配置网络访问控制和 TLS 连接应该是第一要务。
2.2 Kubernetes API 用户账号管理最佳实践
Kubernetes 中的控制平面(核心容器编排层)公开了几个 API 和接口来定义、部署和管理容器的生命周期。该 API 以 HTTP REST API 的形式公开,并且可以被任何与 HTTP 兼容的客户端库访问。 Kubectl 是一个 CLI 工具,是访问这些 API 的默认和首选方式。但是谁访问这些 API?通常是用户、普通用户和服务帐户 (ServiceAccount)。
管理普通用户帐户
管理员应考虑使用公司 IAM 解决方案(AD、Okta、G Suite OneLogin 等)配置和管理普通用户帐户。这样,管理普通用户账户生命周期的安全性可以按照现有的公司 IAM 策略强制执行。它还有助于将与普通用户帐户相关的风险与 Kubernetes 完全隔离。
管理服务帐号
由于服务帐户绑定到特定的命名空间并用于实现特定的 Kubernetes 管理目的,因此应仔细并及时地对其进行安全审核。
您可以按如下方式检查可用的服务帐户:
$ kubectl get serviceaccounts NAME SECRETS AGE default 1 89m
服务帐户对象的详细信息可以查看为:
$ kubectl get serviceaccounts/default -o yaml apiVersion: v1 kind: ServiceAccount metadata: creationTimestamp: "2021-07-21T15:16:33Z" name: default namespace: default resourceVersion: "418" uid: 702c6c93-f4de-4068-ab37-ce36e37277a8 secrets: - name: default-token-zr9tk
要查看与服务帐户关联的秘密(如果您想检查秘密创建时间以轮换旧秘密),您可以使用 get secret 命令:
$ kubectl get secret default-token-zr9tk -o yaml apiVersion: v1 data: ca.crt: LS0tLS1CRUxxx== namespace: ZGVmYXVsdA== token: ZXlKaGJHY2lPaUxxx= kind: Secret metadata: annotations: kubernetes.io/service-account.name: testserviceaccount kubernetes.io/service-account.uid: 3e98a9b7-a2f5-4ea6-9e02-3fbee11f2439 creationTimestamp: "2021-07-21T18:03:44Z" name: testserviceaccount-token-mtkv7 namespace: default resourceVersion: "7500" uid: 2b1da08b-2ff7-40f5-9e90-5848ce0475ca type: kubernetes.io/service-account-token
提示:在紧急情况下,如果您想在不删除服务帐户本身的情况下阻止服务帐户访问,您可以使用 delete secret 命令使帐户凭据无效,如下所示:
$ kubectl delete secret testserviceaccount-token-mtkv7
此外,不鼓励使用默认服务帐户,而应为每个应用程序使用专用服务帐户。 这种做法允许按照每个应用程序的要求实施最低权限策略。 但是,如果两个或更多应用程序需要类似的权限集,建议重用现有服务帐户(而不是创建新服务帐户),因为过多的帐户也会产生足够的复杂性。 我们知道复杂性是安全的邪恶双胞胎!
在 Kubernetes 中,并非所有 pod 都需要 Kubernetes API 访问权限。 但是,如果没有指定特定的服务帐户,默认服务帐户令牌会自动挂载到新的 pod 中,因此它可能会创建不必要的攻击面,因此可以在创建新 pod 时禁用,如下所示:
apiVersion: v1 kind: ServiceAccount automountServiceAccountToken: false
提示:为 kube-apiserver 配置 --service-account-key-file 标志和为 kube-controller-manager 配置 --service-account-private-key-file 标志,以便使用专用的 x509 证书或密钥对签署并验证 ServiceAccount 令牌。否则,Kubernetes 使用 TLS 私钥签署和验证 ServiceAccount 令牌,该密钥与用于配置 API 服务器 TLS 连接(--tls-private-key-file)的密钥相同。如果令牌被泄露,并且您需要轮换令牌,您还需要轮换主 TLS 证书,这可能在操作上存在问题。
原文:https://goteleport.com/blog/kubernetes-api-access-security/
- 15 次浏览