为了防止未经授权的访问,请对您的部署强制执行身份验证。副本集的身份验证 包括副本集成员之间的内部身份验证,以及 对连接到副本集的客户端的用户访问控制。
如果您的部署不强制执行身份验证,则MongoDB 3.4+会提供
--transitionToAuth
用于执行无停机升级以强制执行身份验证的选项。
3.4版中的新功能: MongoDB 3.2和更早版本不支持无停机升级来强制执行身份验证。有关在现有MongoDB 3.2副本集中执行身份验证的信息,请参阅将 更新副本集设置为密钥文件身份验证。
本教程使用密钥文件内部身份验证机制来实现内部安全性,并 使用基于SCRAM的基于角色的访问控制来进行客户端连接。
如果您使用Cloud Manager或Ops Manager来管理您的部署,请参阅相应的Cloud Manager手册 或Ops Manager手册以强制进行身份验证。
一个mongod
与运行--transitionToAuth
同时接受认证和非认证连接。mongod
在此过渡状态期间连接到的客户端
可以在任何数据库上执行读取,写入和管理操作。
在以下过程结束时,副本集将拒绝任何尝试建立未经身份验证的连接的客户端。该过程将创建 用户,供客户端应用程序在连接到副本集时使用。
请参见➤配置基于角色的访问控制以获取用户创建和管理最佳实践。
在版本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绑定兼容性更改。
重要
密码应随机,长且复杂,以确保系统安全并防止或延迟恶意访问。
小费
如果可能,请使用逻辑DNS主机名而不是IP地址,尤其是在配置副本集成员或分片群集成员时。逻辑DNS主机名的使用避免了由于IP地址更改而导致的配置更改。
连接到主要用户以创建具有userAdminAnyDatabase
角色的用户
。该
userAdminAnyDatabase
角色授予对部署中任何数据库上的用户创建的访问权限。
以下示例在数据库中创建fred
具有
userAdminAnyDatabase
角色的用户admin
。
重要
密码应随机,长且复杂,以确保系统安全并防止或延迟恶意访问。
小费
从mongo
Shell的4.2版本开始,您可以将该passwordPrompt()
方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。但是,您仍然可以像在早期版本的mongo
Shell中一样直接指定密码
。
完成此过程后,任何管理副本集中用户的客户端都必须以该用户或具有类似权限的用户身份进行身份验证。
连接到主要用户以创建具有clusterAdmin
角色的用户
。该clusterAdmin
角色授予访问复制操作的权限,例如配置副本集。
以下示例在数据库中创建ravi
具有
clusterAdmin
角色的用户admin
。
重要
密码应随机,长且复杂,以确保系统安全并防止或延迟恶意访问。
小费
从mongo
Shell的4.2版本开始,您可以将该passwordPrompt()
方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。但是,您仍然可以像在早期版本的mongo
Shell中一样直接指定密码
。
完成此过程后,任何管理或维护副本集的客户端都必须以该用户或具有类似权限的用户身份进行身份验证。
创建用户以允许客户端应用程序连接副本集并与之交互。在完成本教程后,客户端必须以配置用户身份进行身份验证才能连接到副本集。
有关在创建只读和读写用户中使用的基本内置角色,请参见数据库用户角色。
以下创建具有foo
数据库读取和写入权限的用户。
重要
密码应随机,长且复杂,以确保系统安全并防止或延迟恶意访问。
readWrite
在foo
数据库中创建一个具有该角色的用户
。
小费
从mongo
Shell的4.2版本开始,您可以将该passwordPrompt()
方法与各种用户身份验证/管理方法/命令结合使用,以提示输入密码,而不是直接在方法/命令调用中指定密码。但是,您仍然可以像在早期版本的mongo
Shell中一样直接指定密码
。
以此用户身份验证的客户端可以对foo
数据库执行读取和写入操作。有关创建到副本集的已验证连接的更多信息,请参见验证用户。
在此过程的这一点上,副本集不强制执行身份验证。但是,客户端应用程序仍可以指定身份验证凭据并连接到副本集。
更新客户端应用程序以使用配置的用户对副本集进行身份验证。经过身份验证的连接需要用户名,密码和身份验证数据库。请参阅验证用户。
例如,以下内容连接到名为mongoRepl
并以user身份验证的副本集joe
。
如果未在-p
命令行选项中指定密码,则mongo
Shell会提示您输入密码。
如果您的应用程序使用MongoDB驱动程序,请参阅相关的 驱动程序文档,以获取有关创建经过身份验证的连接的说明。
完成本教程后,副本集将拒绝未经身份验证的客户端连接。现在执行此步骤可确保客户端可以在过渡之前和之后连接到副本集。
通过密钥文件认证,mongod
副本集中的每个
实例都将密钥文件的内容用作共享密码,以认证部署中的其他成员。只有
mongod
具有正确密钥文件的实例才能加入副本集。
注意
从MongoDB 4.2开始,用于内部成员身份验证的密钥文件使用YAML格式,以允许密钥文件中包含多个密钥。YAML格式接受以下内容:
YAML格式与使用文本文件格式的现有单键密钥文件兼容。
密钥的长度必须在6到1024个字符之间,并且只能包含base64集中的字符。副本集的所有成员必须共享至少一个公共密钥。
注意
在UNIX系统上,密钥文件不得具有组或世界权限。在Windows系统上,不检查密钥文件权限。
您可以使用任何选择的方法来生成密钥文件。例如,以下操作用于openssl
生成复杂的伪随机1024字符串,用作共享密码。然后,它chmod
用于更改文件许可权,以仅为文件所有者提供读取许可权:
transitionToAuth
。¶security.transitionToAuth
设置。启动
mongod
与security.transitionToAuth
设置为
true
地方处于过渡状态,其中它可以接受并同时创建认证和非认证连接的实例。security.keyFile
。您必须一次重新启动每个成员,以确保副本集中的大多数成员保持联机。
从mongo
连接到辅助服务器或仲裁服务器的外壳上,db.shutdownServer()
对admin
数据库发出。
transitionToAuth
在配置文件中指定以下设置。
security.keyFile
,以及密钥文件的路径。replication.replSetName
到原始副本集名称。security.transitionToAuth
到true
。开始在MongoDB中3.6,mongod
并mongos
绑定默认为localhost。如果部署的成员在不同的主机上运行,或者希望远程客户端连接到部署,则必须指定net.bindIp
设置。有关更多信息,请参见Localhost绑定兼容性更改。
启动时,请指定--config
选项以及配置文件的路径mongod
。
有关配置文件的更多信息,请参阅 配置选项。
另外,您可以在启动时使用等效的mongod
命令行选项(例如--transitionToAuth
和
--keyFile
)mongod
。有关mongod
选项的完整列表,请参见
参考页。
包括适合您的部署的其他设置。
在此步骤结束时,所有次要和仲裁程序都应在security.transitionToAuth
设置为的情况下启动并运行true
。
--transitionToAuth
。¶降低副本集中的主要成员并重新启动该成员,包括其配置:
security.transitionToAuth
设置。启动
mongod
与security.transitionToAuth
设置为
true
地方处于过渡状态,其中它可以接受并同时创建认证和非认证连接的实例。security.keyFile
。使用mongo
外壳连接到主要数据库,然后使用rs.stepDown()
方法降级主要数据库。
transitionToAuth
在配置文件中指定以下设置。
security.keyFile
,以及密钥文件的路径。replication.replSetName
到原始副本集名称。security.transitionToAuth
到true
。包括配置所需的其他选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定net.bindIp
设置。有关更多信息,请参见Localhost绑定兼容性更改。
开始mongod
使用配置文件。
有关配置文件的更多信息,请参阅 配置选项。
另外,您可以在启动时使用等效的mongod
命令行选项(例如--transitionToAuth
和
--keyFile
)mongod
。有关mongod
选项的完整列表,请参见
参考页。
包括适合您的部署的其他设置。
在此步骤结束时,副本集的所有成员都应已启动并正在运行,并security.transitionToAuth
设置为true
并将其security.keyFile
设置为密钥文件路径。
--transitionToAuth
重新启动副本集中的每个辅助成员或仲裁者成员,并security.transitionToAuth
在重新启动时删除该选项。您必须一次执行一次此操作,以确保副本集中的大多数成员保持联机状态。
如果大多数副本集成员同时处于脱机状态,则副本集可能会进入只读模式。
连接到mongo
辅助服务器或仲裁服务器的外壳,然后db.shutdownServer()
在数据库上发出。
transitionToAuth
重新启动mongod
,此时没有了
security.transitionToAuth
选择,但与内部认证机制,例如security.keyFile
。
在配置文件中指定以下设置。
security.keyFile
,以及密钥文件的路径。replication.replSetName
到原始副本集名称。包括配置所需的其他选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定net.bindIp
设置。有关更多信息,请参见Localhost绑定兼容性更改。
开始mongod
使用配置文件:
有关配置文件的更多信息,请参阅 配置选项。
您也可以mongod
在启动时使用等效选项
mongod
。有关mongod
选项的完整列表,请参见参考页。
包括适合您的部署的其他设置。
在此步骤结束时,应在配置了内部身份验证的情况下
启动并运行所有辅助副本和仲裁器,但不配置security.transitionToAuth
。客户端只能mongod
使用配置的客户端身份验证机制连接到这些
实例。
--transitionToAuth
。¶降级副本集中的主要成员,然后在没有该security.transitionToAuth
选项的情况下重新启动它。
重要
在此步骤结束时,未与auth连接的客户端无法连接到副本集。 完成此步骤之前,请更新客户端以使用身份验证进行连接,以避免失去连接。
使用mongo
外壳连接到主要数据库,然后使用rs.stepDown()
方法降级主要数据库。
transitionToAuth
重新启动mongod
,此时没有了
security.transitionToAuth
选择,但与内部认证机制,例如security.keyFile
。
在配置文件中指定以下设置。
security.keyFile
,以及密钥文件的路径。replication.replSetName
到原始副本集名称。开始mongod
使用配置文件:
有关配置文件的更多信息,请参阅 配置选项。
您也可以mongod
在启动mongod时使用等效选项。有关mongod
选项的完整列表,请参见参考页。
包括适合您的部署的其他设置。
在此步骤结束时,副本集的所有成员都应启动并运行并强制执行身份验证。客户端只能mongod
使用配置的客户端身份验证机制连接到这些
实例。