跳转到主要内容
Chinese, Simplified

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/

本文:https://jiagoushi.pro/node/1847

Tags
 
Article
知识星球
 
微信公众号
 
视频号