Kubernetes与容器安全最佳实践

张开发
2026/4/19 20:26:13 15 分钟阅读

分享文章

Kubernetes与容器安全最佳实践
Kubernetes与容器安全最佳实践1. 容器安全的重要性容器技术的广泛应用带来了便利但也引入了新的安全挑战。容器安全是Kubernetes集群安全的基础直接影响整个系统的安全性。1.1 容器安全的挑战镜像安全基础镜像可能包含漏洞运行时安全容器运行时可能被攻击网络安全容器间通信可能被窃听权限管理容器权限过大可能导致提权配置错误错误的配置可能暴露敏感信息1.2 安全合规要求CIS Docker BenchmarkDocker容器安全基准NIST SP 800-190应用容器安全指南PCI DSS支付卡行业数据安全标准GDPR通用数据保护条例2. 镜像安全2.1 镜像选择与管理使用官方镜像# 使用官方镜像 docker pull nginx:alpine docker pull python:3.9-slim docker pull postgres:13-alpine镜像版本控制# 使用具体版本标签避免使用latest docker pull nginx:1.21.6-alpine docker pull python:3.9.10-slim-buster2.2 镜像扫描使用Trivy扫描镜像# 安装Trivy brew install trivy # 扫描镜像 trivy image nginx:latest # 扫描特定严重程度的漏洞 trivy image --severity HIGH,CRITICAL nginx:latest # 生成扫描报告 trivy image --format json --output report.json nginx:latest集成到CI/CD流程# .gitlab-ci.yml stages: - build - test - security - deploy security-scan: stage: security image: aquasec/trivy:latest script: - trivy image --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA artifacts: paths: - trivy-results.json when: always2.3 镜像构建最佳实践多阶段构建# 多阶段构建减小最终镜像体积 FROM golang:1.16-alpine as builder WORKDIR /app COPY . . RUN go build -o app . FROM alpine:3.14 WORKDIR /app COPY --frombuilder /app/app /app/ EXPOSE 8080 CMD [./app]最小化基础镜像# 使用alpine基础镜像 FROM alpine:3.14 # 安装必要的包 RUN apk add --no-cache nginx # 清理缓存 RUN rm -rf /var/cache/apk/*3. 运行时安全3.1 Pod安全策略Pod安全上下文apiVersion: v1 kind: Pod metadata: name: secure-pod spec: securityContext: runAsNonRoot: true runAsUser: 1000 runAsGroup: 3000 fsGroup: 2000 containers: - name: app image: nginx:1.21-alpine securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL readOnlyRootFilesystem: true runAsNonRoot: truePod安全标准apiVersion: policy/v1 kind: PodSecurityPolicy metadata: name: restricted annotations: apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default seccomp.security.alpha.kubernetes.io/defaultProfileName: runtime/default spec: privileged: false allowPrivilegeEscalation: false requiredDropCapabilities: - ALL volumes: - configMap - emptyDir - projected - secret - downwardAPI - persistentVolumeClaim 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: 655353.2 运行时监控部署FalcoapiVersion: 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: dev mountPath: /host/dev - name: proc mountPath: /host/proc - name: sys mountPath: /host/sys - name: falco-config mountPath: /etc/falco volumes: - name: dev hostPath: path: /dev - name: proc hostPath: path: /proc - name: sys hostPath: path: /sys - name: falco-config configMap: name: falco-configFalco规则配置apiVersion: v1 kind: ConfigMap metadata: name: falco-config namespace: falco data: falco.yaml: | rules_file: - /etc/falco/falco_rules.yaml - /etc/falco/falco_rules.local.yaml json_output: true syscall_event_drops: 1000 syscall_buffer_size: 8388608 syscall_buffer_disable_autosize: false timeouts: ruleset_timeout: 60 event_timeout: 500 outputs: - stdout: enabled: true - http: enabled: true url: http://alertmanager:9093/api/v2/alerts4. 网络安全4.1 网络策略默认拒绝策略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: app-network-policy namespace: default spec: podSelector: matchLabels: app: my-app policyTypes: - Ingress - Egress ingress: - from: - podSelector: matchLabels: app: frontend ports: - protocol: TCP port: 8080 egress: - to: - podSelector: matchLabels: app: database ports: - protocol: TCP port: 5432 - to: - podSelector: matchLabels: k8s-app: kube-dns ports: - protocol: UDP port: 534.2 网络加密启用TLS加密apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tls-ingress namespace: default spec: tls: - hosts: - app.example.com secretName: tls-secret rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-app port: number: 80创建TLS密钥# 生成私钥 openssl genrsa -out tls.key 2048 # 生成证书签名请求 openssl req -new -key tls.key -out tls.csr -subj /CNapp.example.com/OExample Org # 生成自签名证书 openssl x509 -req -days 365 -in tls.csr -signkey tls.key -out tls.crt # 创建Kubernetes Secret kubectl create secret tls tls-secret --key tls.key --cert tls.crt5. 权限管理5.1 RBAC配置创建最小权限角色apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: app-reader namespace: default rules: - apiGroups: [] resources: [pods, services, configmaps] verbs: [get, list, watch] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: app-reader-binding namespace: default subjects: - kind: ServiceAccount name: app-service-account namespace: default roleRef: kind: Role name: app-reader apiGroup: rbac.authorization.k8s.io服务账户配置apiVersion: v1 kind: ServiceAccount metadata: name: app-service-account namespace: default --- apiVersion: apps/v1 kind: Deployment metadata: name: my-app namespace: default spec: template: spec: serviceAccountName: app-service-account containers: - name: app image: nginx:1.21-alpine5.2 安全上下文容器安全上下文apiVersion: v1 kind: Pod metadata: name: secure-pod spec: containers: - name: app image: nginx:1.21-alpine securityContext: capabilities: drop: - NET_RAW - SYS_ADMIN readOnlyRootFilesystem: true runAsNonRoot: true runAsUser: 1000 runAsGroup: 10006. 配置安全6.1 敏感信息管理使用Secret管理敏感信息apiVersion: v1 kind: Secret metadata: name: app-secret namespace: default type: Opaque data: database-password: cGFzc3dvcmQ api-key: YWRtaW4 --- apiVersion: apps/v1 kind: Deployment metadata: name: my-app namespace: default spec: template: spec: containers: - name: app image: nginx:1.21-alpine env: - name: DATABASE_PASSWORD valueFrom: secretKeyRef: name: app-secret key: database-password - name: API_KEY valueFrom: secretKeyRef: name: app-secret key: api-key使用外部密钥管理系统apiVersion: apps/v1 kind: Deployment metadata: name: vault-agent namespace: default spec: replicas: 1 selector: matchLabels: app: vault-agent template: metadata: labels: app: vault-agent spec: containers: - name: vault-agent image: hashicorp/vault:latest command: - vault - agent - -config/etc/vault/config.hcl volumeMounts: - name: vault-config mountPath: /etc/vault volumes: - name: vault-config configMap: name: vault-config6.2 配置验证使用OPA进行配置验证apiVersion: apps/v1 kind: Deployment metadata: name: opa namespace: opa spec: replicas: 1 selector: matchLabels: app: opa template: metadata: labels: app: opa spec: containers: - name: opa image: openpolicyagent/opa:latest ports: - containerPort: 8181 args: - run - --server - --log-levelinfoOPA策略示例# 禁止特权容器 package kubernetes.admission denial[msg] { input.request.kind.kind Pod input.request.operation CREATE container : input.request.object.spec.containers[_] container.securityContext.privileged true msg : Privileged containers are not allowed } # 要求非root用户 denial[msg] { input.request.kind.kind Pod input.request.operation CREATE container : input.request.object.spec.containers[_] not container.securityContext.runAsNonRoot true msg : Containers must run as non-root users }7. 监控与审计7.1 审计日志配置API服务器审计# kube-apiserver.yaml apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: v1.25.0 apiServer: extraArgs: audit-log-path: /var/log/kubernetes/audit.log audit-policy-file: /etc/kubernetes/audit-policy.yaml audit-log-maxage: 30 audit-log-maxbackup: 10 audit-log-maxsize: 100审计策略配置# audit-policy.yaml apiVersion: audit.k8s.io/v1 kind: Policy rules: - level: Metadata resources: - group: resources: [pods, services, secrets] - level: RequestResponse resources: - group: resources: [secrets] - level: None resources: - group: resources: [events]7.2 安全监控Prometheus安全指标apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: security-monitor namespace: monitoring spec: selector: matchLabels: app: falco namespaceSelector: matchNames: - falco endpoints: - port: metrics interval: 15sGrafana安全仪表板{ dashboard: { id: null, title: Security Metrics, panels: [ { title: Falco Alerts, type: graph, targets: [ { expr: rate(falco_events{rule!~Debug}[5m]) } ] }, { title: Privileged Containers, type: gauge, targets: [ { expr: sum(kube_pod_container_status_running{privilegedtrue}) } ] } ] } }8. 安全最佳实践8.1 容器安全最佳实践使用最小基础镜像选择Alpine等最小化镜像定期更新镜像及时更新基础镜像和依赖扫描镜像漏洞集成镜像扫描到CI/CD流程使用非root用户容器以非root用户运行限制容器权限禁用特权模式限制能力只读文件系统使用只读根文件系统网络隔离配置网络策略限制通信敏感信息管理使用Secret存储敏感信息监控运行时部署Falco等运行时安全工具审计日志启用API服务器审计日志8.2 Kubernetes安全最佳实践RBAC配置实施最小权限原则Pod安全策略配置Pod安全标准网络策略默认拒绝所有流量TLS加密启用所有通信的TLS加密密钥管理使用外部密钥管理系统配置验证使用OPA验证配置节点安全定期更新节点禁用不必要的服务集群配置遵循CIS Kubernetes Benchmark安全监控集成Prometheus和Grafana安全审计定期进行安全审计9. 常见安全问题与解决方案问题原因解决方案镜像漏洞基础镜像过时定期更新镜像使用镜像扫描工具特权容器容器以root权限运行配置Pod安全上下文禁用特权模式网络暴露服务暴露在公网配置网络策略限制访问敏感信息泄露硬编码密钥使用Secret管理敏感信息权限过度服务账户权限过大实施RBAC最小权限原则配置错误错误的安全配置使用OPA验证配置定期审计10. 实践案例10.1 安全的多租户集群网络隔离apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: tenant-isolation namespace: tenant-a spec: podSelector: {} policyTypes: - Ingress - Egress ingress: - from: - namespaceSelector: matchLabels: tenant: tenant-a egress: - to: - namespaceSelector: matchLabels: tenant: tenant-a - namespaceSelector: matchLabels: name: kube-system资源限制apiVersion: v1 kind: ResourceQuota metadata: name: tenant-a-quota namespace: tenant-a spec: hard: requests.cpu: 10 requests.memory: 20Gi limits.cpu: 20 scopes: - NotBestEffort10.2 安全的CI/CD流程集成安全扫描# .github/workflows/ci.yml name: CI/CD on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - name: Build image run: docker build -t ${{ secrets.DOCKER_REGISTRY }}/app:${{ github.sha }} . security-scan: needs: build runs-on: ubuntu-latest steps: - name: Scan image uses: aquasecurity/trivy-actionmaster with: image-ref: ${{ secrets.DOCKER_REGISTRY }}/app:${{ github.sha }} severity: HIGH,CRITICAL deploy: needs: security-scan runs-on: ubuntu-latest if: github.ref refs/heads/main steps: - uses: actions/checkoutv3 - name: Deploy to Kubernetes uses: azure/k8s-deployv4 with: kubeconfig: ${{ secrets.KUBE_CONFIG }} manifests: | k8s/app.yaml images: | ${{ secrets.DOCKER_REGISTRY }}/app:${{ github.sha }}11. 总结Kubernetes与容器安全最佳实践需要考虑以下因素镜像安全使用官方镜像定期扫描漏洞运行时安全配置Pod安全上下文部署运行时监控网络安全配置网络策略启用TLS加密权限管理实施RBAC最小权限原则配置安全使用Secret管理敏感信息验证配置监控与审计启用审计日志集成安全监控最佳实践遵循CIS基准定期安全审计持续改进定期更新安全策略适应新的威胁通过以上实践可以构建一个安全、可靠的Kubernetes集群保护容器化应用免受安全威胁确保系统的安全性和合规性。

更多文章