Ubuntu Kubernetes安全策略如何设置
导读:Ubuntu 上落地 Kubernetes 安全策略的实操清单 一 基础系统与网络边界 禁用 Swap 并开启时间同步 禁用 Swap(Kubernetes 要求):编辑 /etc/fstab 注释 swap 行后执行 swapoff...
Ubuntu 上落地 Kubernetes 安全策略的实操清单
一 基础系统与网络边界
- 禁用 Swap 并开启时间同步
禁用 Swap(Kubernetes 要求):编辑 /etc/fstab 注释 swap 行后执行swapoff -a;时间同步建议安装并使用 NTP/chrony,保证证书校验与审计时序一致。 - 内核网络参数与转发
写入 /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。 - Ubuntu 防火墙 UFW 最小化放通
原则:默认拒绝入站,仅放通必要端口与来源。示例:- SSH 管理:
ufw allow from 192.168.1.0/24 to any port 22 proto tcp - API Server:
ufw allow from 10.0.0.0/24 to any port 6443 proto tcp - Kubelet API:
ufw allow from 10.0.0.0/24 to any port 10250 proto tcp - DNS:
ufw allow from 10.0.0.0/24 to any port 53 proto tcp,udp - etcd(仅主节点间):
ufw allow from < master-ip> to any port 2379 proto tcp - NodePort 范围 30000–32767 仅在必要时按来源 IP 放开,不使用则关闭。
应用:ufw enable & & ufw reload & & ufw status numbered。
- SSH 管理:
- 控制面与节点端口基线
仅从管理网/跳板机访问 6443(API Server);10250(kubelet)限制为节点间访问;10255(只读 kubelet)如非必要建议关闭或限制来源;2379/2380(etcd)仅主节点互信通信。
二 加密通信与证书生命周期
- 启用 TLS 与引导令牌治理
初始化集群时通过 kubeadm init 启用 TLS,必要时用--apiserver-cert-extra-sans添加外网 IP/域名;引导令牌设置短有效期(如 24h):kubeadm token create --validity 24h --print-join-command。 - 证书有效期与续签
检查证书:kubeadm certs check-expiration;续签:kubeadm certs renew all;滚动重启控制面组件(kubelet 重启后删除相应 kube-system 的 apiserver/controller-manager/scheduler Pod 触发重建)。 - 原则
全链路启用 TLS;避免长期使用静态令牌;证书默认有效期通常为 1 年,不建议超过,以降低维护与泄露风险。
三 网络策略与命名空间隔离
- 部署网络策略插件
选择 Calico/Cilium 等支持 NetworkPolicy 的 CNI。以 Calico 为例:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml,确认 calico-system 命名空间 Pods Running。 - 默认拒绝与白名单优先
全局默认拒绝(安全基线):
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
- namespaceSelector: {
matchLabels: name: kube-system}
- from:
- 命名空间隔离示例
对敏感命名空间(如 database)先拒绝全部入站,再按需仅放行 DNS 出站,分阶段验证后再推广到生产。
四 RBAC 最小权限与审计
- 启用与建模
确保 API Server 启用 RBAC(如 kubeadm 默认启用);使用 Role/ClusterRole 定义权限集合,用 RoleBinding/ClusterRoleBinding 将权限授予用户/组/ServiceAccount。 - 最小权限示例
只读角色(命名空间级):
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata: namespace: dev; name: pod-reader
rules:- apiGroups: [“”];
resources: [“pods”];
verbs: [“get”,“list”,“watch”]
绑定示例:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata: namespace: dev; name: read-pods-binding
subjects: [{ kind: User; name: alice} ]
roleRef: { kind: Role; name: pod-reader; apiGroup: rbac.authorization.k8s.io}
- apiGroups: [“”];
resources: [“pods”];
verbs: [“get”,“list”,“watch”]
- 验证与治理
权限验证:kubectl auth can-i get pods --as=alice -n dev;避免过度授权,定期审计 RoleBinding/ClusterRoleBinding,遵循最小权限原则。 - API Server 审计日志
审计策略示例(/etc/kubernetes/audit/audit-policy.yaml):
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; resources: [“endpoints”,“services”]
- level: None;
nonResourceURLs: [“/api*”,“/version”]
在 kube-apiserver 启动参数加入:
–audit-policy-file=/etc/kubernetes/audit/audit-policy.yaml
–audit-log-path=/var/log/kubernetes/audit.log
–audit-log-maxsize=100 --audit-log-maxbackup=5 --audit-log-maxage=30
重启 kubelet 后审计日志落盘 /var/log/kubernetes/audit.log,可用工具集中分析与告警。
五 准入控制与运行时安全
- 策略即代码 OPA/Gatekeeper(替代 PSP)
Kubernetes 1.25+ 已弃用 PodSecurityPolicy,推荐使用 OPA/Gatekeeper。部署:
kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/release-3.16/deploy/gatekeeper.yaml
示例策略(禁止特权容器):- ConstraintTemplate(templates.gatekeeper.sh/v1beta1/K8sPSPNoPrivileged)
- Constraint(constraints.gatekeeper.sh/v1beta1/K8sPSPNoPrivileged)
测试:kubectl run privileged-pod --image=nginx --privileged应被拒绝。
- 运行时安全 Falco(eBPF)
使用 Helm 安装(eBPF 驱动):
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm install falco falcosecurity/falco --namespace falco --set driver.kind=ebpf
进入测试容器修改 /etc/passwd,在 Falco 日志中应出现敏感文件写入告警。 - 工作负载安全基线
在 securityContext 中落实:非 root 运行(runAsNonRoot)、禁止特权(privileged: false)、只读根文件系统(readOnlyRootFilesystem: true)、Drop 能力(capabilities.drop: [“ALL”])、按需要添加最小能力集;镜像来自可信源并定期漏洞扫描(如 Trivy/Clair)。
六 快速验证与持续运维
- 验证清单
- 防火墙:
ufw status numbered,并对关键端口做来源 IP 连通性测试(如nc -zv < IP> 6443)。 - TLS:执行
kubectl cluster-info,确认通过 HTTPS 访问 API Server,证书有效。 - 网络策略:跨命名空间 Pod 互访与 DNS 访问是否符合策略预期。
- RBAC:用
kubectl auth can-i验证不同主体权限边界。 - 审计:检查 /var/log/kubernetes/audit.log 是否记录敏感操作。
- 防火墙:
- 持续化
定期执行 CIS/K8s 基线 检查、RBAC 权限盘点、镜像与依赖漏洞扫描、证书到期巡检与轮换、策略违规复盘与加固。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu Kubernetes安全策略如何设置
本文地址: https://pptw.com/jishu/775756.html
