在副本集中实施密钥文件访问控制
在本页面
Overview
对现有的replica set实施访问控制需要配置:
-
使用Internal Authentication的副本集成员之间的安全性,以及
-
使用用户访问控制连接 Client 端和副本集之间的安全性。
对于本教程,副本集的每个成员都使用相同的内部身份验证机制和设置。
强制执行内部身份验证也会强制执行用户访问控制。要连接到副本集,诸如mongo shell 之类的 Client 端需要使用user account。参见Users。
Cloud Manager 和 Ops Manager
如果 Cloud Manager 或 Ops Manager 正在 Management 您的部署,请参阅Cloud Manager 手册或Ops Manager 手册以执行访问控制。
Considerations
IP Binding
在版本 3.6 中更改。
从 MongoDB 3.6 开始,MongoDB 二进制文件mongod和mongos默认绑定到localhost
。从 MongoDB 版本 2.6 到 3.4,默认情况下,只有来自正式 MongoDB RPM(Red Hat,CentOS,Fedora Linux 和衍生产品)和 DEB(Debian,Ubuntu 和衍生产品)软件包的二进制文件会绑定到localhost
。要了解有关此更改的更多信息,请参见Localhost 绑定兼容性更改。
Operating System
本教程使用mongod程序。 Windows 用户应改用mongod.exe程序。
Keyfile Security
密钥文件是最低限度的安全性形式,最适合于测试或开发环境。对于生产环境,我们建议使用x.509 certificates。
Users
本教程介绍了在admin
数据库* only *上创建最少数量的 Management 用户。对于用户身份验证,本教程使用默认的SCRAM身份验证机制。质询响应安全机制最适合测试或开发环境。对于生产环境,我们建议使用x.509 certificates或LDAP 代理验证(仅适用于 MongoDB Enterprise)或Kerberos Authentication(仅适用于 MongoDB Enterprise)。
有关为特定身份验证机制创建用户的详细信息,请参阅特定身份验证机制页面。
有关创建和 Management 用户的最佳做法,请参见➤配置基于角色的访问控制。
Downtime
以下执行访问控制的过程需要停机。有关不需要停机的过程,请参见在不停机的情况下在副本集中实施密钥文件访问控制。
对现有副本集实施密钥文件访问控制
创建密钥文件。
通过keyfile身份验证,副本集中的每个mongod实例都将密钥文件的内容用作共享密码,以对部署中的其他成员进行身份验证。只有具有正确密钥文件的mongod个实例可以加入副本集。
密钥文件的内容长度必须在 6 到 1024 个字符之间,并且副本集的所有成员都必须相同。
Note
在 UNIX 系统上,密钥文件不得具有组或世界权限。在 Windows 系统上,不检查密钥文件权限。
您可以使用任何选择的方法来生成密钥文件。例如,以下操作使用openssl
生成用于密钥文件的复杂伪随机 1024 字符串。然后,它使用chmod
更改文件权限,以仅为文件所有者提供读取权限:
openssl rand -base64 756 > <path-to-keyfile>
chmod 400 <path-to-keyfile>
有关使用密钥文件的其他详细信息和要求,请参见Keyfiles。
将密钥文件复制到每个副本集成员。
将密钥文件复制到承载副本集成员的每个服务器上。确保运行mongod实例的用户是文件的所有者,并且可以访问密钥文件。
避免将密钥文件存储在易于与托管mongod实例的硬件断开连接的存储介质上,例如 USB 驱动器或网络连接的存储设备。
关闭副本集的所有成员。
从secondaries开始,关闭副本集中的每个mongod。continue 直到副本集的所有成员都脱机,包括任何arbiters。 primary必须是* last *成员关闭,以避免潜在的回滚。
要关闭mongod,请使用mongo shell 连接每个mongod并在admin
数据库上发出db.shutdownServer():
use admin
db.shutdownServer()
在此步骤结束时,副本集的所有成员应处于脱机状态。
强制执行访问控制,重新启动副本集的每个成员。
使用security.keyFile配置文件设置或--keyFile
命令行选项重新启动副本集中的* each * mongod。使用--keyFile
命令行选项或security.keyFile配置文件设置运行mongod会同时强制Internal Authentication和基于角色的访问控制。
Configuration File
如果使用配置文件,请设置
-
security.keyFile到密钥文件的路径,以及
-
副本集名称replication.replSetName。
包括配置所需的其他选项。例如,如果您希望远程 Client 端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定net.bindIp设置。有关更多信息,请参见Localhost 绑定兼容性更改。
security:
keyFile: <path-to-keyfile>
replication:
replSetName: <replicaSetName>
net:
bindIp: localhost,<ip address>
使用配置文件启动mongod:
mongod --config <path-to-config-file>
有关配置文件的更多信息,请参见configuration options。
Command Line
如果使用命令行选项,请使用以下选项启动mongod:
-
--keyFile
设置为密钥文件的路径,并且 -
--replSet
设置为副本集名称。
包括配置所需的其他选项。例如,如果您希望远程 Client 端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定--bind_ip
。有关更多信息,请参见Localhost 绑定兼容性更改。
mongod --keyFile <path-to-keyfile> --replSet <replicaSetName> --bind_ip localhost,<ip address of the mongod host>
有关命令行选项的更多信息,请参见mongod参考页。
使用 localhost 接口连接到主数据库。
将mongoShell 连接到localhost interface上的mongod实例之一。您必须在与mongod实例相同的物理计算机上运行mongo shell。
使用rs.status()标识primary副本集成员。如果您连接到主服务器,请 continue 执行下一步。如果不是,请通过localhost interface将mongoShell 连接到主 Shell。
Important
您必须先连接到primary,然后才能 continue。
创建用户 Management 员。
Important
创建第一个用户后,localhost exception将不再可用。
第一个用户必须具有创建其他用户(例如具有userAdminAnyDatabase的用户)的特权。这样可以确保您可以在Localhost Exception关闭后创建其他用户。
如果至少一个用户没有创建用户的特权,则在 localhost 异常关闭后,您可能无法使用新特权创建或修改用户,因此无法访问必要的操作。
使用db.createUser()方法添加用户。用户在admin
数据库上至少应具有userAdminAnyDatabase角色。
您必须连接到primary才能创建用户。
下面的示例在admin
数据库上创建具有userAdminAnyDatabase角色的用户fred
。
Important
密码应随机,长且复杂,以确保系统安全并防止或延迟恶意访问。
admin = db.getSiblingDB("admin")
admin.createUser(
{
user: "fred",
pwd: "changeme1",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
有关与数据库 Management 操作有关的内置角色的完整列表,请参见数据库用户角色。
以用户 Management 员身份进行身份验证。
验证到admin
数据库。
在mongo shell 中,使用db.auth()进行身份验证。例如,以下身份验证为用户 Management 员fred
:
db.getSiblingDB("admin").auth("fred", "changeme1" )
或者,使用-u <username>
,-p <password>
和--authenticationDatabase
参数将新的mongo shell 连接到主副本集成员。
mongo -u "fred" -p "changeme1" --authenticationDatabase "admin"
创建集群 Management 员(可选)。
群集 Management 员用户具有clusterAdmin角色,该角色授予对复制操作的访问权限。
创建集群 Management 员用户,并在admin
数据库中分配clusterAdmin角色:
db.getSiblingDB("admin").createUser(
{
"user" : "ravi",
"pwd" : "changeme2",
roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]
}
)
有关副本集操作的内置角色的完整列表,请参见集群 Management 角色。
创建其他用户(可选)。
创建用户以允许 Client 端连接副本集并与副本集进行交互。有关在创建只读和读写用户中使用的基本内置角色,请参见数据库用户角色。
您可能还需要其他 Management 用户。有关用户的更多信息,请参见Users。
x.509 内部身份验证
有关使用 x.509 进行内部身份验证的详细信息,请参阅使用 x.509 证书进行会员身份验证。
要将密钥文件内部身份验证升级到 x.509 内部身份验证,请参阅从密钥文件身份验证升级到 x.509 身份验证。