Wiki LogoWiki - The Power of Many

Kubernetes 安全: 多层级的纵深防御

从 4C 模型到 Pod 安全标准, 系统性构建 Kubernetes 的安全防线.

Kubernetes 的安全模型被称为 4C 模型: Cloud, Cluster, Container, Code. 在集群层面, 我们需要从身份认证, 访问控制和底层隔离三个维度建立防线.


1. 4C 安全模型

层级责任范围关键措施
Cloud云平台安全VPC 隔离, IAM, 网络防火墙
ClusterK8s 集群安全RBAC, NetworkPolicy, Admission
Container容器运行时安全镜像扫描, Seccomp, AppArmor
Code应用代码安全依赖扫描, Secret 管理, SAST

2. API Server 访问控制流程

2.1 认证 (Authentication)

方式描述
X.509 证书kubeconfig 中的客户端证书
Bearer TokenServiceAccount Token
OIDC集成企业 IdP (Dex, Keycloak)
Webhook外部认证服务

2.2 授权 (Authorization)

模式描述
RBAC基于角色的访问控制 (推荐)
ABAC基于属性的访问控制
Webhook外部授权服务
Node限制 Kubelet 访问范围

2.3 准入控制 (Admission Control)

类型阶段作用
Mutating修改阶段注入 Sidecar, 默认值
Validating验证阶段拒绝不合规资源
ImagePolicyWebhook镜像验证验证镜像签名

内置关键准入控制器:

  • LimitRanger: 强制资源限制
  • ResourceQuota: 命名空间配额
  • PodSecurity: Pod 安全标准
  • NodeRestriction: 限制 Kubelet 权限

3. RBAC 详解

3.1 核心对象

3.2 Role 示例

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
  namespace: default
rules:
- apiGroups: [""]
  resources: ["pods", "pods/log"]
  verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
  resources: ["deployments"]
  verbs: ["get", "list"]
  resourceNames: ["my-app"]  # 可选: 限制特定资源

3.3 常用 Verbs

Verb描述
get读取单个资源
list列出资源集合
watch监听资源变化
create创建资源
update更新资源
patch部分更新
delete删除资源
deletecollection批量删除

4. Network Policy

4.1 默认行为

场景行为
无 NetworkPolicy所有流量允许
有 Ingress Policy仅匹配的入站流量允许
有 Egress Policy仅匹配的出站流量允许

4.2 默认拒绝策略

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: production
spec:
  podSelector: {}  # 匹配所有 Pod
  policyTypes:
  - Ingress
  - Egress

4.3 精细化规则

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: api-allow
spec:
  podSelector:
    matchLabels:
      app: api
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          env: production
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 8080
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: database
    ports:
    - protocol: TCP
      port: 5432
  - to:  # 允许 DNS
    - namespaceSelector: {}
      podSelector:
        matchLabels:
          k8s-app: kube-dns
    ports:
    - protocol: UDP
      port: 53

5. Pod 安全标准 (PSS)

5.1 三个安全级别

级别描述限制
Privileged无限制用于系统组件
Baseline基础限制阻止已知提权
Restricted严格限制生产环境推荐

5.2 Pod Security Admission

apiVersion: v1
kind: Namespace
metadata:
  name: production
  labels:
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/enforce-version: latest
    pod-security.kubernetes.io/warn: restricted
    pod-security.kubernetes.io/audit: restricted
模式行为
enforce拒绝违规 Pod
warn允许但警告
audit仅记录日志

5.3 Restricted 级别限制

spec:
  securityContext:
    runAsNonRoot: true
    seccompProfile:
      type: RuntimeDefault
  containers:
  - name: app
    securityContext:
      allowPrivilegeEscalation: false
      capabilities:
        drop: ["ALL"]
      readOnlyRootFilesystem: true

6. Secret 管理

6.1 Secret 类型

类型用途
Opaque通用密钥
kubernetes.io/tlsTLS 证书
kubernetes.io/dockerconfigjson镜像拉取凭据
kubernetes.io/service-account-tokenSA Token

6.2 静态加密 (Encryption at Rest)

# /etc/kubernetes/encryption-config.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
  - secrets
  providers:
  - aescbc:
      keys:
      - name: key1
        secret: <base64-encoded-key>
  - identity: {}  # 回退到明文

6.3 外部 Secret 管理

工具集成方式
HashiCorp VaultCSI Driver, Sidecar
AWS Secrets ManagerExternal Secrets Operator
Azure Key VaultCSI Driver
SOPSGitOps 加密

7. 运行时安全

7.1 Seccomp

限制容器可用的系统调用:

spec:
  securityContext:
    seccompProfile:
      type: RuntimeDefault  # 或 Localhost
      # localhostProfile: profiles/my-profile.json

7.2 AppArmor

metadata:
  annotations:
    container.apparmor.security.beta.kubernetes.io/app: runtime/default

7.3 运行时检测 (Falco)

实时监控异常行为:

  • 容器内执行 shell
  • 非预期网络连接
  • 敏感文件访问
  • 特权操作

8. 镜像安全

8.1 镜像扫描

工具特点
Trivy快速, 支持 SBOM
GrypeAnchore 开源版
Clair分布式扫描

8.2 镜像签名 (Cosign)

# 签名镜像
cosign sign --key cosign.key myregistry/myimage:v1

# 验证签名
cosign verify --key cosign.pub myregistry/myimage:v1

8.3 准入策略验证

# Kyverno 策略示例
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: verify-image-signature
spec:
  rules:
  - name: check-signature
    match:
      resources:
        kinds: ["Pod"]
    verifyImages:
    - image: "myregistry/*"
      key: |-
        -----BEGIN PUBLIC KEY-----
        ...
        -----END PUBLIC KEY-----

9. 审计日志

# audit-policy.yaml
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
  resources:
  - group: ""
    resources: ["secrets", "configmaps"]
- level: RequestResponse
  resources:
  - group: ""
    resources: ["pods"]
  verbs: ["create", "delete"]
- level: None
  users: ["system:kube-scheduler"]
级别记录内容
None不记录
Metadata仅元数据
Request包含请求体
RequestResponse包含请求和响应体

安全不是一个单一的产品, 而是从认证到运行时的闭环. 坚持 "最小特权原则 (Least Privilege)" 是防御的核心.

On this page