CentOS 上 Kubernetes 安装的安全注意事项
一 系统加固与基础配置
- 保持 SELinux 为 enforcing,仅对必须的系统调用做例外(如使用容器运行时或 CNI 提供的策略模块),避免直接 SELINUX=disabled;如必须临时放宽,应在变更窗口内恢复并复核策略。
- 不建议直接关闭 firewalld;在生产环境应仅开放必要端口(如 6443、10250、10251、2379/2380、53/UDP+TCP 等),并按最小暴露面收敛来源网段。
- 必须 禁用 Swap(kubelet 要求),并在重启后验证;同时开启 内核桥接与转发:加载 br_netfilter,设置 net.bridge.bridge-nf-call-iptables=1、net.bridge.bridge-nf-call-ip6tables=1、net.ipv4.ip_forward=1。
- 全节点启用 NTP/chrony 时间同步,避免因时间漂移导致证书校验、审计与调度异常。
- 容器运行时建议使用 Containerd(Kubernetes v1.24+ 起内置不再直接兼容 Docker,若需 Docker 请使用 cri-dockerd 适配);安装后确保 cgroup driver 一致(常见为 systemd),并启用 SystemdCgroup=true。
二 组件与网络的安全配置
- 证书与凭据:使用 kubeadm 默认 PKI 体系,妥善保管 admin.conf/kubeconfig,避免分发到非受控主机;为外部访问设置 API Server 负载均衡/认证网关,并限制来源网段。
- 端口最小化:仅开放 API Server(6443)、kubelet(10250)、Scheduler(10251)、Controller Manager(10252)、etcd(2379/2380)、以及 CoreDNS(53) 等必要端口;为 kubelet 只读端口 10255 设置访问控制或禁用,避免信息泄露。
- 网络策略:部署 CNI 插件(如 Calico)后,立即创建 NetworkPolicy 实现默认拒绝(Default Deny),仅对白名单流量放通,减少横向移动风险。
- 服务暴露:优先使用 ClusterIP/内部 Service;对外暴露尽量通过 Ingress Controller(配合 WAF/认证)或 LoadBalancer 的安全组 策略,避免将 NodePort 直接暴露公网。
三 身份与访问控制 RBAC
- 坚持 最小权限原则:避免使用 cluster-admin;按命名空间创建 Role/RoleBinding,跨命名空间权限使用 ClusterRole/ClusterRoleBinding 并细化到具体资源与动词。
- 管理 default ServiceAccount:不要为 default 绑定高权限;为工作负载创建 专用 ServiceAccount 并只授予所需权限。
- 审慎挂载 Token:对不需要访问 API 的 Pod,设置 automountServiceAccountToken: false(可在 Pod 或 ServiceAccount 级配置)。
- 权限验证与审计:使用 kubectl auth can-i --list --as=system:serviceaccount:: 定期自检;启用 审计日志 记录敏感操作(如 Secret、RBAC 变更),并定期清理无效/过度绑定的 RoleBinding/ClusterRoleBinding。
四 镜像与供应链安全
- 使用 私有镜像仓库 并配置 镜像拉取密钥(imagePullSecrets);为生产镜像设置 可信源签名与镜像扫描,防止恶意镜像进入集群。
- 若使用 Helm,为 Tiller(如仍在使用)或 Helm 客户端/CI 配置最小权限 RBAC,仅授予目标命名空间的必要资源操作权限,避免以高权限账户执行部署。
五 数据安全与高可用
- etcd 安全:启用 TLS 认证与传输加密;将 etcd 数据目录 挂载在独立、加密的磁盘/分区;制定并演练 定期备份/恢复 流程(含离线快照与恢复验证)。
- 高可用:多 Master 场景部署 etcd 集群 与 API Server 负载均衡,对外暴露使用 VIP/HAProxy/Keepalived 等方案,避免单点故障与证书/配置漂移。
- 变更与升级:采用 滚动升级 策略,先在测试环境验证 Kubernetes 版本 与组件兼容性;保留回滚方案与变更记录。