On this page
在分片群集中实施密钥文件访问控制
在本页面
Overview
在sharded cluster上执行访问控制需要配置:
使用Internal Authentication的群集组件之间的安全性。
使用基于角色的访问控制连接 Client 端和群集之间的安全性。
对于本教程,分片群集的每个成员必须使用相同的内部身份验证机制和设置。这意味着对群集中的每个mongos和mongod强制执行内部身份验证。
以下教程使用keyfile启用内部身份验证。
强制执行内部身份验证也会强制执行用户访问控制。要连接到副本集,诸如mongo shell 之类的 Client 端需要使用user account。参见Access Control。
CloudManager 和 OpsManager
如果 Cloud Manager 或 Ops Manager 正在 Management 您的部署,则会自动强制执行内部身份验证。
要在托管部署上配置访问控制,请参阅:Cloud Manager 手册或Ops Manager 手册中的Configure Access Control for MongoDB Deployments
。
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。
Access Control
本教程介绍了在admin
数据库* only *上创建最少数量的 Management 用户。对于用户身份验证,本教程使用默认的SCRAM身份验证机制。质询响应安全机制最适合测试或开发环境。对于生产环境,我们建议使用x.509 certificates或LDAP 代理验证(仅适用于 MongoDB Enterprise)或Kerberos Authentication(仅适用于 MongoDB Enterprise)。
有关为特定身份验证机制创建用户的详细信息,请参阅特定身份验证机制页面。
有关创建和 Management 用户的最佳做法,请参见➤配置基于角色的访问控制。
Users
通常,要为分片群集创建用户,请连接到mongos并添加分片群集用户。
但是,某些维护操作需要直接连接到分片群集中的特定分片。要执行这些操作,您必须直接连接到分片并以分片本地 Management 用户身份进行身份验证。
分片本地用户仅存在于特定分片中,并且仅应用于分片特定的维护和配置。您无法使用本地分片用户连接到mongos。
有关更多信息,请参见Users安全文档。
Downtime
升级分片群集以实施访问控制需要停机。
Procedures
在现有分片群集部署中强制执行密钥文件内部身份验证
创建密钥文件。
通过keyfile身份验证,分片群集中的每个mongod或mongos实例都将密钥文件的内容用作共享密码,以对部署中的其他成员进行身份验证。具有正确密钥文件的mongod或mongos实例只能加入分片群集。
密钥文件的内容长度必须在 6 到 1024 个字符之间,并且对于分片群集的所有成员都必须相同。
Note
在 UNIX 系统上,密钥文件不得具有组或世界权限。在 Windows 系统上,不检查密钥文件权限。
您可以使用任何选择的方法来生成密钥文件。例如,以下操作使用openssl
生成用于密钥文件的复杂伪随机 1024 字符串。然后,它使用chmod
更改文件权限,以仅为文件所有者提供读取权限:
openssl rand -base64 756 > <path-to-keyfile>
chmod 400 <path-to-keyfile>
有关使用密钥文件的其他详细信息和要求,请参见Keyfiles。
将密钥文件复制到分片群集中的每个组件。
承载分片群集的mongod或mongos组件的每个服务器都必须包含密钥文件的副本。
将密钥文件复制到托管分片集群成员的每个服务器。确保运行mongod或mongos实例的用户是文件的所有者,并且可以访问密钥文件。
避免将密钥文件存储在易于与托管mongod或mongos实例的硬件断开连接的存储介质上,例如 USB 驱动器或网络连接的存储设备。
禁用平衡器。
sh.stopBalancer()
如果正在进行迁移,平衡器可能不会立即停止。 sh.stopBalancer()方法阻止 Shell 程序,直到平衡器停止。
使用sh.getBalancerState()验证平衡器已停止。
sh.getBalancerState()
Important
在平衡器停止运行之前,请勿 continue。
有关配置分片群集平衡器行为的教程,请参见Management 分片集群平衡器。
关闭分片群集的所有 mongos 实例。
使用admin
数据库上的db.shutdownServer()方法安全关闭mongos:
db.getSiblingDB("admin").shutdownServer()
重复该操作,直到群集中的所有mongos实例都脱机。
完成此步骤后,群集中的所有mongos实例都应处于脱机状态。
关闭配置服务器 mongod 实例。
将mongoShell 连接到配置服务器部署中的每个mongod并将其关闭。
对于副本集配置服务器部署,最后关闭primary成员。
使用admin
数据库上的db.shutdownServer()方法安全关闭mongod:
db.getSiblingDB("admin").shutdownServer()
重复直到所有配置服务器都脱机。
关闭分片副本集 mongod 实例。
对于每个分片副本集,将mongo shell 连接到副本集中的每个mongod成员,然后将其关闭。最后关闭primary成员。
使用admin
数据库上的db.shutdownServer()方法安全关闭mongod:
db.getSiblingDB("admin").shutdownServer()
对每个分片副本集重复此步骤,直到所有分片副本集中的所有mongod实例都脱机。
完成此步骤后,整个分片群集应处于脱机状态。
在配置服务器上强制执行访问控制。
在配置服务器副本集中启动* each * mongod。包括keyFile
设置。 keyFile
设置同时强制Internal Authentication和基于角色的访问控制。
您可以通过配置文件或命令行指定mongod设置。
Configuration File
如果对配置服务器副本集使用configuration file,则将security.keyFile设置为密钥文件的路径,将sharding.clusterRole设置为configsvr
,并将replication.replSetName设置为配置服务器副本集的名称。
security:
keyFile: <path-to-keyfile>
sharding:
clusterRole: configsvr
replication:
replSetName: <setname>
storage:
dbpath: <path>
包括配置所需的其他选项。例如,如果您希望远程 Client 端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定net.bindIp设置。有关更多信息,请参见Localhost 绑定兼容性更改。
启动mongod,指定--config
选项和配置文件的路径。
mongod --config <path-to-config>
Command Line
如果使用命令行参数,则对于配置服务器副本集,请使用-keyFile
,--configsvr
和--replSet
参数启动mongod。
mongod --keyFile <path-to-keyfile> --configsvr --replSet <setname> --dbpath <path>
包括配置所需的其他选项。例如,如果您希望远程 Client 端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定--bind_ip
。有关更多信息,请参见Localhost 绑定兼容性更改。
有关命令行选项的更多信息,请参见mongod参考页。
重新启动每个成员时,请确保使用原始副本集名称。您不能更改副本集的名称。
对分片群集中的每个分片实施访问控制。
使用keyFile
参数运行mongod会同时强制Internal Authentication和基于角色的访问控制。
使用配置文件或命令行在副本集中启动每个 mongod。
Configuration File
如果使用configuration file,请将security.keyFile选项设置为密钥文件的路径,并将replication.replSetName选项设置为副本集的原始名称。
security:
keyFile: <path-to-keyfile>
replication:
replSetName: <setname>
storage:
dbPath: <path>
包括配置所需的其他选项。例如,如果您希望远程 Client 端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定net.bindIp设置。有关更多信息,请参见Localhost 绑定兼容性更改。
启动mongod,指定--config
选项和配置文件的路径。
mongod --config <path-to-config-file>
Command Line
如果使用命令行参数,请启动mongod并指定--keyFile
和--replSet
参数。
mongod --keyfile <path-to-keyfile> --replSet <setname> --dbpath <path>
包括配置所需的其他选项。例如,如果您希望远程 Client 端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定--bind_ip
。有关更多信息,请参见Localhost 绑定兼容性更改。
有关启动参数的更多信息,请参见mongod参考页。
重新启动每个成员时,请确保使用原始副本集名称。您不能更改副本集的名称。
重复此步骤,直到集群中的所有分片都处于联机状态。
创建分片本地用户 Management 员(可选)。
Important
Localhost Exception允许通过 localhost 接口连接的 Client 端在mongod强制访问控制上创建用户。创建第一个用户后,Localhost Exception关闭。
第一个用户必须具有创建其他用户(例如具有userAdminAnyDatabase的用户)的特权。这样可以确保您可以在Localhost Exception关闭后创建其他用户。
如果至少一个用户没有没有创建用户的特权,则在 localhost 异常关闭后,您可能无法使用新特权创建或修改用户,因此无法访问某些功能或操作。
对于群集中的每个分片副本集,将_Shell 通过localhost interface连接到primary成员。您必须与目标mongod在同一台计算机上运行mongo才能使用 localhost 接口。
在admin
数据库上创建一个具有userAdminAnyDatabase
角色的用户。该用户可以根据需要为分片副本集创建其他用户。创建此用户也会关闭Localhost Exception。
下面的示例在admin
数据库上创建本地本地用户fred
。
Important
密码应随机,长且复杂,以确保系统安全并防止或延迟恶意访问。
admin = db.getSiblingDB("admin")
admin.createUser(
{
user: "fred",
pwd: "changeme1",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
对 mongos 服务器执行访问控制。
使用keyFile
参数运行mongod会同时强制Internal Authentication和基于角色的访问控制。
使用配置文件或命令行在副本集中启动每个 mongos。
Configuration File
如果使用configuration file,请将security.keyFile设置为密钥文件的路径,并将sharding.configDB设置为副本集的名称,并且副本集的至少一个成员应使用<replSetName>/<host:port>
格式。
security:
keyFile: <path-to-keyfile>
sharding:
configDB: <configReplSetName>/cfg1.example.net:27019,cfg2.example.net:27019,...
包括配置所需的其他选项。例如,如果您希望远程 Client 端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定net.bindIp设置。有关更多信息,请参见Localhost 绑定兼容性更改。
启动mongos,指定--config
选项和配置文件的路径。
mongos --config <path-to-config-file>
Command Line
如果使用命令行参数,请启动mongos并指定--keyFile
和--configdb
参数。
mongos --keyFile <path-to-keyfile> --configdb <configReplSetName>/cfg1.example.net:27019,cfg2.example.net:27019,...
包括配置所需的其他选项。例如,如果您希望远程 Client 端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定--bind_ip
。有关更多信息,请参见Localhost 绑定兼容性更改。
此时,整个分片群集都重新联机,并且可以使用指定的密钥文件在内部进行通信。但是,诸如mongo shell 之类的外部程序需要使用正确配置的用户才能读取或写入集群。
通过 localhost 接口连接到 mongos 实例。
将mongoShell 连接到localhost interface上的mongos实例之一。您必须在与mongos实例相同的物理计算机上运行mongo shell。
localhost interface仅由于没有为部署创建用户而可用。 localhost interface在创建第一个用户后关闭。
创建用户 Management 员。
Important
创建第一个用户后,localhost exception将不再可用。
第一个用户必须具有创建其他用户(例如具有userAdminAnyDatabase的用户)的特权。这样可以确保您可以在Localhost Exception关闭后创建其他用户。
如果至少一个用户没有创建用户的特权,那么在 localhost 异常关闭后,您将无法创建或修改用户,因此可能无法执行必要的操作。
使用db.createUser()方法添加用户。用户在admin
数据库上至少应具有userAdminAnyDatabase角色。
Important
密码应随机,长且复杂,以确保系统安全并防止或延迟恶意访问。
下面的示例在admin
数据库上创建用户fred
:
admin = db.getSiblingDB("admin")
admin.createUser(
{
user: "fred",
pwd: "changeme1",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
有关与数据库 Management 操作有关的内置角色的完整列表,请参见数据库用户角色。
以用户 Management 员身份进行身份验证。
使用db.auth()验证用户 Management 员身份以创建其他用户:
db.getSiblingDB("admin").auth("fred", "changeme1" )
或者,使用-u <username>
,-p <password>
和--authenticationDatabase "admin"
参数将新的mongo shell 连接到目标副本集成员。您必须使用Localhost Exception连接到mongos。
mongo -u "fred" -p "changeme1" --authenticationDatabase "admin"
为群集 Management 创建 Management 用户
集群 Management 员用户对分片集群具有clusterAdmin角色,而对分片本地集群 Management 员则不是。
下面的示例在admin
数据库上创建用户ravi
。
Important
密码应随机,长且复杂,以确保系统安全并防止或延迟恶意访问。
db.getSiblingDB("admin").createUser(
{
"user" : "ravi",
"pwd" : "changeme2",
roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]
}
)
有关副本集和分片群集操作的内置角色的完整列表,请参见集群 Management 角色。
以集群 Management 员身份验证。
要执行分片操作,请使用db.auth()方法或具有username
,password
和authenticationDatabase
参数的新mongo shell 作为clusterAdmin用户进行身份验证。
Note
这是分片群集的群集 Management 员,不是分片本地群集 Management 员。
启动平衡器。
启动平衡器。
sh.startBalancer()
使用sh.getBalancerState()验证平衡器已启动。
有关分片群集平衡器的教程,请参见Management 分片集群平衡器。
创建其他用户(可选)。
创建用户以允许 Client 端连接和访问分片群集。请参阅数据库用户角色以获取可用的内置角色,例如read和readWrite。您可能还需要其他 Management 用户。有关用户的更多信息,请参见Users。
要创建其他用户,您必须认证为具有userAdminAnyDatabase或userAdmin角色的用户。
x.509 内部身份验证
有关使用 x.509 进行内部身份验证的详细信息,请参阅使用 x.509 证书进行会员身份验证。
要将密钥文件内部身份验证升级到 x.509 内部身份验证,请参阅从密钥文件身份验证升级到 x.509 身份验证。
See also