在本页面
在分片群集上实施访问控制需要配置:
对于本教程,分片群集的每个成员必须使用相同的内部身份验证机制和设置。这意味着在每个实施内部验证mongos
和mongod
在群集中。
以下教程使用密钥文件来启用内部身份验证。
强制执行内部身份验证也会强制执行用户访问控制。要连接到副本集,mongo
外壳程序之类的客户端需要使用用户帐户。请参阅
访问控制。
如果Cloud Manager或Ops Manager正在管理您的部署,则会自动强制执行内部身份验证。
要在托管部署上配置访问控制,请参阅:
在Cloud Manager手册
或Ops Manager手册中。Configure Access Control for MongoDB Deployments
小费
如果可能,请使用逻辑DNS主机名而不是IP地址,尤其是在配置副本集成员或分片群集成员时。逻辑DNS主机名的使用避免了由于IP地址更改而导致的配置更改。
在版本3.6中更改。
从MongoDB 3.6,MongoDB二进制文件mongod
和开始
mongos
,localhost
默认情况下绑定到。从MongoDB 2.6到3.4版本localhost
,默认情况下仅绑定来自正式MongoDB RPM(Red Hat,CentOS,Fedora Linux和衍生产品)和DEB(Debian,Ubuntu和衍生产品)的二进制文件
。要了解有关此更改的更多信息,请参阅
Localhost绑定兼容性更改。
本教程主要涉及该mongod
过程。Windows用户应改用该mongod.exe
程序。
本教程仅介绍在admin
数据库上创建最少数量的管理用户。对于用户身份验证,本教程使用默认的SCRAM
身份验证机制。质询响应安全机制最适合测试或开发环境。对于生产环境,我们建议使用x.509证书或LDAP代理身份验证
(仅适用于MongoDB Enterprise)或Kerberos身份验证
(仅适用于MongoDB Enterprise)。
有关为特定身份验证机制创建用户的详细信息,请参阅特定身份验证机制页面。
有关创建和管理用户的最佳实践,请参见➤配置基于角色的访问控制。
通常,要为分片群集创建用户,请连接到
mongos
并添加分片群集用户。
但是,某些维护操作需要直接连接到分片群集中的特定分片。要执行这些操作,必须直接连接到分片并以分片本地管理用户身份进行身份验证。
分片本地用户仅存在于特定分片中,并且仅应用于分片特定的维护和配置。您无法mongos
使用分片本地用户连接到。
有关更多信息,请参见用户安全性文档。
升级分片群集以实施访问控制需要停机。
与密钥文件身份验证,每个
mongod
或mongos
实例的分片集群中使用密钥文件作为用于在部署认证其他成员共享密码的内容。只有
mongod
或mongos
具有正确密钥文件的实例可以加入分片群集。
注意
从MongoDB 4.2开始,用于内部成员身份验证的密钥文件使用YAML格式,以允许密钥文件中包含多个密钥。YAML格式接受以下内容:
YAML格式与使用文本文件格式的现有单键密钥文件兼容。
密钥的长度必须在6到1024个字符之间,并且只能包含base64集中的字符。分片群集的所有成员必须共享至少一个公共密钥。
注意
在UNIX系统上,密钥文件不得具有组或世界权限。在Windows系统上,不检查密钥文件权限。
您可以使用任何选择的方法来生成密钥文件。例如,以下操作用于openssl
生成复杂的伪随机1024字符串,用作共享密码。然后,它chmod
用于更改文件许可权,以仅为文件所有者提供读取许可权:
如果正在进行迁移,则平衡器可能不会立即停止。该sh.stopBalancer()
方法将阻塞外壳,直到平衡器停止。
从MongoDB 4.2开始,sh.stopBalancer()
还会禁用分片群集的自动拆分。
使用sh.getBalancerState()
验证平衡器已停止。
重要
在平衡器停止运行之前,请勿继续。
有关配置分片群集平衡器行为的教程,请参阅管理分片群集平衡器。
启动配置服务器副本集中的每个 mongod
副本。包括keyFile
设置。该keyFile
设置将同时实施内部/成员身份验证和
基于角色的访问控制。
您可以mongod
通过配置文件或命令行指定设置。
配置文件
如果使用配置文件,对于配置的服务器副本集,设置security.keyFile
为密钥文件的路径,
sharding.clusterRole
来configsvr
,并
replication.replSetName
到配置服务器副本集的名称。
包括配置所需的其他选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定net.bindIp
设置。有关更多信息,请参见Localhost绑定兼容性更改。
开始mongod
指定--config
选项和配置文件的路径。
命令行
如果使用命令行参数,对于配置的服务器副本集,开始mongod
用-keyFile
,
--configsvr
和--replSet
参数。
包括配置所需的其他选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定
--bind_ip
。有关更多信息,请参见
Localhost绑定兼容性更改。
有关命令行选项的更多信息,请参见
mongod
参考页。
重新启动每个成员时,请确保使用原始副本集名称。您不能更改副本集的名称。
mongod
使用keyFile
参数运行会同时强制执行
内部/成员身份验证和
基于角色的访问控制。
使用配置文件或命令行启动副本集中的每个 mongod
副本。
配置文件
如果使用配置文件,请将
security.keyFile
选项设置为密钥文件的路径,并将
replication.replSetName
选项设置为副本集的原始名称。
包括配置所需的其他选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定net.bindIp
设置。有关更多信息,请参见Localhost绑定兼容性更改。
开始mongod
指定--config
选项和配置文件的路径。
命令行
如果使用命令行参数,请启动mongod
并指定--keyFile
和--replSet
参数。
包括配置所需的其他选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定
--bind_ip
。有关更多信息,请参见
Localhost绑定兼容性更改。
有关启动参数的更多信息,请参见mongod
参考页。
重新启动每个成员时,请确保使用原始副本集名称。您不能更改副本集的名称。
重复此步骤,直到集群中的所有分片都处于联机状态。
重要
该本地主机例外允许连接在本地主机接口创建一个用户的客户端mongod
强制执行访问控制。创建第一个用户后,Localhost异常关闭。
第一个用户必须具有创建其他用户(例如具有的用户)的特权userAdminAnyDatabase
。这样可以确保您可以在Localhost Exception
关闭后创建其他用户。
如果至少一个用户就不能有权限创建用户,一旦本地主机异常关闭您可能无法创建或修改用户权限的新,因此无法访问某些功能或操作。
对于群集中的每个分片副本集,请通过localhost接口将mongo
外壳连接到主要成员。您必须与目标在同一台计算机上运行,才能使用localhost接口。mongo
mongod
创建一个具有数据库userAdminAnyDatabase
角色的用户admin
。该用户可以根据需要为分片副本集创建其他用户。创建此用户还会关闭Localhost Exception。
以下示例fred
在admin
数据库上
创建分片本地用户。
重要
密码应随机,长且复杂,以确保系统安全并防止或延迟恶意访问。
小费
从mongo
Shell的4.2版本开始,您可以将该passwordPrompt()
方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。但是,您仍然可以像在早期版本的mongo
Shell中一样直接指定密码
。
mongos
服务器实施访问控制。¶mongod
使用keyFile
参数运行会同时强制执行
内部/成员身份验证和
基于角色的访问控制。
使用配置文件或命令行启动副本集中的每个 mongos
副本。
配置文件
如果使用配置文件,则将设置
security.keyFile
为密钥文件的路径,将
sharding.configDB
设置为副本集名称,并以<replSetName>/<host:port>
格式设置副本集的至少一个成员。
包括配置所需的其他选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定net.bindIp
设置。有关更多信息,请参见Localhost绑定兼容性更改。
开始mongos
指定--config
选项和配置文件的路径。
命令行
如果使用命令行参数,请启动mongos
并指定--keyFile
和--configdb
参数。
包括配置所需的其他选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定
--bind_ip
。有关更多信息,请参见
Localhost绑定兼容性更改。
此时,整个分片群集都重新联机,并且可以使用指定的密钥文件在内部进行通信。但是,外部程序(如mongo
外壳程序)需要使用正确配置的用户才能读取或写入集群。
重要
创建第一个用户后,localhost异常不再可用。
第一个用户必须具有创建其他用户(例如具有的用户)的特权userAdminAnyDatabase
。这样可以确保您可以在Localhost Exception
关闭后创建其他用户。
如果至少一个用户就不能有权限创建用户,一旦本地主机异常关闭您不能创建或修改用户,因此可能无法进行必要的操作。
使用db.createUser()
方法添加用户。用户应至少具有数据库userAdminAnyDatabase
角色
admin
。
重要
密码应随机,长且复杂,以确保系统安全并防止或延迟恶意访问。
以下示例fred
在admin
数据库上
创建用户:
小费
从mongo
Shell的4.2版本开始,您可以将该passwordPrompt()
方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。但是,您仍然可以像在早期版本的mongo
Shell中一样直接指定密码
。
使用db.auth()
为用户管理员身份验证创建其他用户:
小费
从mongo
Shell的4.2版本开始,您可以将该passwordPrompt()
方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。但是,您仍然可以像在早期版本的mongo
Shell中一样直接指定密码
。
出现提示时输入密码。
可替代地,连接新的mongo
使用外壳到目标副本集部件,和参数。您必须使用Localhost Exception才能连接到。-u <username>
-p <password>
--authenticationDatabase "admin"
mongos
集群管理员用户具有分片集群的clusterAdmin
角色,而不是分片本地集群管理员。
以下示例ravi
在admin
数据库上创建用户。
重要
密码应随机,长且复杂,以确保系统安全并防止或延迟恶意访问。
小费
从mongo
Shell的4.2版本开始,您可以将该passwordPrompt()
方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。但是,您仍然可以像在早期版本的mongo
Shell中一样直接指定密码
。