mcpField
I
implementing-pod-security-admission-controller

implementing-pod-security-admission-controller

github.com/mukul975安全35.2k52 次安装8 周前更新
代码仓库

关于 implementing-pod-security-admission-controller

面向 Kubernetes 管理员的安全技能,用于配置或排查 Pod Security Admission(PSA)。内容涵盖命名空间策略、集群默认值、豁免、测试、监控及从 PodSecurityPolicy 迁移。

主要功能

  1. 01配置命名空间 PSA 标签
  2. 02设置集群级准入默认值
  3. 03管理命名空间和账户豁免
  4. 04通过服务端 dry-run 测试策略
  5. 05监控 PSA 违规情况
  6. 06从 PodSecurityPolicy 迁移

适用场景

  1. 01在 Kubernetes 集群中部署 PSA
  2. 02先以 audit 和 warn 模式分阶段实施
  3. 03排查 Pod 被拒或策略未生效
  4. 04从 PodSecurityPolicy 迁移到 PSA

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill implementing-pod-security-admission-controller

安装后在 Claude Code 中输入/implementing-pod-security-admission-controller确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.py

详细介绍

实施 Pod 安全准入控制器

概述

Pod 安全准入(PSA)是一个内置的 Kubernetes 准入控制器(自 v1.25 起稳定),用于在命名空间级别执行 Pod 安全标准。它取代了已弃用的 PodSecurityPolicy(PSP),并提供三种安全配置文件:Privileged、Baseline 和 Restricted,以及三种执行模式:enforce、audit 和 warn。

何时使用

  • 首次在集群上配置 PSA
  • 通过 AdmissionConfiguration 设置集群范围的默认执行策略
  • 将系统命名空间、服务账号或运行时类豁免于执行之外
  • 调试为什么某个 Pod 被拒绝,或者为什么执行静默地没有触发
  • 分阶段安全推行:先 warn 和 audit,当违规降为零后再 enforce
  • 从 kube-apiserver 审计日志中提取 PSA 违规记录

不适用于此技能: 决定某个工作负载应在哪个配置文件下运行,或者 Restricted 要求哪些 securityContext 变更。请使用 implementing-kubernetes-pod-security-standards。

前提条件

  • Kubernetes v1.25+(PSA 已稳定/GA)
  • 具有 cluster-admin 访问权限的 kubectl
  • 不依赖外部工具 - PSA 内置于 kube-apiserver

Pod 安全标准

Privileged 配置文件
  • 不受限制 - 不施加任何限制
  • 使用场景:系统级 Pod(kube-system、monitoring)
Baseline 配置文件
  • 最低限度限制 - 防止已知的权限提升
  • 阻止:特权容器、hostPID、hostIPC、hostNetwork、hostPorts、某些卷类型、添加超出运行时默认值的 capabilities
Restricted 配置文件
  • 严格限制 - 遵循安全最佳实践
  • 要求:非 root、丢弃所有 capabilities、seccomp RuntimeDefault、只读根文件系统考量
  • 阻止:Baseline 中的所有内容,外加以 root 运行、权限提升、未经批准的卷类型

执行模式

模式行为使用场景
enforce拒绝违反策略的 Pod生产环境执行
audit将违规记录到审计日志执行前评估
warn向用户显示警告开发者反馈

实施

通过标签应用到命名空间
# Restricted enforcement with audit and warn
apiVersion: v1
kind: Namespace
metadata:
  name: production
  labels:
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/enforce-version: v1.28
    pod-security.kubernetes.io/audit: restricted
    pod-security.kubernetes.io/audit-version: v1.28
    pod-security.kubernetes.io/warn: restricted
    pod-security.kubernetes.io/warn-version: v1.28
# Baseline enforcement for staging
apiVersion: v1
kind: Namespace
metadata:
  name: staging
  labels:
    pod-security.kubernetes.io/enforce: baseline
    pod-security.kubernetes.io/enforce-version: v1.28
    pod-security.kubernetes.io/audit: restricted
    pod-security.kubernetes.io/audit-version: v1.28
    pod-security.kubernetes.io/warn: restricted
    pod-security.kubernetes.io/warn-version: v1.28
# Privileged for system namespaces
apiVersion: v1
kind: Namespace
metadata:
  name: kube-system
  labels:
    pod-security.kubernetes.io/enforce: privileged
使用 kubectl 应用标签
# Set restricted enforcement
kubectl label namespace production \
  pod-security.kubernetes.io/enforce=restricted \
  pod-security.kubernetes.io/enforce-version=v1.28 \
  pod-security.kubernetes.io/audit=restricted \
  pod-security.kubernetes.io/warn=restricted

# Set baseline enforcement
kubectl label namespace staging \
  pod-security.kubernetes.io/enforce=baseline \
  pod-security.kubernetes.io/audit=restricted \
  pod-security.kubernetes.io/warn=restricted

