The interface is localized. Skill descriptions and documents are machine-translated by AI into your language; code, commands, paths and technical terms stay in the original, and the author's document governs.
Explore skills
DevOps · SKILL.md

scanning-kubernetes-manifests-with-kubesec

scanning-kubernetes-manifests-with-kubesec

使用 Kubesec 对 Kubernetes 资源清单执行安全风险分析,识别错误配置、权限提升风险以及与安全最佳实践的偏差。

Independent GitHub snapshot · Automated classification · Original documentation governs

Skill documentation

GitHub

name: scanning-kubernetes-manifests-with-kubesec description: 使用 Kubesec 对 Kubernetes 资源清单执行安全风险分析,识别错误配置、权限提升风险以及与安全最佳实践的偏差。 domain: cybersecurity subdomain: container-security tags: [kubesec, kubernetes, manifest-scanning, security-scanning, devsecops, misconfiguration, static-analysis, ci-cd] version: "1.0" author: mahipal license: Apache-2.0

使用 Kubesec 扫描 Kubernetes 清单

概述

Kubesec 是由 ControlPlane 开发的开源安全风险分析工具,用于检查 Kubernetes 资源清单中常见的可利用风险,如权限提升(Privilege Escalation)、可写宿主机挂载和过多能力赋予。它为每个资源分配数值安全评分,并提供可操作的加固建议。Kubesec 可作为 CLI 二进制、Docker 容器、kubectl 插件、准入 Webhook 或 REST API 端点使用。

前置条件

  • Kubernetes 清单文件(YAML/JSON),适用于 Deployment、Pod、DaemonSet、StatefulSet
  • 本地安装需要 Docker 或 Go 运行时
  • kubectl 访问权限(用于扫描集群中的实时资源)
  • CI/CD 流水线访问权限(用于自动化扫描集成)

核心概念

安全评分系统

Kubesec 根据安全检查为每个 Kubernetes 资源分配评分:

  • 正分:对安全增强配置的奖励(readOnlyRootFilesystem、runAsNonRoot)
  • 零分或负分:表示缺少安全控制或存在危险配置
  • 关键建议(Critical advisories):标记代表即时安全风险的配置

检查类别

  1. 特权控制:检查特权容器、宿主机 PID/网络访问、root 执行
  2. 能力(Capabilities):识别过多的 Linux 能力(SYS_ADMIN、NET_RAW)
  3. 卷挂载:检测危险的宿主机路径挂载和可写的敏感路径
  4. 资源限制:验证 CPU/内存资源限制的存在
  5. 安全上下文:验证 seccomp 配置文件、AppArmor 注解、SELinux 上下文

安装

二进制安装

# Linux/macOS
curl -sSL https://github.com/controlplaneio/kubesec/releases/latest/download/kubesec_linux_amd64.tar.gz | \
  tar xz -C /usr/local/bin/ kubesec

# 验证安装
kubesec version

Docker 安装

docker pull kubesec/kubesec:v2

# 扫描清单文件
docker run -i kubesec/kubesec:v2 scan /dev/stdin < deployment.yaml

kubectl 插件

kubectl krew install kubesec-scan
kubectl kubesec-scan pod mypod -n default

实践扫描

扫描单个清单

# 扫描 deployment 清单
kubesec scan deployment.yaml

# 以 JSON 格式输出
kubesec scan -o json deployment.yaml

# 从标准输入扫描
cat pod.yaml | kubesec scan -

示例输出

[
  {
    "object": "Pod/web-app.default",
    "valid": true,
    "fileName": "pod.yaml",
    "message": "Passed with a score of 3 points",
    "score": 3,
    "scoring": {
      "passed": [
        {
          "id": "ReadOnlyRootFilesystem",
          "selector": "containers[] .securityContext .readOnlyRootFilesystem == true",
          "reason": "不可变根文件系统可防止应用向本地磁盘写入",
          "points": 1
        },
        {
          "id": "RunAsNonRoot",
          "selector": "containers[] .securityContext .runAsNonRoot == true",
          "reason": "强制运行的镜像以非 root 用户运行",
          "points": 1
        },
        {
          "id": "LimitsCPU",
          "selector": "containers[] .resources .limits .cpu",
          "reason": "强制 CPU 限制可防止通过资源耗尽实施 DoS 攻击",
          "points": 1
        }
      ],
      "advise": [
        {
          "id": "ApparmorAny",
          "selector": "metadata .annotations .\"container.apparmor.security.beta.kubernetes.io/nginx\"",
          "reason": "定义良好的 AppArmor 策略可减少容器攻击面",
          "points": 3
        },
        {
          "id": "ServiceAccountName",
          "selector": ".spec .serviceAccountName",
          "reason": "服务账户限制 Kubernetes API 访问,应进行配置",
          "points": 3
        }
      ]
    }
  }
]

