面试题答案
一键面试身份验证
- 启用身份验证:在MongoDB配置文件(
mongod.conf
)中,设置security.authorization: enabled
,这样客户端连接时必须提供有效的用户名和密码。 - 创建用户:使用
mongo
shell连接到MongoDB实例,切换到admin
数据库,通过db.createUser()
命令创建具有管理权限的用户,例如:
use admin
db.createUser(
{
user: "adminUser",
pwd: "password",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
然后可以为具体数据库创建用户,如:
use yourDatabase
db.createUser(
{
user: "yourUser",
pwd: "yourPassword",
roles: [ { role: "readWrite", db: "yourDatabase" } ]
}
)
授权机制
- 角色管理:MongoDB内置了多种角色,如
read
、readWrite
、dbAdmin
等。根据用户需求分配相应角色。例如,对于只读用户,分配read
角色;对于读写用户,分配readWrite
角色。也可以自定义角色,使用db.createRole()
命令创建自定义角色,例如:
use yourDatabase
db.createRole(
{
role: "customRole",
privileges: [
{ resource: { db: "yourDatabase", collection: "" }, actions: [ "find", "insert" ] }
],
roles: []
}
)
- 基于角色的访问控制(RBAC):通过将用户与角色关联,角色与权限关联,实现细粒度的访问控制。当用户连接到MongoDB时,其权限由所关联的角色决定。
网络访问控制
- 绑定IP地址:在MongoDB配置文件中,通过
net.bindIp
参数指定MongoDB服务器监听的IP地址。例如,只监听本地回环地址127.0.0.1
,配置为net.bindIp: 127.0.0.1
,这样可以防止外部未经授权的访问。如果需要远程访问,可以指定服务器的公网IP地址,但要谨慎操作。 - 防火墙设置:配置服务器的防火墙,只允许信任的IP地址或IP段访问MongoDB的端口(默认27017)。例如,在Linux系统上使用
iptables
命令:
iptables -A INPUT -p tcp --dport 27017 -s trusted_ip_address -j ACCEPT
iptables -A INPUT -p tcp --dport 27017 -j DROP
数据加密
- 传输层加密(TLS/SSL):
- 生成证书:可以使用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**:在`mongod.conf`文件中配置TLS/SSL相关参数,如:
net:
tls:
mode: requireTLS
certificateKeyFile: /path/to/mongodb.pem
将生成的mongodb.key
和mongodb.crt
合并为mongodb.pem
文件。客户端连接时也需要配置TLS/SSL相关参数,如在mongo
shell中使用--ssl
选项连接。
2. 存储层加密(透明数据加密,TDE):从MongoDB 3.6开始支持WiredTiger存储引擎的TDE。配置步骤如下:
- 启用加密:在配置文件中设置security.javascriptEnabled: false
(关闭JavaScript引擎以提高安全性),并添加storage.wiredTiger.engineConfig.encryptionOptions
相关配置,例如:
storage:
wiredTiger:
engineConfig:
encryptionOptions:
keyFile: /path/to/keyfile
- **生成加密密钥**:使用`openssl rand -base64 96 > /path/to/keyfile`生成密钥文件,并设置合适的文件权限(如`chmod 400 /path/to/keyfile`)。
高可用集群环境下安全配置同步
- 副本集:
- 身份验证与授权:在副本集的主节点上进行用户创建和角色管理等操作,副本集内的其他节点会自动同步这些配置。因为副本集内节点之间通过内部复制机制同步数据和元数据,包括用户和角色信息。
- 网络访问控制:确保所有副本集节点的防火墙配置一致,允许副本集内节点之间的通信以及外部客户端访问所需的端口。可以通过自动化配置工具(如Ansible、Chef等)来统一管理所有节点的防火墙规则。
- 数据加密:所有副本集节点应使用相同的TLS/SSL证书和密钥进行传输层加密,使用相同的加密密钥进行存储层加密。在配置文件中统一指定证书和密钥的路径,通过配置管理工具确保所有节点的配置一致。
- 分片集群:
- 身份验证与授权:在配置服务器(config servers)、分片节点(shards)和路由节点(mongos)上都要启用身份验证和授权,且配置要保持一致。在主配置服务器上创建用户和角色,这些配置会通过内部机制同步到其他配置服务器以及整个集群。
- 网络访问控制:对配置服务器、分片节点和路由节点分别进行网络访问控制配置,确保各组件之间以及与外部客户端的通信安全。同样可以使用自动化工具统一管理配置。
- 数据加密:所有组件都要配置相同的TLS/SSL证书和密钥进行传输层加密,相同的加密密钥进行存储层加密。通过配置管理工具保证所有节点配置同步更新。