面试题答案
一键面试实现网络隔离提高安全性
- 网络拓扑隔离:
- 将MongoDB副本集部署在专用的子网内,该子网与其他非必要的网络进行物理或逻辑隔离。例如,使用虚拟专用云(VPC)中的子网,只有授权的服务器(如应用服务器)所在的子网能与之通信。
- 配置防火墙规则,只允许来自特定IP地址范围(如应用服务器的IP段)的连接访问MongoDB副本集的端口(默认27017等)。例如在Linux系统下使用iptables配置:
iptables -A INPUT -p tcp --dport 27017 -s <allowed_ip_range> -j ACCEPT iptables -A INPUT -p tcp --dport 27017 -j DROP
- 节点间通信隔离:
- 为副本集节点之间的内部通信配置专用网络,如使用单独的网卡绑定到内部子网,仅用于节点间的数据同步和心跳通信。这样外部网络无法直接访问节点间通信链路,提高安全性。
启用传输层加密(TLS)对副本集性能和配置的影响
- 性能影响:
- 计算开销增加:启用TLS需要进行加密和解密操作,这会增加CPU的负担。特别是在处理大量数据传输时,如副本集之间的数据同步,可能导致性能下降。例如,在高负载情况下,加密和解密操作可能使副本集节点的CPU使用率从30%上升到50%。
- 延迟略有增加:TLS握手过程会增加连接建立的延迟。每次客户端与副本集节点建立连接时,都需要进行TLS握手,这可能会使连接时间从几毫秒增加到几十毫秒,对于对延迟敏感的应用可能有一定影响。
- 配置影响:
- 证书管理:需要配置和管理TLS证书。每个MongoDB节点都需要有自己的证书,并且客户端也需要信任这些证书。这涉及到证书的生成(可以使用OpenSSL等工具)、分发和定期更新。例如,使用OpenSSL生成证书:
openssl req -newkey rsa:2048 -days 365 -nodes -keyout mongodb.key -out mongodb.csr openssl x509 -req -in mongodb.csr -days 365 -signkey mongodb.key -out mongodb.crt
- 配置文件修改:需要在MongoDB配置文件中添加TLS相关配置。每个节点的
mongod.conf
文件都要配置TLS相关参数,如证书路径等。
具体配置示例
- 生成证书(假设已安装OpenSSL):
- 生成私钥和证书请求:
openssl req -newkey rsa:2048 -days 365 -nodes -keyout mongodb.key -out mongodb.csr
- 自签名证书(生产环境建议使用CA签名证书):
openssl x509 -req -in mongodb.csr -days 365 -signkey mongodb.key -out mongodb.crt
- 配置副本集节点(修改
mongod.conf
):- 在每个副本集节点的
mongod.conf
文件中添加以下配置:
其中net: tls: mode: requireTLS certificateKeyFile: /path/to/mongodb.pem
/path/to/mongodb.pem
是包含证书和私钥的PEM格式文件(可以将mongodb.crt
和mongodb.key
合并成一个文件)。 - 在每个副本集节点的
- 配置客户端:
- 如果使用MongoDB官方驱动,在连接字符串中添加TLS相关参数。例如,在Node.js中使用
mongodb
驱动:
这里const { MongoClient } = require('mongodb'); const uri = "mongodb://<host1>:<port1>,<host2>:<port2>,<host3>:<port3>/<database>?tls=true&tlsCAFile=/path/to/ca.crt&tlsCertificateKeyFile=/path/to/client.pem"; const client = new MongoClient(uri);
/path/to/ca.crt
是CA证书路径(如果是自签名证书,就是自己生成的证书),/path/to/client.pem
是客户端证书和私钥文件路径(如果需要双向认证)。 - 如果使用MongoDB官方驱动,在连接字符串中添加TLS相关参数。例如,在Node.js中使用