You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 06:33:29