1. 启用身份验证(核心安全措施)
身份验证是防止未授权访问MongoDB的第一道防线。编辑MongoDB配置文件(通常位于/etc/mongod.conf),在security部分添加或修改以下内容:
security:
authorization: enabled
保存后重启MongoDB服务使配置生效:
sudo systemctl restart mongod
创建管理员账户(需在启用认证前完成):连接到MongoDB Shell(mongo),切换到admin数据库,执行:
use admin
db.createUser({
user: "admin",
pwd: "YourStrongPassword123!",
roles: ["root"] // root角色拥有最高权限
})
后续连接需指定用户名、密码及认证数据库(如admin):
mongo -u admin -p YourStrongPassword123 --authenticationDatabase admin
2. 配置网络访问控制(限制访问范围)
通过绑定IP地址和防火墙规则缩小MongoDB的暴露范围。
/etc/mongod.conf中的net部分,将bindIp设置为仅允许特定IP或本地访问(如127.0.0.1或局域网IP段):net:
bindIp: 127.0.0.1,192.168.1.100 # 允许本地和局域网IP 192.168.1.100
port: 27017 # 默认端口,可修改但需同步更新防火墙规则
重启服务使绑定生效:sudo systemctl restart mongod。sudo ufw allow from 192.168.1.100 to any port 27017/tcp # 替换为你的受信任IP
sudo ufw enable # 启用防火墙
sudo firewall-cmd --permanent --zone=public --add-port=27017/tcp
sudo firewall-cmd --reload
sudo iptables -A INPUT -s 192.168.1.100 -p tcp --dport 27017 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 27017 -j DROP
sudo netfilter-persistent save # Debian/Ubuntu保存规则
3. 禁用不必要的接口和功能(减少攻击面)
MongoDB默认开启的HTTP接口、REST接口和JSONP功能会增加安全风险,建议禁用:
编辑/etc/mongod.conf中的net部分,添加或修改以下内容:
net:
http:
enabled: false # 禁用HTTP接口
RESTInterfaceEnabled: false # 禁用REST接口
JSONPEnabled: false # 禁用JSONP
保存后重启服务:sudo systemctl restart mongod。
4. 使用TLS/SSL加密通信(保护数据传输)
加密MongoDB客户端与服务端之间的通信,防止数据被窃听或篡改。
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout mongodb-key.pem -out mongodb-cert.pem
cat mongodb-key.pem mongodb-cert.pem > mongodb.pem # 合并私钥和证书
/etc/mongod.conf中的net.ssl部分,指定证书路径:net:
ssl:
mode: requireSSL # 强制使用SSL
PEMKeyFile: /etc/ssl/mongodb.pem # 证书文件路径
CAFile: /etc/ssl/mongodb-cert.pem # CA证书路径(若使用CA签发)
重启服务:sudo systemctl restart mongod。mongo --ssl --sslCAFile /etc/ssl/mongodb-cert.pem --sslPEMKeyFile /etc/ssl/mongodb.pem -u admin -p YourStrongPassword123 --authenticationDatabase admin
5. 配置审计日志(监控操作行为)
审计日志可记录所有用户的操作(如查询、插入、删除),便于事后追溯安全事件。
/etc/mongod.conf中的security.auditLog部分,配置日志输出:security:
auditLog:
destination: file # 日志输出到文件
format: JSON # 日志格式为JSON(易解析)
path: /var/log/mongodb/audit.json # 日志文件路径
确保MongoDB对日志目录有写权限:sudo chown -R mongodb:mongodb /var/log/mongodb。tail命令实时查看审计日志:tail -f /var/log/mongodb/audit.json
6. 使用专用非特权用户运行MongoDB(降低权限风险)
避免以root用户运行MongoDB,减少潜在的安全风险。
mongodb):sudo useradd -r -s /bin/false mongodb
/var/lib/mongodb)和日志目录(默认/var/log/mongodb)的所有权赋予该用户:sudo chown -R mongodb:mongodb /var/lib/mongodb
sudo chown -R mongodb:mongodb /var/log/mongodb
-u参数指定用户启动MongoDB:sudo -u mongodb mongod --config /etc/mongod.conf
或修改systemd服务文件(/lib/systemd/system/mongod.service),将User=mongodb和Group=mongodb添加到[Service]部分,然后重载systemd并重启服务:sudo systemctl daemon-reload
sudo systemctl restart mongod
7. 定期更新和打补丁(修复已知漏洞)
保持MongoDB及依赖组件的最新版本,及时修复安全漏洞。
apt,CentOS/RHEL使用yum):sudo apt update && sudo apt upgrade mongodb-org # Ubuntu/Debian
sudo yum update mongodb-org # CentOS/RHEL
8. 创建数据库级用户并分配最小权限(遵循最小权限原则)
避免使用管理员账户连接所有数据库,为每个数据库创建专用用户并分配仅需要的角色。
mydb),执行:use mydb
db.createUser({
user: "app_user",
pwd: "AppUserPassword123!",
roles: ["readWrite"] // 仅授予读写权限(无需admin权限)
})
connectionStatus命令查看当前用户的权限:db.runCommand({ connectionStatus: 1 })
或切换到目标数据库,使用db.getUser("app_user")查看用户角色。