MongoDB官方文档中关于副本集仲裁节点(Replica Set Arbiter)的页面,特别是关于认证的部分。
以下是该页面的一些关键信息:
-
仲裁节点的作用:仲裁节点参与主节点选举,但它们不持有数据集的副本,也不能成为主节点。每个仲裁节点有一个选举投票权,并且默认优先级为0。
-
部署注意事项:
- 不要在运行主节点或从节点的系统上运行仲裁节点。
- 如果部署包含仲裁节点,应使用长期支持(LTS)版本,而不是每季度的快速发布版本。
-
性能问题:在三成员的主-从-仲裁节点(PSA)架构中,如果从节点不可用或落后,使用写入关注点
"majority"
可能导致性能问题。 -
数据一致性问题:使用多个仲裁节点可能会妨碍可靠地使用大多数写入关注点。仲裁节点不存储数据,但它们确实增加了副本集中的节点数量。当副本集有多个仲裁节点时,在节点故障后,数据承载节点的大多数可能不可用。
-
警告:如果从节点落后于主节点,并且集群被重新配置,多个仲裁节点的选票可能会选举落后的节点为主节点。新的主节点将没有未复制的写入操作,即使这些写入操作可能已经被旧配置的大多数提交,结果是数据丢失。
-
新特性:从MongoDB 5.3开始,默认情况下不支持副本集中的多个仲裁节点。如果您尝试向副本集添加多个仲裁节点,服务器将返回错误。要在使用MongoDB 5.3或更高版本的副本集中添加多个仲裁节点,需要在启动每个节点时将
allowMultipleArbiters
参数设置为true
。 -
认证:当启用了授权(authorization)时,仲裁节点与其他副本集成员交换认证凭据。MongoDB加密了认证过程,使得MongoDB的认证交换是加密安全的。由于仲裁节点不存储数据,它们没有用于认证的用户和角色映射内部表。因此,当启用授权时,登录仲裁节点的唯一方法是使用本地主机例外。
-
通信加密:仲裁节点与其他集群成员之间的通信仅限于选举期间的投票、心跳和配置数据。这些交换不是加密的。然而,如果您的MongoDB部署使用TLS/SSL,MongoDB将加密所有副本集成员之间的通信。
-
安全建议:与所有MongoDB组件一样,在受信任的网络环境中运行仲裁节点。
页面还包含了一个关于如何使用仲裁节点来打破平局的示例,以及一个副本集的示意图。
这些信息对于理解和配置MongoDB副本集仲裁节点非常重要,特别是关于它们的安全和认证方面。
MongoDB官方文档中关于本地主机例外(Localhost Exception)的部分。
以下是该页面的关键信息:
-
本地主机例外的重要性:在
mongod
实例上,仅当MongoDB实例中未创建任何用户或角色时,本地主机例外才适用。 -
本地主机例外的目的:允许您在启用访问控制后创建系统中的第一个用户或角色。启用访问控制后,通过本地主机接口连接,并在
admin
数据库中创建第一个用户。 -
权限要求:如果您首先创建用户,则该用户必须具有创建其他用户的权限。
userAdmin
或userAdminAnyDatabase
角色都授予创建其他用户的权限。 -
警告:使用本地主机例外的连接只能创建第一个用户或角色。一旦您创建了任何用户或角色,本地主机例外就会被禁用。如果您需要创建一个用户和一个角色,您必须首先使用内置的
userAdmin
或userAdminAnyDatabase
角色之一创建用户。如果您首先创建角色,您将无法创建用户。 -
特定情况:使用
db.createRole()
方法首先创建角色的功能是专门为使用LDAP进行授权的用户设计的。有关更多信息,请参见LDAP授权。 -
mongos
的本地主机例外:在mongos
上,仅当没有为分片集群创建用户或角色时,本地主机例外才适用。 -
分片集群的本地主机例外:在分片集群中,本地主机例外适用于每个单独的分片以及整个集群。
-
防止未授权访问:一旦您创建了分片集群并通过
mongos
实例添加了用户管理员,您必须阻止对各个分片的未授权访问。为了防止对集群中各个分片的未授权访问,您可以采取以下措施之一:- 在分片的主节点上创建用户管理员。
- 在启动时禁用本地主机例外。要禁用本地主机例外,将
enableLocalhostAuthBypass
参数设置为0
。
这些信息对于理解和配置MongoDB实例的访问控制和用户创建非常重要。
如何理解MongoDB 的Localhost Exception ?
MongoDB的Localhost Exception是一个特殊的安全特性,它允许在启用了访问控制(即设置了--auth
选项)的MongoDB实例上,通过本地主机接口(通常是回环地址127.0.0.1,或者在某些情况下是localhost)进行无认证的连接,以便创建第一个用户或角色。这个特性在MongoDB的安全实践中非常重要,因为它提供了一种在没有现有用户的情况下初始化MongoDB实例的授权系统的方法。
以下是Localhost Exception的一些关键点,以帮助您更好地理解它:
-
无用户时才适用:Localhost Exception仅在MongoDB实例中尚未创建任何用户或角色时才有效。
-
创建第一个用户:一旦启用了访问控制,您可以使用Localhost Exception通过本地主机接口连接到MongoDB实例,并在
admin
数据库中创建第一个用户。这个用户应该具有足够的权限来创建其他用户或角色。 -
权限限制:使用Localhost Exception的连接只能用于创建第一个用户或角色。一旦创建了至少一个用户或角色,Localhost Exception即被禁用,这意味着后续的连接必须通过认证。
-
角色创建限制:如果您需要同时创建用户和角色,您必须首先创建一个用户,并且这个用户需要具有
userAdmin
或userAdminAnyDatabase
角色来创建其他用户。如果先创建了一个角色,而不是用户,那么在没有用户的情况下,您将无法使用该角色来创建新用户。 -
分片集群的例外:在MongoDB的分片集群中,Localhost Exception适用于每个单独的分片以及整个集群。如果通过
mongos
(MongoDB的分片查询路由器)实例添加了集群管理员用户,还需要防止对各个分片的未授权访问。 -
禁用Localhost Exception:可以通过设置
enableLocalhostAuthBypass
参数为0
来禁用Localhost Exception,这通常在启动MongoDB实例时配置。 -
安全环境:由于Localhost Exception允许无认证的连接,建议在受信任的网络环境中使用,以避免安全风险。
MongoDB 的 "localhost Exception" 是指在默认配置下,MongoDB 可以在本地主机(localhost)上运行而无需进行身份验证。这意味着如果你连接到 MongoDB 服务器时使用的是本地主机,并且没有启用身份验证机制,那么你可以直接访问数据库而无需提供用户名和密码。
这种设置在开发和测试环境中非常方便,因为你可以快速地进行实验和调试而无需担心身份验证的复杂性。但在生产环境中,你应该启用身份验证,以确保只有经过授权的用户才能访问数据库,并且数据的安全性得到保障。
理解 "localhost Exception" 的关键在于意识到它只适用于本地主机,并且仅在未启用身份验证时才有效。在生产环境中,应该谨慎使用这种设置,以防止未经授权的访问导致数据泄露或安全漏洞。
Localhost Exception是MongoDB安全模型的一个关键组成部分,它允许管理员在启用了访问控制的系统中安全地设置用户账户和角色。理解并正确使用这一特性对于维护MongoDB实例的安全至关重要。
参考
MongoDB Manual/Replication
https://www.mongodb.com/docs/v4.4/replication/
MongoDB Manual/Sharding
https://www.mongodb.com/docs/v4.4/sharding/
Cannot authenticate in mongodb arbiter
https://stackoverflow.com/questions/22996161/cannot-authenticate-in-mongodb-arbiter
Change mongo admin password on an arbiter
https://serverfault.com/questions/818078/change-mongo-admin-password-on-an-arbiter
网友评论