Kubernetes使用持久卷安全部署单实例MongoDB的正确方法
特权模式运行MongoDB Pod的安全风险
- 特权模式会为容器授予等同于宿主机root用户的全部操作权限,容器内进程可直接访问宿主机所有硬件设备、修改内核参数、挂载任意宿主机路径、操作宿主机上所有其他进程和文件。一旦容器出现安全漏洞被攻击者利用,攻击者可直接控制整个EC2节点及节点上运行的所有集群工作负载,严重违反最小权限安全原则,生产环境禁止使用该配置。
- 你遇到的所有权限报错,本质是RHEL 8系统默认启用的SELinux强制访问控制、hostPath路径选择不当、目录权限配置不匹配共同导致的,无需开启特权模式即可解决。
基于hostPath本地存储运行单实例MongoDB的安全配置方案
前置节点配置
由于使用hostPath类型存储,需要在MongoDB Pod实际调度的EC2节点上执行以下配置,注意不要将数据目录放在普通用户家目录(如原配置的/home/ec2-user/database)下,RHEL 8默认SELinux策略会限制容器进程访问用户家目录,即使属主配置正确也会触发权限错误:
# 创建专用数据目录 mkdir -p /opt/rke2/mongo-data # 匹配容器内MongoDB进程运行的uid/gid(1001)设置目录属主 chown -R 1001:1001 /opt/rke2/mongo-data # 设置目录基础权限,仅属主拥有读写执行权限 chmod 700 /opt/rke2/mongo-data # 配置SELinux上下文,允许容器进程读写该目录 chcon -Rt container_file_t /opt/rke2/mongo-data # 若需要SELinux配置持久化(重启节点不失效),执行以下命令 semanage fcontext -a -t container_file_t "/opt/rke2/mongo-data(/.*)?" restorecon -Rv /opt/rke2/mongo-data
持久卷配置修正
修改原PV配置中的hostPath路径为上述节点上创建的专用目录,完整配置如下:
--- apiVersion: v1 kind: Namespace metadata: name: mongo --- apiVersion: v1 kind: PersistentVolume metadata: name: mongo-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: manual hostPath: path: /opt/rke2/mongo-data type: DirectoryOrCreate --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mongo-pvc namespace: mongo spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: manual volumeName: mongo-pv
工作负载安全配置
配置中明确关闭特权模式、禁止权限提升,仅保留MongoDB运行必需的最小能力,同时将Pod固定调度到完成前置配置的节点上(hostPath为节点本地存储,跨节点无法访问),完整配置如下:
--- apiVersion: v1 kind: Pod metadata: name: mongodb-pod namespace: mongo spec: # 替换为实际执行了前置目录配置的EC2节点名称,可通过kubectl get nodes查询 nodeName: your-rke2-node-name securityContext: runAsUser: 1001 runAsGroup: 1001 fsGroup: 1001 privileged: false allowPrivilegeEscalation: false containers: - name: mongodb image: mongo:latest ports: - containerPort: 27017 env: - name: MONGO_INITDB_ROOT_USERNAME value: "replace-with-your-admin-username" - name: MONGO_INITDB_ROOT_PASSWORD value: "replace-with-your-admin-password" volumeMounts: - name: mongo-storage mountPath: /data/db securityContext: privileged: false allowPrivilegeEscalation: false capabilities: drop: - ALL add: - CHOWN - SETUID - SETGID - DAC_OVERRIDE volumes: - name: mongo-storage persistentVolumeClaim: claimName: mongo-pvc --- apiVersion: v1 kind: Service metadata: name: mongo-svc namespace: mongo spec: selector: metadata.name: mongodb-pod ports: - port: 27017 targetPort: 27017
配置说明
- 上述配置完全遵循最小权限原则,未开启特权模式,仅授予MongoDB进程运行必需的系统能力,可避免容器权限过大带来的安全风险。
- 由于hostPath存储不具备多节点调度能力,必须通过
nodeName字段将Pod固定到配置了数据目录的节点上,避免Pod漂移到其他节点后无法访问存储。 - 若后续需要升级MongoDB版本或调整配置,不需要修改目录权限和SELinux配置,直接更新工作负载YAML即可。
内容的提问来源于stack exchange,提问作者Jackson
相关产品推荐
相关产品推荐

