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 免受攻击。

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

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

发表回复

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