# Check current labels
kubectl get namespace production -o jsonpath='{.metadata.labels}' | jq .

试运行测试

# Test what would happen with restricted policy on a namespace
kubectl label --dry-run=server --overwrite namespace staging \
  pod-security.kubernetes.io/enforce=restricted

# Output shows existing pods that would violate the policy
# Warning: existing pods in namespace "staging" violate the new PodSecurity enforce level "restricted:latest"

集群范围默认值(AdmissionConfiguration)

# /etc/kubernetes/psa-config.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
  - name: PodSecurity
    configuration:
      apiVersion: pod-security.admission.config.k8s.io/v1
      kind: PodSecurityConfiguration
      defaults:
        enforce: baseline
        enforce-version: latest
        audit: restricted
        audit-version: latest
        warn: restricted
        warn-version: latest
      exemptions:
        usernames: []
        runtimeClasses: []
        namespaces:
          - kube-system
          - kube-public
          - kube-node-lease
          - calico-system
          - gatekeeper-system
          - monitoring
          - falco
应用到 API 服务器
# Add to kube-apiserver manifests
# /etc/kubernetes/manifests/kube-apiserver.yaml
spec:
  containers:
  - command:
    - kube-apiserver
    - --admission-control-config-file=/etc/kubernetes/psa-config.yaml
    volumeMounts:
    - name: psa-config
      mountPath: /etc/kubernetes/psa-config.yaml
      readOnly: true
  volumes:
  - name: psa-config
    hostPath:
      path: /etc/kubernetes/psa-config.yaml
      type: File

合规 Pod 示例

符合 Restricted 的 Pod
apiVersion: v1
kind: Pod
metadata:
  name: restricted-pod
  namespace: production
spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
    seccompProfile:
      type: RuntimeDefault
  automountServiceAccountToken: false
  containers:
    - name: app
      image: myregistry/myapp:v1.0.0
      securityContext:
        allowPrivilegeEscalation: false
        readOnlyRootFilesystem: true
        capabilities:
          drop:
            - ALL
      resources:
        limits:
          cpu: 500m
          memory: 256Mi
        requests:
          cpu: 100m
          memory: 128Mi
      volumeMounts:
        - name: tmp
          mountPath: /tmp
  volumes:
    - name: tmp
      emptyDir: {}
符合 Baseline 的 Pod
apiVersion: v1
kind: Pod
metadata:
  name: baseline-pod
  namespace: staging
spec:
  containers:
    - name: app
      image: myregistry/myapp:v1.0.0
      securityContext:
        allowPrivilegeEscalation: false
      resources:
        limits:
          cpu: 500m
          memory: 256Mi

从 PodSecurityPolicy 迁移

步骤 1:审计当前状态
# Check existing PSPs
kubectl get psp

# Check which service accounts use which PSP
kubectl get clusterrolebinding -o json | \
  jq '.items[] | select(.roleRef.name | startswith("psp-")) | {name: .metadata.name, subjects: .subjects}'
步骤 2:将 PSP 映射到 PSA 配置文件
# For each namespace, determine required PSA level
for ns in $(kubectl get ns -o jsonpath='{.items[*].metadata.name}'); do
  echo "Namespace: $ns"
  kubectl label --dry-run=server namespace $ns \
    pod-security.kubernetes.io/enforce=restricted 2>&1 | head -5
done
步骤 3:应用 PSA 标签(先审计)
# Start with audit mode
kubectl label namespace production \
  pod-security.kubernetes.io/audit=restricted \
  pod-security.kubernetes.io/warn=restricted
步骤 4:审查并修复违规
# Check audit logs for violations
kubectl get events --field-selector reason=FailedCreate -A
步骤 5:启用执行
kubectl label namespace production \
  pod-security.kubernetes.io/enforce=restricted

监控

# Check PSA violations in events
kubectl get events --all-namespaces --field-selector reason=FailedCreate

# Check audit logs
kubectl logs -n kube-system kube-apiserver-* | grep "pod-security.kubernetes.io"

# List namespace PSA labels
kubectl get namespaces -L pod-security.kubernetes.io/enforce

最佳实践

  1. 从 audit+warn 开始,在执行之前先评估影响
  2. 使用试运行在应用之前测试执行效果
  3. 在集群默认值中豁免系统命名空间(kube-system、monitoring)
  4. 固定版本(enforce-version),以便跨升级获得可预测的行为
  5. 设置集群范围的基线作为默认值,然后限制特定命名空间
  6. 结合 Gatekeeper 实现 PSA 之外的额外自定义策略
  7. 对所有生产工作负载使用 restricted 配置文件
  8. 记录豁免并附上明确的理由

评论

支持 Markdown