Kubernetes Pod 安全标准(PSA)与准入控制器(Admission Controller)高级配置

好的,各位观众老爷们,欢迎来到今天的 Kubernetes 安全研讨会!我是你们的老朋友,码农界段子手,今天咱们聊聊 Kubernetes Pod 安全标准(PSA)与准入控制器(Admission Controller)的高级配置,保证让你的 Pod 安全得像个装了防盗门的金库!?

开场白:别让你的 Pod 成了“裸奔”选手!

话说 Kubernetes 已经成了云原生时代的“香饽饽”,谁家不用它来管理容器都感觉跟时代脱节了。但是,就像你买了新房需要装修一样,Kubernetes 也需要进行安全加固。否则,你的 Pod 就可能变成“裸奔”选手,随时面临被黑客“扒光”的风险!?

Pod 安全,可不是一句空话,它是 Kubernetes 安全体系的重要组成部分。想象一下,如果你的 Pod 拥有过高的权限,或者缺乏必要的安全策略,那简直就是给黑客开了后门,任他予取予求。

幸运的是,Kubernetes 为我们提供了两把利剑,来守护 Pod 的安全:

  • Pod 安全标准(PSA): 一套预定义的、分层的安全策略,就像给 Pod 穿上了不同等级的“防护服”。
  • 准入控制器(Admission Controller): Kubernetes 的“守门员”,它在 Pod 创建或更新时,会对请求进行拦截和校验,确保 Pod 符合安全策略。

接下来,咱们就来深入了解这两把利剑,看看如何巧妙地运用它们,让你的 Pod 固若金汤!?

第一章:Pod 安全标准(PSA):给 Pod 穿上“防护服”!

PSA,全称 Pod Security Admission,是一套 Kubernetes 官方提供的、基于 Pod 安全策略(Pod Security Policies, PSP)的替代方案。PSP 已经被官方废弃了,所以 PSA 是未来的趋势。

PSA 将 Pod 安全策略分为了三个层级:

安全级别 描述 适用场景 举个栗子
Privileged 权限最高的级别,基本上没有任何限制,允许 Pod 执行任何操作。 适用于 Kubernetes 系统组件、集群级别的基础设施等,需要极高权限的场景。 请慎用! 允许 Pod 挂载 hostPath 卷,允许使用 privileged 模式,允许访问 hostNetwork 等。 相当于给 Pod 穿了一件“皇帝的新衣”,啥也没穿!?
Baseline 权限适中的级别,提供了一定的安全保护,阻止已知的权限提升行为。 适用于大多数应用程序,例如 Web 应用、API 服务等。 禁止使用 privileged 模式,禁止共享 hostNetwork,限制 hostPath 卷的使用等。 相当于给 Pod 穿了一件“防弹背心”,能挡住一些子弹,但不能完全免疫!?️
Restricted 权限最低的级别,提供最严格的安全保护,尽可能地限制 Pod 的权限。 适用于对安全性要求极高的应用程序,例如处理敏感数据的应用、运行在不可信环境中的应用等。 禁止使用 privileged 模式,禁止共享 hostNetwork,禁止使用 hostPath 卷,要求设置用户 ID 和组 ID,限制 capabilities 的使用等。 相当于给 Pod 穿了一件“全封闭式装甲”,安全系数 max! ?

如何给你的 Namespace “贴标签”?

要启用 PSA,你需要给你的 Namespace “贴标签”,告诉 Kubernetes 你希望在这个 Namespace 中应用哪个安全级别。

你可以使用 kubectl label 命令来贴标签:

kubectl label ns <namespace-name> 
  pod-security.kubernetes.io/enforce=<level> 
  pod-security.kubernetes.io/audit=<level> 
  pod-security.kubernetes.io/warn=<level>

其中:

  • <namespace-name>:你的 Namespace 的名称。
  • <level>:你要应用的安全级别,可以是 privilegedbaselinerestricted
  • enforce:强制执行策略,如果 Pod 不符合策略,则拒绝创建或更新。
  • audit:记录违反策略的事件,但允许 Pod 创建或更新。
  • warn:在 Pod 创建或更新时发出警告,但允许 Pod 创建或更新。

举个栗子:

假设你想在名为 my-app 的 Namespace 中强制执行 baseline 安全级别,并记录违反策略的事件,你可以这样做:

kubectl label ns my-app 
  pod-security.kubernetes.io/enforce=baseline 
  pod-security.kubernetes.io/audit=baseline

这样一来,任何尝试在 my-app Namespace 中创建不符合 baseline 安全级别的 Pod 的请求,都会被拒绝,并且会生成审计日志。

第二章:准入控制器(Admission Controller):Kubernetes 的“守门员”!

准入控制器是 Kubernetes 的一个插件,它在 Pod 创建或更新时,会对请求进行拦截和校验。如果请求不符合预定义的策略,准入控制器可以拒绝该请求,从而保证集群的安全。

Kubernetes 提供了多种准入控制器,包括:

  • PodSecurityPolicy: 已经被 PSA 替代。
  • PodSecurity: 基于 PSA 的准入控制器,用于强制执行 PSA 定义的安全级别。
  • ValidatingAdmissionWebhook: 允许你自定义准入策略,通过 Webhook 对请求进行校验。
  • MutatingAdmissionWebhook: 允许你自定义准入策略,通过 Webhook 对请求进行修改。

