Ubuntu 上 Kubernetes 安全策略落地清单
一 基础系统与节点加固
- 禁用 Swap:编辑 /etc/fstab 注释 swap 行,执行 swapoff -a,以满足 kubelet 要求并降低被交换侧信道攻击的风险。
- 内核网络参数:写入 /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。
- 时间同步:安装并启用 NTP/chrony,保证证书校验与审计日志时序正确。
- 容器运行时:使用 containerd(或 Docker),并配置 systemd cgroup 驱动。
- 主机防火墙 UFW:默认拒绝入站,按需仅放通必要端口,例如:
- 22/TCP SSH(限定管理网段)
- 6443/TCP kube-apiserver(仅内网/跳板网段)
- 10250/TCP kubelet API(节点间)
- 2379-2380/TCP etcd(主节点间)
- 53/TCP/UDP CoreDNS
- 如不使用 NodePort,建议关闭 30000-32767 范围或严格来源限制。
二 传输加密与证书管理
- 全组件启用 TLS:确保 API Server、etcd、kubelet、kube-proxy 等组件间通信均使用证书校验。
- kubeadm 初始化示例:
sudo kubeadm init --apiserver-advertise-address=<内网IP> --apiserver-cert-extra-sans=<外网IP或域名> --pod-network-cidr=10.244.0.0/16
- 证书生命周期:
- 查看有效期:kubeadm certs check-expiration
- 续签全部证书: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
- 引导令牌:创建短期令牌(如 –validity 24h),避免长期凭据泄露。
三 网络策略与命名空间隔离
- 安装策略引擎:部署 Calico(或 Cilium),例如:
kubectl apply -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
kubectl apply -f https://docs.projectcalico.org/manifests/custom-resources.yaml
- 默认拒绝基线:先“全拒绝、后放行”,避免策略缺口导致横向移动。
- Kubernetes 网络策略(命名空间级默认拒绝):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
namespace: default
spec:
podSelector: {}
policyTypes: [Ingress, Egress]
- Calico 全局默认拒绝(集群级):
apiVersion: projectcalico.org/v1
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 并为团队/系统分配最小权限:
- 示例(开发命名空间只读 + 少量写权限):
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: dev
name: dev-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:
namespace: dev
name: dev-binding
subjects:
- kind: User; name: dev-team; apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role; name: dev-role; apiGroup: rbac.authorization.k8s.io
- 限制 default ServiceAccount 权限,避免工作负载“自动获得”过高权限。
- 定期审计:核查 ClusterRole/RoleBinding、ServiceAccount 使用范围与绑定关系。
五 准入控制与运行时安全
- 准入控制与 Pod 安全:
- 旧机制 PodSecurityPolicy(PSP) 已在 v1.21 起弃用、v1.25 移除,不建议新集群继续使用。
- 推荐替代:
- Pod Security Admission(PSA)(内置,K8s v1.22+):通过 PodSecurity 命名空间标签实施基线/受限/特权三级策略。
- 或 OPA Gatekeeper / Kyverno:以策略即代码实现更细粒度准入控制(镜像白名单、不可变标签、Root 禁止、HostPath 限制等)。
- 运行时与镜像:
- 镜像安全:仅使用可信仓库(如 Harbor/Quay),启用镜像签名与漏洞扫描,定期 docker pull/ctr images pull 更新。
- 主机与组件:关闭不必要的系统服务,及时 apt/yum 更新 与内核补丁;为 kubelet 配置 只读端口关闭、认证/授权、匿名访问禁用 等参数。
- 审计与监控:
- 启用 API Server 审计日志(策略示例:对 delete/patch/update 记录 RequestResponse,对 list/watch 记录 Metadata),集中到 ES/Loki 做告警与取证。
- 部署 Prometheus + Grafana 监控 API Server/etcd/kubelet 指标与异常事件。