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未配置)。