温馨提示×

Kubernetes在Ubuntu上的安全配置

小樊
32
2026-01-03 06:13:05
栏目: 智能运维

Ubuntu 上 Kubernetes 的安全配置清单

一 基础系统与内核加固

  • 时间同步:部署 NTP/chrony,保证节点时间一致,避免因时间漂移导致证书校验、审计与调度异常。示例:sudo apt install ntp ntpdate && sudo ntpdate ntp1.aliyun.com
  • 禁用 Swap:Kubernetes 要求关闭 Swap,编辑 /etc/fstab 注释 swap 行并执行 swapoff -a,否则会影响 kubelet 调度与稳定性。
  • 内核网络参数:启用桥接流量进入 iptables 并开启转发,创建 /etc/sysctl.d/kubernetes.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    执行 sysctl -p 生效。
  • 容器运行时:优先使用 Containerd(或 Docker),安装后配置 cgroups、镜像仓库与镜像拉取凭据,减少供应链风险。
  • 安全基线:保持 系统与安全补丁 及时更新,最小化安装、关闭不必要的端口与服务,仅保留运维与管理必需组件。

二 防火墙与端口最小化

  • 启用 UFW 并设置默认拒绝入站:sudo ufw default deny incoming && sudo ufw enable
  • 仅开放必要端口(示例为内网网段 10.0.0.0/24,管理网段 192.168.1.0/24):
    • 22/TCP SSH:仅管理网段
    • 6443/TCP API Server:仅内网/管理网段
    • 10250/TCP Kubelet API:仅内网节点
    • 2379–2380/TCP etcd:仅主节点之间
    • 53/TCP/UDP CoreDNS:仅内网
    • NodePort 30000–32767/TCP:仅在需要时开放并限制来源
  • 示例规则:
    • sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp
    • sudo ufw allow from 10.0.0.0/24 to any port 6443 proto tcp
    • sudo ufw allow from 10.0.0.0/24 to any port 10250 proto tcp
    • sudo ufw allow from <master1>,<master2> to any port 2379 proto tcp
    • sudo ufw allow from 10.0.0.0/24 to any port 53 proto tcp,udp
  • 不使用 NodePort 时可关闭该端口段:sudo ufw deny 30000:32767/tcp

三 加密通信与证书管理

  • 全组件启用 TLS:确保 API Server、etcd、kubelet、kube-proxy、controller-manager、scheduler 之间以及与客户端均通过证书进行双向认证与加密。
  • 初始化集群时正确配置证书 SAN(如外网域名/IP):
    sudo kubeadm init --apiserver-advertise-address=<内网IP> --apiserver-cert-extra-sans=<外网IP/域名> --pod-network-cidr=10.244.0.0/16
  • 引导与轮换:
    • 创建短期 bootstrap tokensudo kubeadm token create --validity 24h --print-join-command
    • 检查证书有效期:sudo kubeadm certs check-expiration
    • 证书续期:sudo kubeadm certs renew all,随后重启控制面静态 Pod 与 kubelet:
      • systemctl restart kubelet
      • kubectl delete pod -n kube-system -l k8s-app=kube-apiserver
      • kubectl delete pod -n kube-system -l k8s-app=kube-controller-manager
      • kubectl delete pod -n kube-system -l k8s-app=kube-scheduler
  • 严禁使用 insecure-port(8080) 或未加密访问方式,避免明文管理通道。

四 网络策略与命名空间隔离

  • 部署 Calico 等支持 NetworkPolicy 的 CNI 插件:
    • 下载并应用:curl https://docs.projectcalico.org/manifests/calico.yaml -O && kubectl apply -f calico.yaml
  • 默认拒绝基线:先实施全局默认拒绝,再按需放行。
    • Calico 全局策略(拒绝所有入/出站):
      apiVersion: projectcalico.org/v3
      kind: GlobalNetworkPolicy
      metadata:
      name: default-deny
      spec:
      selector: all()
      types:
      - Ingress
      - Egress
    • DNS 例外(保证解析可用):
      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
      name: allow-dns
      namespace: default
      spec:
      podSelector: {}
      policyTypes:
      - Ingress
      ingress:
      - from:
      - namespaceSelector:
      matchLabels:
      name: kube-system
      - podSelector:
      matchLabels:
      k8s-app: kube-dns
      ports:
      - protocol: TCP
      port: 53
      - protocol: UDP
      port: 53
  • 命名空间隔离示例(如 database):默认拒绝入/出站,仅放行 DNS。分阶段推广策略,先测试后生产。

五 RBAC 最小权限与审计监控

  • RBAC 最小权限:按“最小够用”为团队与系统组件分配 Role/ClusterRole,通过 RoleBinding/ClusterRoleBinding 绑定。
    • 示例(开发命名空间只读 + 部分写权限):
      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:
      namespace: dev-namespace
      name: dev-namespace-role
      rules:
      • apiGroups: [“”]
        resources: [“pods”,“services”]
        verbs: [“get”,“list”,“create”,“update”,“delete”]
      • apiGroups: [“apps”]
        resources: [“deployments”]
        verbs: [“get”,“list”,“create”,“update”,“delete”]
      • apiGroups: [“”]
        resources: [“configmaps”]
        verbs: [“get”,“list”]

      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
      name: dev-namespace-binding
      namespace: dev-namespace
      subjects:
      • kind: User
        name: dev-team
        apiGroup: rbac.authorization.k8s.io
        roleRef:
        kind: Role
        name: dev-namespace-role
        apiGroup: rbac.authorization.k8s.io
    • 限制 default ServiceAccount 权限,避免工作负载“自动获得”过高权限。
  • 审计与监控:
    • 启用 API Server 审计日志(示例策略,记录敏感操作与元数据):
      apiVersion: audit.k8s.io/v1
      kind: Policy
      omitStages:
      • “RequestReceived”
        rules:
      • level: RequestResponse
        verbs: [“delete”,“deletecollection”,“patch”,“update”]
      • level: Metadata
        verbs: [“get”,“list”,“watch”]
        users: [“system:kube-proxy”]
      • level: None
        verbs: [“watch”]
        users: [“system:kube-proxy”]
        resources:
        • group: “”
          resources: [“endpoints”,“services”]
    • 结合 监控系统与告警(如节点资源、Pod 异常重启、准入控制拦截)形成闭环。

六 运行时与镜像安全

  • 镜像治理:仅从 可信仓库 拉取镜像,启用镜像签名与可信源校验,定期更新基础镜像修复 CVE
  • 敏感信息管理:使用 Secrets(结合 KMS 或外部密钥管理服务)、ConfigMap 管理配置,避免明文与硬编码。
  • 运行时防护:
    • 启用 Pod Security Admission(PSA) 或替代机制,限制特权容器、主机网络/挂载、Root 用户等。
    • 容器运行时启用 seccomp/AppArmor/SELinux(Ubuntu 常用 AppArmor),减少内核攻击面。
    • 资源与隔离:为容器设置 requests/limits,使用 SecurityContext 指定非 root 用户、只读根文件系统、最小能力集。
  • 持续合规:定期执行 CIS/K8s 基线 扫描与配置审计,结合准入控制(OPA/Gatekeeper、Kyverno)强制策略落地。

0