Kubernetes安全策略在CentOS上的实施指南
节点系统配置
systemctl disable <service-name>禁用;配置firewalld或iptables限制仅开放Kubernetes必要端口(如API Server的6443、kubelet的10250/10255)。setenforce 0;永久生效:修改/etc/selinux/config中SELINUX=disabled);关闭Swap分区(swapoff -a并注释/etc/fstab中的Swap条目)。chrony并配置NTP服务器(如server ntp.aliyun.com iburst),运行chronyc sources验证同步状态。用户与权限管理
/etc/login.defs设置密码复杂度(如PASS_MIN_LEN 12、PASS_REQUIRE_MIXED_CASE yes);锁定默认多余账户(如usermod -L adm、usermod -L lp)。su命令:编辑/etc/pam.d/su,添加auth required pam_wheel.so use_uid,仅允许wheel组用户切换root。API Server安全
启用TLS双向认证:生成CA证书、Server证书和Client证书(使用openssl),将证书放入/etc/kubernetes/pki,修改/etc/kubernetes/manifests/kube-apiserver.yaml添加参数:
spec: containers: - command: - kube-apiserver - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key - --client-ca-file=/etc/kubernetes/pki/ca.crt 重启kubelet使配置生效。
RBAC权限控制
遵循最小权限原则,创建命名空间、服务账户、角色及绑定:
# 创建命名空间 kubectl create namespace dev-ns # 创建服务账户 kubectl create serviceaccount dev-sa -n dev-ns # 创建角色(限制仅能读取Pod) kubectl create role pod-reader --verb=get,list,watch --resource=pods -n dev-ns # 绑定角色到服务账户 kubectl create rolebinding dev-rb --role=pod-reader --serviceaccount=dev-ns:dev-sa -n dev-ns 避免使用cluster-admin角色给开发人员。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: frontend-database-policy namespace: dev-ns spec: podSelector: matchLabels: app: database policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: frontend ports: - protocol: TCP port: 3306 该策略仅允许带有app=frontend标签的Pod访问app=database的Pod的3306端口。安全上下文(Security Context)
在Pod或Container级别配置,限制容器权限:
apiVersion: v1 kind: Pod metadata: name: secure-pod namespace: dev-ns spec: containers: - name: nginx image: nginx:1.25 securityContext: runAsNonRoot: true # 禁止以root用户运行 runAsUser: 1000 # 指定用户ID readOnlyRootFilesystem: true # 只读根文件系统 allowPrivilegeEscalation: false # 禁止提权 避免容器以root权限运行。
Pod安全标准(PSS)
替代已废弃的Pod Security Policy(PSP),启用内置的Baseline或Restricted策略(需集群支持):
# 启用Restricted策略(需安装Kyverno或OPA/Gatekeeper) kubectl apply -f https://raw.githubusercontent.com/kyverno/kyverno/main/config/release/install.yaml kubectl create -f - <<EOF apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: enforce-restricted-psp spec: validationFailureAction: enforce background: true rules: - name: check-run-as-non-root match: resources: kinds: - Pod validate: message: "Containers must not run as root" pattern: spec: containers: - securityContext: runAsNonRoot: true EOF 该策略强制所有Pod以非root用户运行。
镜像来源与扫描
使用私有镜像仓库(如Harbor),配置CI/CD流水线集成Trivy或Clair扫描镜像漏洞:
# 使用Trivy扫描镜像 trivy image --exit-code 1 --severity CRITICAL nginx:1.25 若扫描到高危漏洞(如CVE-2023-1234),自动终止流水线并通知开发人员修复。
镜像签名与验证
使用Cosign对镜像签名,部署时验证签名有效性:
# 签名镜像 cosign sign --key cosign.key nginx:1.25 # 验证签名 cosign verify --key cosign.pub nginx:1.25 在Kubernetes中配置imagePullSecrets和PodSecurityPolicy(或PSS)强制验证签名。
etcd加密
启用etcd静态加密保护Secret数据,修改/etc/kubernetes/manifests/etcd.yaml添加加密配置:
spec: containers: - command: - etcd - --encryption-provider-config=/etc/kubernetes/pki/encryption-config.yaml 创建encryption-config.yaml文件,指定加密算法(如AES-256-GCM)和密钥。
Secret管理
避免硬编码Secret,使用Vault或CSI驱动动态注入:
# 安装HashiCorp Vault并配置Kubernetes auth vault auth enable kubernetes vault write auth/kubernetes/role/dev-role \ bound_service_account_names=dev-sa \ bound_service_account_namespaces=dev-ns \ policies=dev-secret-policy \ ttl=1h # 使用Vault CSI驱动挂载Secret到Pod kubectl apply -f https://raw.githubusercontent.com/hashicorp/vault-helm/main/charts/vault/templates/csi-driver.yaml 在Pod中声明Volume挂载Secret。
日志收集与分析
部署EFK(Elasticsearch+Fluentd+Kibana)或Loki+Promtail+Grafana堆栈,收集节点、kubelet、API Server日志,设置告警规则(如频繁的登录失败)。
审计日志
启用Kubernetes Audit Logging,记录所有API请求(如创建Pod、修改Deployment),修改/etc/kubernetes/audit-policy.yaml:
apiVersion: audit.k8s.io/v1 kind: Policy rules: - level: Metadata resources: - group: "" resources: ["pods", "services", "deployments"] 将审计日志保存到/var/log/kubernetes/audit.log,定期分析异常行为。
# 安装Falco helm repo add falcosecurity https://falcosecurity.github.io/charts helm install falco falcosecurity/falco --namespace falco --create-namespace # 查看Falco告警 kubectl logs -f -n falco deploy/falco Falco规则示例(检测容器内访问/etc/shadow):
- rule: Read sensitive file inside container desc: Detect container accessing sensitive files like /etc/shadow condition: > container and evt.type in (open, openat) and evt.dir=< and fd.name in ("/etc/shadow", "/etc/passwd") output: "Sensitive file accessed by container (user=%user.name command=%proc.cmdline file=%fd.name)" priority: WARNING 。
组件版本管理
定期升级Kubernetes集群至最新稳定版本(使用kubeadm upgrade),升级前备份etcd数据(etcdctl snapshot save /tmp/etcd-snapshot.db)。
补丁管理
使用yum update定期更新CentOS系统包(如kernel、openssl),使用kubeadm upgrade node更新Kubernetes组件(如kubelet、kube-proxy)。
漏洞扫描
使用kube-bench检查集群配置是否符合CIS Kubernetes Benchmark标准:
# 安装kube-bench curl -L https://github.com/aquasecurity/kube-bench/releases/download/v0.6.13/kube-bench_0.6.13_linux_amd64.deb -o kube-bench.deb sudo dpkg -i kube-bench.deb # 运行扫描(针对master节点) kube-bench --benchmark cis-1.25 根据扫描结果修复不安全配置(如未启用TLS、RBAC未配置)。