扫描多个资源

# 扫描目录中所有 YAML 文件
for file in manifests/*.yaml; do
  echo "=== 扫描 $file ==="
  kubesec scan "$file"
done

# 扫描多文档 YAML
kubesec scan multi-resource.yaml

使用 HTTP API

# 通过公共 API 扫描
curl -sSX POST --data-binary @deployment.yaml \
  https://v2.kubesec.io/scan

# 运行本地 API 服务器
kubesec http --port 8080 &

# 对本地服务器扫描
curl -sSX POST --data-binary @deployment.yaml \
  http://localhost:8080/scan

CI/CD 集成

GitHub Actions

name: Kubesec 扫描
on: [pull_request]
jobs:
  kubesec:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: 安装 Kubesec
        run: |
          curl -sSL https://github.com/controlplaneio/kubesec/releases/latest/download/kubesec_linux_amd64.tar.gz | \
            tar xz -C /usr/local/bin/ kubesec
      - name: 扫描清单
        run: |
          FAIL=0
          for file in k8s/*.yaml; do
            SCORE=$(kubesec scan "$file" | jq '.[0].score')
            echo "$file: score=$SCORE"
            if [ "$SCORE" -lt 0 ]; then
              echo "FAIL: $file 存在严重问题(评分:$SCORE)"
              FAIL=1
            fi
          done
          exit $FAIL

GitLab CI

kubesec-scan:
  stage: security
  image: kubesec/kubesec:v2
  script:
    - |
      for file in k8s/*.yaml; do
        kubesec scan "$file" > /tmp/result.json
        SCORE=$(cat /tmp/result.json | jq '.[0].score')
        if [ "$SCORE" -lt 0 ]; then
          echo "严重:$file 评分 $SCORE"
          cat /tmp/result.json | jq '.[0].scoring.critical'
          exit 1
        fi
      done
  artifacts:
    paths:
      - kubesec-results/

准入 Webhook

将 Kubesec 部署为 ValidatingWebhookConfiguration,在部署时拒绝不安全的清单:

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: kubesec-webhook
webhooks:
  - name: kubesec.controlplane.io
    rules:
      - apiGroups: [""]
        apiVersions: ["v1"]
        operations: ["CREATE", "UPDATE"]
        resources: ["pods"]
      - apiGroups: ["apps"]
        apiVersions: ["v1"]
        operations: ["CREATE", "UPDATE"]
        resources: ["deployments", "daemonsets", "statefulsets"]
    clientConfig:
      service:
        name: kubesec-webhook
        namespace: kube-system
        path: /scan
    failurePolicy: Fail
    sideEffects: None
    admissionReviewVersions: ["v1"]

安全检查参考

严重检查(负分)

检查项选择器风险
特权模式securityContext.privileged == true完整宿主机访问
HostPIDspec.hostPID == true进程命名空间逃逸
HostNetworkspec.hostNetwork == true网络命名空间逃逸
SYS_ADMINcapabilities.add contains SYS_ADMIN接近 root 的能力

最佳实践检查(正分)

检查项分值描述
ReadOnlyRootFilesystem+1防止文件系统写入
RunAsNonRoot+1非 root 进程执行
RunAsUser > 10000+1高 UID 降低冲突风险
LimitsCPU+1防止 CPU 资源耗尽
LimitsMemory+1防止内存资源耗尽
RequestsCPU+1确保调度器资源感知
ServiceAccountName+3显式服务账户
AppArmor 注解+3内核级 MAC 执行
Seccomp 配置文件+4系统调用过滤

参考资料

Saved skills