将自托管副本集更新为密钥文件认证(无停机时间)
概述
为了防止未经授权的访问,强制执行您的部署的认证。副本集的认证包括副本集成员之间的内部认证和连接到副本集的客户端的用户访问控制。如果您的部署目前没有强制执行认证,您可以使用--transitionToAuth
选项来强制执行认证而无需停机。
本教程使用密钥文件内部认证机制用于内部安全,以及基于SCRAM的客户端连接基于角色的访问控制。
如果您使用Cloud Manager或Ops Manager来管理您的部署,请参阅相应的
如果使用Cloud Manager或Ops Manager来管理您的部署,请参阅相应的
如果您使用Cloud Manager或Ops Manager来管理您的部署,请参阅相应的请参阅云管理器手册或Ops Manager手册以强制执行身份验证。
架构
本教程假设在现有主副本集成员下线后,您的副本集可以选举新的主节点。这需要
过渡状态
运行带有--transitionToAuth
的mongod
将接受已验证和未验证的连接。在此过渡状态下连接到mongod
的客户可以执行任何数据库的读取、写入和管理操作。
客户端访问
在以下过程的末尾,副本集将拒绝任何尝试进行非认证连接的客户端。此过程创建用户,以便客户端应用程序在连接到副本集时使用。
请参阅➤ 配置基于角色的访问控制,了解用户创建和管理最佳实践。
IP 绑定
密码
重要
密码应随机、长且复杂,以确保系统安全并防止或延迟恶意访问。
在现有副本集中强制实施密钥文件访问控制
重要
为了避免由于IP地址更改而导致的配置更新,请使用DNS主机名而不是IP地址。当配置副本集成员或分片集群成员时,使用DNS主机名而不是IP地址尤为重要。
使用主机名而不是IP地址来配置跨分割网络视界的集群。从MongoDB 5.0开始,仅配置了IP地址的节点将失败启动验证并且不会启动。
创建管理员用户。
连接到主节点以创建具有userAdminAnyDatabase
角色的用户。该userAdminAnyDatabase
角色允许访问部署中任何数据库的用户创建。
以下示例在admin
数据库上为fred
用户创建具有userAdminAnyDatabase
角色的用户。
重要
密码应随机、长且复杂,以确保系统安全并防止或延迟恶意访问。
提示
您可以使用passwordPrompt()
方法与各种用户身份验证管理方法和命令结合使用,以提示输入密码而不是在方法或命令调用中直接指定密码。但是,您仍然可以直接指定密码,就像在较早版本的mongo
shell中一样。
admin = db.getSiblingDB("admin") admin.createUser( { user: "fred", pwd: " passwordPrompt(), // or cleartext password roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } )
完成此过程后,管理副本集中用户的任何客户端都必须以该用户或具有类似权限的用户身份进行身份验证。
请参阅数据库用户角色,获取内置角色的完整列表以及与数据库管理操作相关的信息。
创建集群管理员。
连接到主节点,使用clusterAdmin
角色创建用户。该clusterAdmin
角色允许访问复制操作,例如配置副本集。
以下示例在admin
数据库上创建具有clusterAdmin
角色的用户ravi
。
重要
密码应随机、长且复杂,以确保系统安全并防止或延迟恶意访问。
提示
您可以使用passwordPrompt()
方法与各种用户身份验证管理方法和命令结合使用,以提示输入密码而不是在方法或命令调用中直接指定密码。但是,您仍然可以直接指定密码,就像在较早版本的mongo
shell中一样。
db.getSiblingDB("admin").createUser( { "user" : "ravi", "pwd" : passwordPrompt(), // or cleartext password roles: [ { "role" : "clusterAdmin", "db" : "admin" } ] } )
完成此过程后,任何管理或维护副本集的客户端都必须以该用户身份或具有类似权限的用户身份进行身份验证。
请参阅集群管理角色,获取与副本集操作相关的内置角色的完整列表。
为客户端应用程序创建用户。
创建用户以允许客户端应用程序连接并与副本集交互。完成本教程后,客户端必须以配置的用户身份进行身份验证以连接到副本集。
请参阅数据库用户角色,了解用于创建只读和读写用户的内置基本角色。
以下示例在foo
数据库上创建具有读写权限的用户。
重要
密码应随机、长且复杂,以确保系统安全并防止或延迟恶意访问。
在foo
数据库中创建具有readWrite
角色的用户。
提示
您可以使用passwordPrompt()
方法与各种用户身份验证管理方法和命令结合使用,以提示输入密码而不是在方法或命令调用中直接指定密码。但是,您仍然可以直接指定密码,就像在较早版本的mongo
shell中一样。
db.getSiblingDB("foo").createUser( { "user" : "joe", "pwd" : passwordPrompt(), // or cleartext password roles: [ { "role" : "readWrite", "db" : "foo" } ] } )
以该用户身份进行身份验证的客户端可以对foo
数据库执行读写操作。有关创建已验证连接的更多信息,请参阅使用自管理部署对用户进行身份验证。
更新客户端应用程序
在执行此步骤时,副本集不强制执行身份验证。但是,客户端应用程序仍然可以指定身份验证凭据并连接到副本集。
将客户端应用程序更新为使用配置的用户身份验证副本集。身份验证连接需要用户名、密码和身份验证数据库。请参阅使用自托管部署身份验证用户。
例如,以下代码连接到名为mongoRepl
的副本集,并以用户joe
的身份进行身份验证。
mongosh -u joe -password -authenticationDatabase foo --host mongoRepl/mongo1.example.net:27017, mongo2.example.net:27017, mongo3.example.net:27017
如果您没有指定-p
命令行选项,mongosh
将提示输入密码。
如果您的应用程序使用MongoDB驱动程序,请参阅相关驱动程序文档,了解创建身份验证连接的说明。
本教程完成后,副本集将拒绝未经过身份验证的客户端连接。现在执行此步骤可以确保在过渡前后客户端都可以连接到副本集。
创建密钥文件。
使用密钥文件身份验证,副本集中的每个mongod
实例使用密钥文件的內容作为共享密码,以验证部署中的其他成员。只有具有正确密钥文件的mongod
实例才能加入副本集。
注意
内部成员身份验证密钥文件使用YAML格式,允许在密钥文件中包含多个密钥。YAML格式接受以下格式:
单个密钥字符串(与早期版本相同)
密钥字符串序列
YAML格式与使用文本文件格式的现有单个密钥密钥文件兼容。
密钥长度必须在6到1024个字符之间,并且只能包含base64集合中的字符。副本集的所有成员必须共享至少一个公共密钥。
注意
在UNIX系统上,密钥文件不应具有组或世界权限。在Windows系统上,不检查密钥文件权限。
您可以使用任何您选择的方法生成密钥文件。例如,以下操作使用openssl
生成一个复杂的伪随机1024字符字符串作为共享密码。然后使用chmod
更改文件权限,仅提供文件所有者的读取权限
openssl rand -base64 756 > <path-to-keyfile> chmod 400 <path-to-keyfile>
有关使用密钥文件的更多详细信息和要求,请参阅密钥文件。
使用 transitionToAuth
重新启动副本集的每个次要成员或仲裁成员。
security.transitionToAuth
设置。将mongod
配置为将security.transitionToAuth
设置为true
,可以将实例置于过渡状态,此时它可以接受和创建已认证和未认证的连接。如
security.keyFile
之类的内部认证机制。
必须逐个重启每个成员,以确保副本集中多数成员保持在线。
关闭次要或仲裁成员。
从连接到次要或仲裁成员的 mongosh
会话中,针对 admin
数据库执行 db.shutdownServer()
命令。
admin = db.getSiblingDB("admin") admin.shutdownServer()
使用 transitionToAuth
重新启动辅助成员或仲裁成员。
请在您的 配置文件 中指定以下设置。
security.keyFile
,包含密钥文件的路径。replication.replSetName
设置为原始副本集名称。security.transitionToAuth
设置为true
。
mongod
和 mongos
默认绑定到本地主机。如果您的部署成员运行在不同的主机上或您希望远程客户端连接到您的部署,您必须指定 net.bindIp
设置。
security: keyFile: <path-to-keyfile> transitionToAuth: true replication: replSetName: <replicaSetName>
在启动 mongod
时,使用包含配置文件路径的 --config
选项。
mongod --config <path-to-config-file>
有关配置文件的更多信息,请参阅 配置选项。
或者,您可以在启动 mongod
时使用等效的命令行选项(例如 --transitionToAuth
和 --keyFile
)。有关选项的完整列表,请参阅 mongod
参考页面。
根据您的部署情况,包含适当的额外设置。
完成此步骤后,所有辅助成员和仲裁成员都应启动并运行,且 security.transitionToAuth
设置为 true
。
降低副本集的主成员并使用 --transitionToAuth
重新启动它。
降低副本集中的主成员并重新启动该成员,包括其配置
security.transitionToAuth
设置。将mongod
配置为将security.transitionToAuth
设置为true
,可以将实例置于过渡状态,此时它可以接受和创建已认证和未认证的连接。如
security.keyFile
之类的内部认证机制。
降低主副本集成员
使用 mongosh
连接到主节点并使用 rs.stepDown()
方法降低主节点。
rs.stepDown()
关闭旧的主节点
一旦主节点降低并且副本集选举了新的主节点,关闭旧的主节点 mongod
.
从连接到旧主节点的 mongosh
会话中,在 admin
数据库上执行 db.shutdownServer()
。
admin = db.getSiblingDB("admin") admin.shutdownServer()
使用 transitionToAuth
重新启动旧主节点
请在您的 配置文件 中指定以下设置。
security.keyFile
,包含密钥文件的路径。replication.replSetName
设置为原始副本集名称。security.transitionToAuth
设置为true
。
根据需要包含配置中的附加选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定 net.bindIp
设置。
security: keyFile: <path-to-keyfile> transitionToAuth: true replication: replSetName: <replicaSetName>
使用配置文件启动 mongod
。
mongod --config <path-to-config-file>
有关配置文件的更多信息,请参阅 配置选项。
或者,您可以在启动 mongod
时使用等效的命令行选项(例如 --transitionToAuth
和 --keyFile
)。有关选项的完整列表,请参阅 mongod
参考页面。
根据您的部署情况,包含适当的额外设置。
本步骤结束时,副本集的所有成员都应启动并运行,其中 security.transitionToAuth
设置为 true
,security.keyFile
设置为密钥文件路径。
重新启动从节点和仲裁者 不 使用 --transitionToAuth
重新启动副本集中的每个 从节点 或 仲裁者 成员,并在重新启动时移除 security.transitionToAuth
选项。您必须逐个进行此操作,以确保副本集中的多数成员保持在线。
如果副本集的大多数成员同时离线,则副本集可能进入只读模式。
关闭辅助成员或仲裁成员
将 mongosh
连接到辅助成员或仲裁成员,并在 admin
数据库上执行 db.shutdownServer()
。
admin = db.getSiblingDB("admin") admin.shutdownServer()
重启辅助成员或仲裁成员,无需使用 transitionToAuth
重启 mongod
,这次 不 使用 security.transitionToAuth
选项,而是 使用 内部认证机制,如 security.keyFile
。
请在您的 配置文件 中指定以下设置。
security.keyFile
,包含密钥文件的路径。replication.replSetName
设置为原始副本集名称。
根据需要包含配置中的附加选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员在不同的主机上运行,请指定 net.bindIp
设置。
security: keyFile: <path-to-keyfile> replication: replSetName: <replicaSetName>
使用配置文件启动 mongod
mongod --config <path-to-config-file>
有关配置文件的更多信息,请参阅 配置选项。
您还可以在启动您的 mongod
时使用等效的 mongod
选项。有关选项的完整列表,请参阅 mongod
参考页面。
根据您的部署情况,包含适当的额外设置。
完成此步骤后,所有辅助成员和仲裁成员都应运行,并已配置内部认证,但 不 使用 security.transitionToAuth
。客户端只能通过配置的客户端认证机制连接到这些 mongod
实例。
降级并重新启动主副本集成员,不使用—transitionToAuth选项。
将副本集中的主成员降级,然后不使用主选项重新启动它。
重要
在此步骤结束时,未使用身份验证连接的客户端无法连接到副本集。在完成此步骤之前,请更新客户端以使用身份验证连接,以避免连接中断。
降级主副本集成员
使用 mongosh
连接到主节点并使用 rs.stepDown()
方法降低主节点。
rs.stepDown()
关闭旧主成员
一旦主节点降低并且副本集选举了新的主节点,关闭旧的主节点 mongod
.
从连接到旧主节点的 mongosh
会话中,在 admin
数据库上执行 db.shutdownServer()
。
admin = db.getSiblingDB("admin") admin.shutdownServer()
在不使用 transitionToAuth
的情况下重启旧的主节点
重启 mongod
,这次 不使用 security.transitionToAuth
选项,而是使用内部认证机制,例如 security.keyFile
。
请在您的 配置文件 中指定以下设置。
security.keyFile
,包含密钥文件的路径。replication.replSetName
设置为原始副本集名称。
security: keyFile: <path-to-keyfile> replication: replSetName: <replicaSetName>
使用配置文件启动 mongod
mongod --config <path-to-config-file>
有关配置文件的更多信息,请参阅 配置选项。
在启动您的 mongod 时,您也可以使用等效的 mongod
选项。有关选项的完整列表,请参阅 mongod
参考页面。
根据您的部署情况,包含适当的额外设置。
在此步骤结束时,副本集的所有成员都应正常运行并强制执行认证。客户端只能通过配置的客户端认证机制连接到这些 mongod
实例。
x.509 内部认证
有关使用 x.509 进行内部认证的详细信息,请参阅 使用 x.509 证书进行自管理 MongoDB 的成员身份认证。
要从密钥文件内部认证升级到 x.509 内部认证,请参阅 将自管理 MongoDB 从密钥文件认证升级到 x.509 认证。