温馨提示×

Kubernetes安全策略Ubuntu实施

小樊
32
2025-12-10 17:28:12
栏目: 智能运维

Ubuntu 上落地 Kubernetes 安全策略的实操清单

一 基础系统与安全基线

  • 关闭 Swap:生产环境必须关闭,避免 kubelet 异常与资源争用。执行:sudo swapoff -a 并注释 /etc/fstab 中的 swap 行。
  • 时间同步:启用 NTP/chrony,保证证书校验、审计与调度稳定。
  • 内核网络参数:启用桥接流量走 iptables/ip6tables,开启转发。
    示例:/etc/sysctl.d/kubernetes.conf 写入
    net.bridge.bridge-nf-call-ip6tables=1
    net.bridge.bridge-nf-call-iptables=1
    net.ipv4.ip_forward=1
    执行:sudo sysctl -p
  • 容器运行时:优先 containerd(亦可 Docker),安装后生成默认配置并启动:containerd config default | sudo tee /etc/containerd/config.toml && sudo systemctl restart containerd
  • 组件版本:安装并固定 kubelet/kubeadm/kubectl 的同一小版本,避免 API 兼容性问题。
    以上为后续所有策略生效的底层前提。

二 传输加密与证书生命周期管理

  • 全组件启用 TLS:kubeadm 初始化时默认启用组件间 mTLS,务必避免启用不安全端口(如 8080)。
  • 证书有效期与续期:控制面临时证书默认 1 年;建议将引导 token TTL 设为 24 小时(或更短)。
    常用命令:
    • 查看证书到期:kubeadm certs check-expiration
    • 续期全部证书:sudo kubeadm certs renew all
    • 滚动重启控制面(静态 Pod):
      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
  • 对外访问的 API Server:初始化时可添加 –apiserver-cert-extra-sans=外网IP/域名,便于合规暴露管理面。
  • 节点入群凭证:使用短期 tokenCA 证书哈希,避免长期凭据泄露。
    以上措施确保集群内外通信与加入流程均受 TLS 保护。

三 网络与边界防护

  • 主机防火墙 UFW:默认拒绝入站,仅放行业务必需端口,示例:
    • SSH:sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp
    • API Server:sudo ufw allow from 10.0.0.0/24 to any port 6443 proto tcp
    • Kubelet API:sudo ufw allow from 10.0.0.0/24 to any port 10250 proto tcp
    • DNS:sudo ufw allow from 10.0.0.0/24 to any port 53 proto tcp,udp
    • etcd(仅主节点间):sudo ufw allow from <master1> to any port 2379,2380 proto tcp
    • NodePort 范围 30000–32767:仅在必要时开放且限制来源;若不使用建议关闭。
  • 网络策略插件:部署 Calico 等支持 NetworkPolicy 的 CNI,实现命名空间与 Pod 间细粒度隔离。
    • 全局默认拒绝(基线):
      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}]
  • 分阶段上线:先在测试命名空间验证策略,再推广至生产,避免误封导致业务中断。

四 身份与访问控制 RBAC 与准入控制

  • 启用并收敛 RBAC:按“最小权限”为团队/系统分配 Role/ClusterRoleRoleBinding/ClusterRoleBinding;避免给 default ServiceAccount 授予过宽权限。
    示例(开发命名空间只读 Pod):
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata: name: pod-reader-role; 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: ServiceAccount, name: default, namespace: default}]
    roleRef: {kind: Role, name: pod-reader-role, apiGroup: rbac.authorization.k8s.io}
  • 准入控制与 Pod 安全:
    • 若集群版本较旧仍使用 PodSecurityPolicy(PSP),可创建策略强制非特权、非 root、只读根文件系统、限定 hostPath 等。
      示例要点:privileged=false、hostNetwork/hostPID/hostIPC=false、runAsUser.type=MustRunAsNonRoot、readOnlyRootFilesystem=true、allowedHostPaths 白名单化。
    • 新集群建议使用 Pod Security Admission(PSA)OPA/Gatekeeper 实施“基线/受限”级别与自定义约束,替代 PSP。
  • 审计与监控:启用 API Server 审计日志,对敏感操作(如 delete/patch/update)记录请求与响应;结合 Prometheus/Grafana 持续观测异常。

五 节点加固与运行时安全

  • 组件与凭据隔离:kubelet 仅使用 systemd 管理,配置 只读根文件系统、最小权限账户运行;敏感凭据(如 bootstrap token、kubeconfig)最小可见。
  • 镜像与供应链安全:仅从可信仓库拉取镜像,必要时自建 Harbor/Quay;定期扫描镜像漏洞并更新。
  • 系统加固:保持 Ubuntu 与内核 及时更新;关闭不必要的端口与服务;SSH 仅允许密钥登录并限制来源网段。
  • 资源与稳定性:为 kubelet 配置 systemReserved/kubeReserved,避免节点资源被 Pod 耗尽导致失联。
  • 持续运营:定期执行 kubeadm certs check-expiration、证书轮换演练、网络策略回归测试与 RBAC 权限审计。

0