新钛云服已累计为您分享736篇技术干货
接下来的一些列文章会为大家介绍日常工作中常用的 NoSQL 产品 MongoDB。
主要涉及到:
MongoDB 安全加密
MongoDB 诊断
MongoDB Change Stream 备份及恢复
MongoDB 其他
我们会用八篇文章近五万字来阐述 MongoDB 运维相关的日常实战事宜。您当前看到的是系列文章的第五篇:《MongoDB 安全加密》。
网络及配置加固
为了减少整个 MongoDB 系统的风险,请确保只有受信任的主机才能访问 MongoDB。
01
配置加固
IP 绑定
从 MongoDB 3.6 开始,MongoDB 二进制文件、mongod 和 mongos 默认绑定到本地主机。从 MongoDB 版本 2.6 到 3.4,默认情况下,只有官方 MongoDB RPM(RedHat、CentOS、Fedora Linux 和衍生品)和 DEB(Debian、Ubuntu 和衍生品)软件包中的二进制文件才会绑定到本地主机。要了解有关此更改的更多信息,请参阅 Localhost 绑定 IP Binding 兼容性更改。
需要注意的:
在绑定到非本地主机(例如可公开访问的)IP 地址之前,请确保我们的集群免受未经授权的访问。有关安全建议的完整列表,请参阅安全清单。至少考虑启用身份验证和强化网络基础设施。
需要注意的:
确保我们的 mongod 和 mongos 实例只能在受信任的网络上访问。如果我们的系统有多个网络接口,请将 MongoDB 程序绑定到私有或内部网络接口。
HTTP 状态接口及 REST API
在 MongoDB 3.6+ 版本中,已经将不建议使用的 HTTP 接口和 REST API 删除了。如果还在使用 3.6 以下的版本,可以使用以下配置进行禁用:
net:
http:
enabled: false
JSONPEnabled: false
RESTInterfaceEnabled: false
02
网络加固
我们还可以在网络层面来加强 MongoDB 的安全防护,具体内容如下。
防火墙
防火墙允许管理员通过提供对网络通信的精细控制来过滤和控制对系统的访问。对于 MongoDB 的管理员来说,以下功能很重要:将特定端口上的入栈流量限制到特定系统,并限制来自不受信任主机的入栈流量。
在 Linux 系统上,iptables 接口提供对底层 netfilter 防火墙的访问。在 Windows 系统上,netsh 命令行界面提供对底层 Windows 防火墙的访问。有关防火墙配置的更多信息,请参阅:
Configure Linux
iptables
Firewall for MongoDB 与Configure Windows
netsh
Firewall for MongoDB.
为了获得最佳效果并最大限度地减少整体服务暴露,请确保只有来自受信任来源的流量才能到达 mongod 和 mongos 实例,并且 mongod 和 mongos 实例只能连接到受信任的输出。
虚拟专用网络
虚拟专用网络(VPN)可以通过加密和有限访问的受信任网络连接两个网络。通常使用 VPN 的 MongoDB 用户使用 TLS/SSL 而不是 IPSEC VPN 来解决性能问题。
根据配置和实现,VPN 提供证书验证和加密协议的选择,这需要对所有客户端进行严格程度的身份验证和识别。此外,由于 VPN 提供了一个安全的隧道,通过使用 VPN 连接来控制对 MongoDB 实例的访问,可以防止篡改和“中间人”攻击。
TLS
生产环境推荐使用 TLS/SSL
进行集群节点的通信加密。
(venv37) ➜ mongodb openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key
(venv37) ➜ mongodb cat mongodb-cert.key mongodb-cert.crt > mongodb.pem
然后,启动 mongod 服务器,使用 --sslPEMKeyFile
和 --sslMode
两个参数:
$ mongod --sslMode requireSSL -sslPEMKeyFile mongodb.pem
现在,使用shell SSL连接数据库,进行相同的操作:
mongo --ssl
单机模式:
mongod --clusterAuthMode x509 --sslMode requireSSL --sslPEMKeyFile server.pem --sslCAFile ca.pem
mongo --ssl --sslPEMKeyFile client.pem
复制集模式:
mongod --replSet myReplSet --sslMode requireSSL --clusterAuthMode x509 --sslClusterFil e --sslPEMKeyFile server.pem --sslCAFile ca.pem
# 命令行参数模式
mongod \
--shardsvr \
--replSet myShard \
--dbpath /var/lib/mongodb \
--bind_ip localhost,My-Example-Hostname \
--fork \
--logpath /var/log/mongodb/mongod.log \
--clusterAuthMode x509 \
--tlsMode requireTLS \
--tlsCAFile /path/to/my/CA/file \
--tlsCertificateKeyFile /path/to/my/certificate/file \
--tlsClusterFile /path/to/my/cluster/membership/file
# 可以使用 --outputConfig 选项,生成 yaml 文件
mongod \
--shardsvr \
--replSet myShard \
--dbpath /var/lib/mongodb \
--bind_ip localhost,My-Example-Hostname \
--fork \
--logpath /var/log/mongodb/mongod.log \
--clusterAuthMode x509 \
--tlsMode requireTLS \
--tlsCAFile /path/to/my/CA/file \
--tlsCertificateKey