Kubernetes 安全最佳实践

Kubernetes 安全最佳实践

一、前言

哥们,别整那些花里胡哨的。Kubernetes 安全不是小事,今天直接上硬货,教你如何加固你的 K8s 集群。

二、安全架构设计

1. 多层安全防护

层级 防护措施 实现方案
集群层 RBAC 授权 最小权限原则
网络层 网络策略 零信任网络
容器层 镜像扫描 漏洞检测
运行时 Pod 安全标准 限制特权容器
数据层 密钥管理 Vault 集成

三、实战配置

1. RBAC 权限管理

yaml 复制代码
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
  namespace: default
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: susu
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

2. 网络策略

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-app-traffic
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: nginx
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 80

3. Pod 安全标准

yaml 复制代码
apiVersion: policy/v1
kind: PodSecurityPolicy
metadata:
  name: restricted
  annotations:
    seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default,runtime/default'
    apparmor.security.beta.kubernetes.io/allowedProfileNames: 'runtime/default'
    seccomp.security.alpha.kubernetes.io/defaultProfileName:  'runtime/default'
    apparmor.security.beta.kubernetes.io/defaultProfileName:  'runtime/default'
spec:
  privileged: false
  allowPrivilegeEscalation: false
  requiredDropCapabilities:
  - ALL
  volumes:
  - 'configMap'
  - 'emptyDir'
  - 'projected'
  - 'secret'
  - 'downwardAPI'
  hostNetwork: false
  hostIPC: false
  hostPID: false
  runAsUser:
    rule: 'MustRunAsNonRoot'
  seLinux:
    rule: 'RunAsAny'
  supplementalGroups:
    rule: 'MustRunAs'
    ranges:
    - min: 1
      max: 65535
  fsGroup:
    rule: 'MustRunAs'
    ranges:
    - min: 1
      max: 65535

4. 镜像安全

bash 复制代码
# 安装 trivy
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin v0.49.1

# 扫描镜像
trivy image nginx:latest

# 集成到 CI/CD
cat > .gitlab-ci.yml << 'EOF'
image_scanning:
  stage: test
  script:
    - trivy image --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
  allow_failure: true
EOF

5. 密钥管理

yaml 复制代码
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultStaticSecret
metadata:
  name: app-secrets
  namespace: default
spec:
  type: kv-v2
  mount: kv
  path: secrets/app
  refreshAfter: 1h
  destination:
    name: app-secrets
    create: true
  rolloutRestartTargets:
  - kind: Deployment
    name: app

四、安全监控

1. Audit 日志

yaml 复制代码
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: RequestResponse
  resources:
  - group: ""
    resources: ["secrets", "configmaps"]
- level: Metadata
  resources:
  - group: ""
    resources: ["pods", "services"]

2. 运行时监控

使用 Falco 监控异常行为:

yaml 复制代码
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: falco
  namespace: falco
spec:
  selector:
    matchLabels:
      app: falco
  template:
    metadata:
      labels:
        app: falco
    spec:
      containers:
      - name: falco
        image: falcosecurity/falco:latest
        securityContext:
          privileged: true
        volumeMounts:
        - name: falco-config
          mountPath: /etc/falco
      volumes:
      - name: falco-config
        configMap:
          name: falco-config

五、安全加固清单

  1. 集群配置

    • 启用 RBAC
    • 配置 NetworkPolicy
    • 启用 PodSecurityPolicy
    • 配置 Audit 日志
  2. 容器配置

    • 使用最小基础镜像
    • 启用镜像扫描
    • 限制容器权限
    • 配置资源限制
  3. 网络配置

    • 启用 CNI 插件的网络策略
    • 配置 Ingress 控制器
    • 启用 TLS 加密
    • 限制集群外访问
  4. 数据安全

    • 使用 Secrets 管理敏感信息
    • 集成外部密钥管理系统
    • 配置持久化存储加密

六、常见安全问题

1. 特权容器

解决方案 :避免使用 privileged: true,使用 securityContext 限制权限。

2. 镜像漏洞

解决方案:定期扫描镜像,使用官方或经过验证的镜像源。

3. 网络暴露

解决方案:配置网络策略,限制 Pod 间通信。

4. 密钥泄露

解决方案:使用 Secrets 管理,避免硬编码敏感信息。

七、总结

Kubernetes 安全是一个持续的过程,不是一蹴而就的。按照本文的最佳实践,你可以显著提高集群的安全性,炸了!

相关推荐
GGG7663 分钟前
k8s-动态卷供应
云原生·容器·kubernetes
yunwei3711 分钟前
eBPF 教程:使用 fsession 追踪慢速 vfs_read 调用
linux·云原生
heimeiyingwang13 小时前
【架构实战】Kubernetes存储实战:从EmptyDir到Ceph CSI的持久化存储选型指南
ceph·架构·kubernetes
QX_hao14 小时前
【Kubernetes】 的三个Probe
容器·kubernetes
Henry-SAP17 小时前
SAP S/4HANA引领物流ERP新生态
人工智能·云原生·sap·erp
这个DBA有点耶17 小时前
从DBA到数据架构师(五):数据架构演进中的技术债务管理
数据库·程序人生·云原生·架构·dba·数据库管理员
猫吃了源码19 小时前
k9s简介和安装
linux·docker·kubernetes
霸道流氓气质21 小时前
微服务架构中多实例消息抢占问题:技术解析与解决方案
微服务·云原生·架构
heimeiyingwang1 天前
【架构实战】Kubernetes故障排查全景图:从Pod异常到集群雪崩的诊断手册
容器·架构·kubernetes
AAA@峥1 天前
K8s 资源管控:ResourceQuota 与 LimitRange 机制详解与实战
云原生·容器·kubernetes