MongoDB分片群集可以强制执行用户身份验证以及其组件的内部身份验证,以防止未经授权的访问。
以下教程描述了一个过程security.transitionToAuth,该过程
用于过渡现有分片群集以强制执行身份验证而不会造成停机。
在尝试本教程之前,请熟悉本文档的内容。
如果您使用Cloud Manager或Ops Manager来管理部署,请参阅Cloud Manager手册 或Ops Manager手册 中的“ 为MongoDB部署配置访问控制”以强制执行身份验证。
在版本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或mongos实例的分片集群中使用密钥文件作为用于在部署认证其他成员共享密码的内容。只有
mongod或mongos具有正确密钥文件的实例可以加入分片群集。
注意
从MongoDB 4.2开始,用于内部成员身份验证的密钥文件使用YAML格式,以允许密钥文件中包含多个密钥。YAML格式接受以下内容:
YAML格式与使用文本文件格式的现有单键密钥文件兼容。
密钥的长度必须在6到1024个字符之间,并且只能包含base64集中的字符。分片群集的所有成员必须共享至少一个公共密钥。
注意
在UNIX系统上,密钥文件不得具有组或世界权限。在Windows系统上,不检查密钥文件权限。
您可以使用任何选择的方法来生成密钥文件。例如,以下操作用于openssl生成复杂的伪随机1024字符串,用作共享密码。然后,它chmod用于更改文件许可权,以仅为文件所有者提供读取许可权:
将密钥文件复制到托管分片集群成员的每个服务器。确保运行mongod或mongos实例的用户是文件的所有者,并且可以访问密钥文件。
避免存储关于可从托管的硬件来容易地断开连接的存储介质的密钥文件mongod或mongos实例,诸如USB驱动器或网络连接的存储设备。
您必须连接到mongos才能完成本节中的步骤。在这些步骤中创建的用户是群集级用户,不能用于访问各个分片副本集。
使用该db.createUser()方法创建管理员用户并为其分配以下角色:
clusterAdmin在admin数据库上userAdmin在admin数据库上的角色在分片群集上执行维护操作或用户管理操作的客户端必须在本教程完成时以该用户身份进行身份验证。立即创建此用户,以确保您在执行身份验证后可以访问群集。
重要
密码应随机,长且复杂,以防止或阻止恶意访问。
mongos实例以执行身份验证¶mongos配置文件。¶对于每个mongos:
复制现有的mongos配置文件,并为其指定一个不同的名称,例如<filename>-secure.conf(或.cfg使用Windows)。您将使用此新配置文件转换,mongos以在分片群集中强制执行身份验证。保留原始配置文件以用于备份。
在新的配置文件中,添加以下设置:
security.transitionToAuth 设置 true
security.keyFile 设置为密钥文件路径。
如果使用其他内部认证机制,请指定适合该机制的设置。
新的配置文件应包含以前使用的所有配置设置mongos以及新的安全设置。
在本节的最后,分片mongos群集中的所有实例都使用身份验证security.transitionToAuth
和security.keyFile内部身份验证运行。
mongod配置文件。¶对于mongod配置服务器副本集中的每个副本,
复制现有的mongod配置文件,并为其指定一个不同的名称,例如<filename>-secure.conf(或.cfg使用Windows)。您将使用此新配置文件转换,mongod以在分片群集中强制执行身份验证。保留原始配置文件以用于备份。
在新的配置文件中,添加以下设置:
security.transitionToAuth 设置 true
security.keyFile 设置为密钥文件路径。
如果使用其他内部认证机制,请指定适合该机制的设置。
mongod用新的配置文件重新启动。¶重新启动副本集,一次启动一个成员,从 次要成员开始。
要一次重新启动辅助成员,
连接到,mongod并对
数据库使用该
db.shutdownServer()方法admin来安全关闭mongod。
mongod使用新的配置文件重新启动,并使用来指定配置文件的路径--config。例如,如果新的配置文件名为mongod-secure.conf:
其中<path>代表包含新配置文件的文件夹的系统路径。
一旦该成员启动,对下一个辅助成员重复一次。
一旦所有辅助成员都重新启动并启动,请重新启动主要成员:
连接到mongod。
使用该rs.stepDown()方法可以降低主要级别并触发选举。
您可以使用该rs.status()方法来确保副本集选择了新的主数据库。
降级主要数据库并选择了新的主要
数据库后,请使用db.shutdownServer()针对admin数据库的方法关闭旧的主要
数据库。
mongod使用新的配置文件重新启动,并使用来指定配置文件的路径
--config。例如,如果新的配置文件名为mongod-secure.conf:
其中<path>代表包含新配置文件的文件夹的系统路径。
在本节结束时,所有mongod在配置服务器副本集实例与运行security.transitionToAuth和
security.keyFile内部认证。
在实施身份验证的分片群集中,每个分片副本集应具有自己的分片本地管理员。您不能对一个分片使用分片本地管理员来访问另一个分片或分片的集群。
连接到每个分片副本集的主要成员,并使用db.createUser()方法创建用户,并为其分配以下角色:
clusterAdmin在admin数据库上userAdmin在admin数据库上的角色小费
从mongoShell的4.2版本开始,您可以将该passwordPrompt()方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。但是,您仍然可以像在早期版本的mongoShell中一样直接指定密码
。
在完成本教程后,如果要连接到分片以执行需要直接连接到分片的维护操作,则必须以本地分片管理员身份进行身份验证。
注意
与分片的直接连接仅应用于分片特定的维护和配置。通常,客户端应通过来连接到分片群集mongos。
一次转换一个分片副本集,对分片群集中的每个分片副本集重复这些步骤。
mongod配置文件。¶对于分片mongod副本集中的每个副本,
复制现有的mongod配置文件,并为其指定一个不同的名称,例如<filename>-secure.conf(或.cfg使用Windows)。您将使用此新配置文件转换,mongod以在分片群集中强制执行身份验证。保留原始配置文件以用于备份。
在新的配置文件中,添加以下设置:
security.transitionToAuth 设置 true
security.keyFile 设置为密钥文件路径。
如果使用其他内部认证机制,请指定适合该机制的设置。
mongod用新的配置文件重新启动。¶重新启动副本集,一次启动一个成员,从 次要成员开始。
要一次重新启动辅助成员,
连接到,mongod并对
数据库使用该
db.shutdownServer()方法admin来安全关闭mongod。
mongod使用新的配置文件重新启动,并使用来指定配置文件的路径--config。例如,如果新的配置文件名为mongod-secure.conf:
其中<path>代表包含新配置文件的文件夹的系统路径。
一旦此成员启动,请对副本集的下一个辅助成员重复操作,直到所有辅助副本都已更新。
一旦所有辅助成员都重新启动并启动,请重新启动主要成员:
连接到mongod。
使用该rs.stepDown()方法可以降低主要级别并触发选举。
您可以使用该rs.status()方法来确保副本集选择了新的主数据库。
降级主要数据库并选择了新的主要
数据库后,请使用db.shutdownServer()针对admin数据库的方法关闭旧的主要
数据库。
mongod使用新的配置文件重新启动,并使用来指定配置文件的路径
--config。例如,如果新的配置文件名为mongod-secure.conf:
其中<path>代表包含新配置文件的文件夹的系统路径。
在教程这一点上,分片集群的每个分量与运行--transitionToAuth和security.keyFile
内部验证。分片群集至少有一个管理用户,并且每个分片副本集都有一个分片本地管理用户。
其余部分涉及将分片群集从过渡状态中移出以完全实施身份验证。
mongos实例,不带transitionToAuth¶重要
在本节末尾,客户端必须指定身份验证凭据才能连接到分片群集。在完成本节之前,请更新客户端以指定身份验证凭据,以避免失去连接。
要完成到分片群集中完全强制身份验证的过渡,您必须在mongos没有security.transitionToAuth设置的情况下重新启动每个实例。
transitionToAuth从mongos配置文件中删除。¶从本教程创建security.transitionToAuth的mongos配置文件中删除密钥及其值。保留security.keyFile在教程中添加的设置。