温馨提示×

Kubernetes在Ubuntu上的安全设置怎么做

小樊
34
2025-10-18 17:54:35
栏目: 智能运维

Kubernetes在Ubuntu上的安全设置指南

一、系统级别安全配置

1. 最小权限原则与容器安全

  • 容器以非root用户运行:通过Pod Security Context配置runAsNonRoot: truerunAsUser(如runAsUser: 1000),避免容器以root权限运行,减少攻击面。
  • 禁用容器提权:设置allowPrivilegeEscalation: false,防止容器通过setuid/setgid等系统调用提升权限。
  • 限制容器capabilities:通过securityContext.capabilities.drop移除不必要的权限(如NET_RAW),降低容器逃逸或发起网络攻击的风险。

2. 系统基础加固

  • 禁用Swap:Kubernetes要求节点禁用Swap,编辑/etc/fstab注释掉Swap行,执行swapoff --all命令,避免内存交换导致性能下降及安全风险。
  • 时间同步:安装NTP服务(sudo apt install ntpdate ntp),使用ntpdate ntp1.aliyun.com同步时间,确保集群节点时间一致(避免TLS证书验证失败、日志时间混乱等问题)。
  • 定期更新系统与组件:执行sudo apt update && sudo apt upgrade -y更新Ubuntu系统和Kubernetes组件(如kubelet、kubeadm),及时修复已知安全漏洞。

二、Kubernetes集群级别安全配置

1. TLS加密通信

  • 启用TLS加密:使用kubeadm init初始化集群时,通过--apiserver-cert-extra-sans参数添加API Server额外Subject Alternative Name(如外网IP、域名),确保证书覆盖多场景访问;控制面组件(API Server、etcd、kubelet、controller-manager、scheduler)之间的通信默认通过TLS加密,无需额外配置。
  • 定期检查证书有效期:使用kubeadm certs check-expiration命令查看证书剩余有效期(默认1年),若即将过期,执行kubeadm certs renew all续签证书,并重启相关组件(systemctl restart kubelet)。

2. RBAC权限控制

  • 启用RBACkubeadm init默认启用RBAC,无需额外参数;避免使用--authorization-mode=AlwaysAllow(完全开放权限)。
  • 配置最小权限角色:通过ClusterRole定义细粒度权限(如read-onlypod-editor),再通过RoleBindingClusterRoleBinding绑定到特定用户/服务账户(如kubectl create clusterrolebinding admin-binding --clusterrole=cluster-admin --user=admin-user)。
  • 限制默认账户权限:禁用默认的admin账户,避免未授权访问;为运维人员创建专用服务账户,仅授予必要权限。

3. 审计日志

  • 启用审计日志:编辑kube-apiserver配置文件(/etc/kubernetes/manifests/kube-apiserver.yaml),添加--audit-log-path=/var/log/kubernetes/audit.log(日志路径)、--audit-log-maxage=30(日志保留天数)、--audit-log-maxsize=100(单日志文件大小MB)等参数,开启审计日志记录。
  • 定期分析日志:使用kube-audit工具或ELK Stack分析审计日志,监控异常操作(如频繁删除Pod、修改集群配置),及时响应安全事件。

三、网络层面安全策略

1. 防火墙规则配置

  • 使用UFW限制端口访问:安装UFW(sudo apt install ufw),默认拒绝所有入站连接(sudo ufw default deny incoming),仅开放必要端口:
    • SSH(22端口):允许管理IP访问(sudo ufw allow from 管理IP to any port 22 proto tcp);
    • API Server(6443端口):允许集群内节点IP段访问(sudo ufw allow from 10.0.0.0/24 to any port 6443 proto tcp);
    • kubelet API(10250端口):允许集群内节点访问(sudo ufw allow from 10.0.0.0/24 to any port 10250 proto tcp);
    • etcd集群通信(2379/2380端口):允许主节点间通信(sudo ufw allow from 主节点IP to any port 2379 proto tcp)。
  • 限制NodePort服务:若使用NodePort服务,通过--service-node-port-range参数限制端口范围(如30000-32767),并仅允许管理IP访问(通过UFW规则)。

2. 网络策略(NetworkPolicy)

  • 部署网络插件:使用Calico(kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml)或Cilium等支持NetworkPolicy的插件,提供Pod级网络隔离。
  • 配置网络策略:通过NetworkPolicy限制Pod间通信,例如:
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all-by-default
      namespace: default
    spec:
      podSelector: {}
      policyTypes:
      - Ingress
      - Egress
    
    上述策略默认拒绝所有Pod间入站和出站流量,再根据业务需求放行特定流量(如允许app: frontend访问app: backend的80端口)。

四、镜像与存储安全

1. 镜像安全

  • 使用可信镜像源:仅从官方镜像仓库(如Docker Hub的library仓库、企业私有仓库)拉取镜像,避免使用未知来源的镜像(如第三方未验证的镜像)。
  • 定期更新镜像:使用kubectl set image命令或CI/CD流水线定期更新镜像(如nginx:1.25nginx:1.26),修复已知漏洞。
  • 扫描镜像漏洞:使用Trivy、Clair等工具扫描镜像(如trivy image nginx:1.25),检测并修复高危漏洞(如CVE-2023-1234)。

2. 存储安全

  • 使用Secrets管理敏感数据:通过kubectl create secret generic db-password --from-literal=password=123456创建Secret,替代直接在Pod配置中硬编码敏感信息(如数据库密码);Secret默认以Base64编码存储,可通过加密卷(如encryptedVolume)进一步加密。
  • 避免挂载Service Account Token:在Pod配置中设置automountServiceAccountToken: false,防止Pod意外获取Service Account Token(用于访问Kubernetes API)。

五、持续安全运维

1. 安全扫描与监控

  • 使用Kubescape扫描集群:定期执行kubescape scan framework all扫描集群,识别未配置RBAC、未启用审计日志等安全风险,并根据报告修复问题。
  • 部署监控与告警:使用Prometheus+Grafana监控集群状态(如节点CPU/内存使用率、Pod重启次数),设置告警规则(如API Server CPU使用率超过80%、Pod异常重启),及时发现异常。

2. 定期备份

  • 备份关键数据:使用Velero等工具定期备份etcd数据(velero backup create etcd-backup --include-namespaces=default --default-volumes-to-restic)、集群配置(如/etc/kubernetes/manifests)和持久化存储卷(PV),确保数据丢失时可快速恢复。

0