身份验证是防止未授权访问的第一道防线。编辑MongoDB配置文件(/etc/mongod.conf),在security section添加或修改以下内容:
security: authorization: enabled 重启MongoDB服务使配置生效:
sudo systemctl restart mongod 创建管理员账户(以admin数据库为例):
mongo use admin db.createUser({ user: "admin", pwd: "YourStrongPassword123!", roles: ["root"] # 分配root角色(拥有所有数据库管理权限) }) 后续所有数据库操作需通过该管理员账户登录。
修改/etc/mongod.conf中的net.bindIp参数,仅允许受信任的IP地址或网络访问。例如:
bindIp: 127.0.0.1bindIp: 192.168.1.100,127.0.0.1(替换为实际IP)关闭HTTP状态接口和REST接口,减少攻击面:
net: http: enabled: false RESTInterfaceEnabled: false JSONPEnabled: false 重启服务使配置生效。
使用ufw(Ubuntu)或iptables(CentOS)限制MongoDB端口(默认27017)的访问:
sudo ufw allow from 192.168.1.0/24 to any port 27017 # 仅允许192.168.1.0/24网段访问 sudo ufw enable sudo iptables -A INPUT -p tcp --dport 27017 -s 192.168.1.100 -j ACCEPT # 允许特定IP sudo iptables -A INPUT -p tcp --dport 27017 -j DROP # 拒绝其他IP 加密MongoDB客户端与服务端之间的通信,防止数据泄露。
使用OpenSSL生成自签名证书(生产环境建议使用CA签发的证书):
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout mongodb-key.pem -out mongodb-cert.pem 将生成的mongodb-key.pem(私钥)和mongodb-cert.pem(证书)存放在安全目录(如/etc/ssl/mongodb)。
修改/etc/mongod.conf中的net.ssl section:
net: ssl: mode: requireSSL # 强制使用SSL PEMKeyFile: /etc/ssl/mongodb/mongodb-key.pem # 私钥路径 CAFile: /etc/ssl/mongodb/mongodb-cert.pem # 证书路径(自签名时可省略或指向自身) 重启服务生效。
审计日志可记录所有用户操作(如查询、插入、删除),便于追踪安全事件。仅在MongoDB Enterprise版本中支持。
修改/etc/mongod.conf中的security.auditLog section:
security: auditLog: destination: file # 日志输出到文件 format: JSON # 日志格式为JSON(便于解析) path: /var/log/mongodb/mongod-audit.log # 日志文件路径 重启服务使审计功能生效。
避免以root用户运行MongoDB,降低权限提升风险。
sudo useradd -r -s /bin/false mongodb # 创建系统用户(无登录权限) 将MongoDB数据目录(默认/var/lib/mongodb)和日志目录(默认/var/log/mongodb)的所有权赋予该用户:
sudo chown -R mongodb:mongodb /var/lib/mongodb sudo chown -R mongodb:mongodb /var/log/mongodb sudo systemctl edit mongod # 编辑服务文件,添加User和Group参数 在编辑器中添加:
[Service] User=mongodb Group=mongodb 保存后重启服务:
sudo systemctl daemon-reload sudo systemctl restart mongod 为用户分配仅满足其工作需求的权限,避免过度授权。
例如,为mydatabase数据库创建只读用户app_user:
mongo use mydatabase db.createUser({ user: "app_user", pwd: "AppUserPassword456!", roles: ["readWrite"] # 仅授予读写权限 }) 优先使用MongoDB内置角色(如read、readWrite、dbAdmin、userAdmin),减少自定义角色的复杂度。如需更细粒度的权限,可创建自定义角色。
及时应用MongoDB官方发布的安全补丁,修复已知漏洞。
# Ubuntu/Debian sudo apt-get update sudo apt-get upgrade mongodb-org # CentOS/RHEL sudo yum update mongodb-org 建议开启自动更新(如unattended-upgrades),确保系统与MongoDB始终保持最新状态。
确保MongoDB数据文件和配置文件的权限仅允许授权用户访问:
sudo chmod -R 750 /var/lib/mongodb # 数据目录:所有者可读写执行,组用户可读执行 sudo chmod -R 750 /var/log/mongodb # 日志目录:同上 sudo chmod 600 /etc/mongod.conf # 配置文件:仅所有者可读写 REST接口允许通过HTTP访问MongoDB,存在安全风险,建议关闭(已在步骤2.2中配置)。
若无需在查询中使用JavaScript,可在配置文件中禁用:
security: javascriptEnabled: false 重启服务生效。
定期备份MongoDB数据,确保在数据丢失或被篡改时能够快速恢复。
mongodump备份mongodump --out /path/to/backup --host 127.0.0.1 --port 27017 --username admin --password YourStrongPassword123! mongorestore恢复mongorestore /path/to/backup --host 127.0.0.1 --port 27017 --username admin --password YourStrongPassword123! 建议将备份文件存储在异地或云存储中,进一步提高数据安全性。
通过以上步骤,可显著提升Linux环境下MongoDB的安全性,防范未授权访问、数据泄露等常见安全威胁。需定期审查安全配置(如每季度一次),并根据业务需求调整权限和访问控制策略。