PodSecurity 准入控制器:PSA 的“执行者”!

PodSecurity 准入控制器是 PSA 的“执行者”,它会读取 Namespace 上的 PSA 标签,并根据标签指定的安全级别,对 Pod 的请求进行校验。

当你给 Namespace 贴上 PSA 标签后,PodSecurity 准入控制器会自动生效,无需额外配置。

ValidatingAdmissionWebhook & MutatingAdmissionWebhook:自定义安全策略的“神器”!

如果 PSA 提供的安全级别无法满足你的需求,你可以使用 ValidatingAdmissionWebhook 和 MutatingAdmissionWebhook 来自定义准入策略。

  • ValidatingAdmissionWebhook: 用于对请求进行校验,如果请求不符合策略,则拒绝该请求。
  • MutatingAdmissionWebhook: 用于对请求进行修改,例如添加默认标签、设置资源限制等。

要使用 Webhook,你需要:

  1. 创建一个 Webhook 服务: 该服务负责接收 Kubernetes 发送的请求,并根据你的自定义策略进行处理。
  2. 配置 AdmissionConfiguration: 告诉 Kubernetes 你的 Webhook 服务的地址,以及需要拦截的资源类型和操作。

举个栗子:

假设你想创建一个 ValidatingAdmissionWebhook,用于禁止在 Namespace 中创建没有标签的 Pod。

  1. 创建 Webhook 服务:

你可以使用任何编程语言来创建 Webhook 服务,例如 Go、Python、Java 等。该服务需要实现 Kubernetes 要求的 Webhook 接口,接收 AdmissionReview 对象,并返回 AdmissionResponse 对象。

以下是一个简单的 Python Webhook 服务的示例:

from flask import Flask, request, jsonify
import json

app = Flask(__name__)

@app.route('/', methods=['POST'])
def webhook():
    req = request.get_json()
    print(f"Received request: {json.dumps(req)}")

    # 检查 Pod 是否有标签
    if 'object' in req['request'] and 'metadata' in req['request']['object'] and 'labels' not in req['request']['object']['metadata']:
        response = {
            "apiVersion": "admission.k8s.io/v1",
            "kind": "AdmissionReview",
            "response": {
                "uid": req['request']['uid'],
                "allowed": False,
                "status": {
                    "code": 403,
                    "message": "Pod must have at least one label."
                }
            }
        }
    else:
        response = {
            "apiVersion": "admission.k8s.io/v1",
            "kind": "AdmissionReview",
            "response": {
                "uid": req['request']['uid'],
                "allowed": True
            }
        }

    print(f"Sending response: {json.dumps(response)}")
    return jsonify(response)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=443, debug=True, ssl_context=('cert.pem', 'key.pem'))

这个 Webhook 服务会检查 Pod 的 metadata 中是否包含 labels 字段。如果没有,则拒绝该请求,并返回一个错误消息。

  1. 配置 AdmissionConfiguration:

你需要创建一个 AdmissionConfiguration 对象,告诉 Kubernetes 你的 Webhook 服务的地址,以及需要拦截的资源类型和操作。

以下是一个 AdmissionConfiguration 对象的示例:

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: pod-label-required
webhooks:
  - name: pod-label-required.example.com
    clientConfig:
      url: "https://<your-webhook-service-address>" # 替换为你的 Webhook 服务地址
      caBundle: "<your-ca-bundle>" # 替换为你的 CA 证书
    rules:
      - apiGroups:   [""]
        apiVersions: ["v1"]
        operations:  ["CREATE"]
        resources:   ["pods"]
    scope: Namespaced
    admissionReviewVersions: ["v1", "v1beta1"]
    sideEffects: None
    timeoutSeconds: 10

这个 AdmissionConfiguration 对象会拦截所有在 Namespace 中创建 Pod 的请求,并将请求发送到你的 Webhook 服务进行校验。

第三章:高级配置技巧:让你的安全策略更上一层楼!

除了基本的 PSA 和准入控制器配置,还有一些高级技巧可以帮助你更好地管理 Pod 安全:

  • 使用 OPA Gatekeeper: OPA Gatekeeper 是一个云原生的策略引擎,可以让你使用声明式的 Policy as Code (PaC) 方式来定义和管理 Kubernetes 策略。它与 ValidatingAdmissionWebhook 集成,可以提供更灵活、更强大的策略管理能力。
  • 使用 Kyverno: Kyverno 是另一个云原生的策略引擎,它也与 ValidatingAdmissionWebhook 和 MutatingAdmissionWebhook 集成,可以让你使用 Kubernetes 原生的 YAML 语法来定义和管理策略。
  • 结合 RBAC: 使用 RBAC(Role-Based Access Control)来限制用户和 Service Account 的权限,防止恶意用户或 Service Account 绕过安全策略。
  • 定期审查安全策略: 定期审查你的安全策略,确保它们仍然有效,并根据需要进行调整。

总结:安全无小事,防患于未然!

Pod 安全是 Kubernetes 安全体系的重要组成部分,它直接关系到你的应用程序和数据的安全。通过合理地配置 PSA 和准入控制器,你可以有效地保护你的 Pod 免受攻击。

记住,安全无小事,防患于未然!不要等到出了问题才后悔莫及。

希望今天的研讨会对你有所帮助!如果你有任何问题,欢迎在评论区留言。咱们下期再见! ?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注