身份验证是防止未授权访问的第一道防线。编辑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.1
bindIp: 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的安全性,防范未授权访问、数据泄露等常见安全威胁。需定期审查安全配置(如每季度一次),并根据业务需求调整权限和访问控制策略。