
自建MongoDB实践:MongoDB 安全加密
接下来的一些列文章会为大家介绍日常工作中常用的 NoSQL 产品 MongoDB。
主要涉及到:
MongoDB 的安装及基本使用
MongoDB 文档查询
MongoDB 复制集
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 以下的版本,可以使用以下配置进行禁用:
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
进行集群节点的通信加密。
然后,启动 mongod 服务器,使用 --sslPEMKeyFile
和 --sslMode
两个参数:
现在,使用shell SSL连接数据库,进行相同的操作:
单机模式:
复制集模式:
配置文件格式:
mongos 命令行启动:
上述是 mongos
的命令行选项。还可以通过 --outputConfig
选项生成配置文件:
生成的配置文件如下:
MongoDB 安全加固实战
有了上面的理论,接下来就进行实战操作,对 MongoDB 进行安全加固。在加固之前,我们先看看在不加密的情况下是怎么样的。
我们一边插入一条文档,一边通过 tcpdump 进行抓包。如下:
我们插入一条文档:{'content': 'Can you see me?'}
。
因为传输协议是明文的,所以使用 tcpdump
可以查看其内容。命令如下:
其输出如下:
通过上述抓包,我们可以看到,在与 MongoDB 交互的过程中,都是明文的。接下来,我们就为 MongoDB 创建相应的证书,使其进行加密通信。
01创建 Certificate Authority(CA)
02创建 Key 及 Certificate Signing Requests(CSR)
为客户端创建相应的证书:
为集群中的每个节点创建相应证书:
查看已创建的文件:
03通过 CA 签署 Certificate Signing Requests
签署客户端相关证书:
签署服务端节点相关证书:
如果签署成功,会有如下输出:
04为 mongod 创建 PEM 文件
PEM 文件是签名证书和私钥的组合。我为客户端和副本集的每个成员创建 PEM 文件,然后将每个文件复制到我们集群中的相应服务器上:
请注意,我还将 CA 证书(ca.pem)复制到每个服务器。这是启动 mongod 实例时对主机名验证的要求。我还将 client.pem 文件复制到 mongo01,以便在 x509 身份验证数据库中创建用户后,我们可以连接并运行管理命令。
05修改之前分片集群的配置文件
之前的配置文件:
修改为:
mongo01
mongo02
mongo03
06测试
使用下面的命令进行连接:
And run initiate to create the replica set:
我们再次插入一条文档:
我们再次使用 tcpdump
查看(我们在 37017 上启动了一个启用 TLS 的集群):
其输出如下:
因为通信协议加密了,就会发现上述输出的信息不太好理解。
有了通信协议的加密,我们就可以拍着胸脯说:『已经很安全了!』。这只是安全的一方面,要想更安全,还需要启用用户认证以及对每个用户进行细粒度的权限控制。
参考链接:
- https://docs.mongodb.com/manual/tutorial/configure-x509-client-authentication/#add-x-509-certificate-subject-as-a-user
- https://www.mongodb.com/docs/manual/core/security-x.509/#member-x-509-certificates
总结
如果我们想让自己的 MongoDB 数据放在公网上访问,那么最优先考虑的就是安全因素,最好不让 MongoDB 暴露在外部。其实有很多 MongoDB 都暴露在了公网,并且是裸奔的形式,也就是说任何人在任何地方都可以随便登录到数据库中。以下是一个截图:
以下是上述的总结也是一些注意事项。因为非常重要,所以再三强调。
需要注意的事项:
- HTTP 的状态接口必须禁用
- RESTful API 必须禁用
- JSON API 必须禁用
- 连接 MongoDB 时使用 SSL 加密
- 启用认证授权
- 使用 IP 限制,地址段越小越好
- 使用密码,密码强度越高越好
- 对 MongoDB 特定的端口进行防护
- 使用特定的用户访问特定的数据库,而不是使用高权限账号
另外,保证数据库的访问安全非常重要,同时也需要保证数据的安全性,做好必要的数据备份。愿大家的 MongoDB 越来越安全,且行且珍惜,我们下期再见。
文章转载自公众号:新钛云服
