温馨提示×

k8s安全策略在centos上如何实施

小樊
53
2025-10-05 06:34:09
栏目: 智能运维

Kubernetes安全策略在CentOS上的实施指南

一、系统基础安全加固

  1. 节点系统配置

    • 关闭不必要的服务(如FTP、邮件服务器),使用systemctl disable <service-name>禁用;配置firewalldiptables限制仅开放Kubernetes必要端口(如API Server的6443、kubelet的10250/10255)。
    • 禁用SELinux(临时命令:setenforce 0;永久生效:修改/etc/selinux/configSELINUX=disabled);关闭Swap分区(swapoff -a并注释/etc/fstab中的Swap条目)。
    • 同步系统时间:安装chrony并配置NTP服务器(如server ntp.aliyun.com iburst),运行chronyc sources验证同步状态。
  2. 用户与权限管理

    • 强制使用强密码:修改/etc/login.defs设置密码复杂度(如PASS_MIN_LEN 12PASS_REQUIRE_MIXED_CASE yes);锁定默认多余账户(如usermod -L admusermod -L lp)。
    • 限制su命令:编辑/etc/pam.d/su,添加auth required pam_wheel.so use_uid,仅允许wheel组用户切换root。

二、Kubernetes集群安全配置

1. 认证与授权

  • 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角色给开发人员。

2. 网络隔离

  • NetworkPolicy配置
    使用Calico、Cilium等支持NetworkPolicy的网络插件,限制Pod间通信:
    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端口。

3. 容器运行时安全

  • 安全上下文(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),启用内置的BaselineRestricted策略(需集群支持):

    # 启用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用户运行。

4. 镜像安全

  • 镜像来源与扫描
    使用私有镜像仓库(如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中配置imagePullSecretsPodSecurityPolicy(或PSS)强制验证签名。

5. 数据安全

  • 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。

三、持续监控与审计

  1. 日志收集与分析
    部署EFK(Elasticsearch+Fluentd+Kibana)或Loki+Promtail+Grafana堆栈,收集节点、kubelet、API Server日志,设置告警规则(如频繁的登录失败)。

  2. 审计日志
    启用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,定期分析异常行为。

  1. 实时入侵检测
    部署Falco监控容器和节点行为,检测异常操作(如容器逃逸、宿主机文件访问):
# 安装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 

四、持续维护与更新

  1. 组件版本管理
    定期升级Kubernetes集群至最新稳定版本(使用kubeadm upgrade),升级前备份etcd数据(etcdctl snapshot save /tmp/etcd-snapshot.db)。

  2. 补丁管理
    使用yum update定期更新CentOS系统包(如kernelopenssl),使用kubeadm upgrade node更新Kubernetes组件(如kubeletkube-proxy)。

  3. 漏洞扫描
    使用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未配置)。

0