将自托管副本集更新为密钥文件身份验证
概述
在现有副本集上强制执行访问控制需要配置
在本教程中,副本集的每个成员使用相同的内部认证机制和设置。
强制执行内部认证也强制执行用户访问控制。要连接到副本集,客户端如mongosh
需要使用用户帐户。见用户。
云管理器和运维管理器
考虑因素
重要
为了避免由于IP地址更改而导致的配置更新,请使用DNS主机名而不是IP地址。当配置副本集成员或分片集群成员时,使用DNS主机名而不是IP地址尤其重要。
在跨越分割网络视界的集群中配置时,请使用主机名而不是IP地址。从MongoDB 5.0版本开始,仅配置了IP地址的节点将无法通过启动验证,并且不会启动。
IP绑定
操作系统
本教程使用mongod
程序。Windows用户应使用mongod.exe
程序。
密钥文件安全
密钥文件是最低级别的安全形式,最适合测试或开发环境。对于生产环境,我们建议使用x.509证书。
用户
本教程介绍了仅在admin
数据库中创建最小数量的管理用户。对于用户身份验证,教程使用默认的SCRAM身份验证机制。挑战-响应安全机制最适合测试或开发环境。对于生产环境,我们建议使用x.509证书或自托管LDAP代理身份验证(仅适用于MongoDB企业版)或自托管部署上的Kerberos身份验证(仅适用于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>
有关使用密钥文件的详细信息和要求,请参阅 密钥文件。
使用强制访问控制重新启动副本集的每个成员。
使用security.keyFile
配置文件设置或--keyFile
命令行选项重新启动副本集中的每个mongod
。使用--keyFile
命令行选项或security.keyFile
配置文件设置运行mongod
将强制执行自我管理内部/成员身份验证以及自我管理部署中的基于角色的访问控制。
配置文件
如果使用配置文件,设置
security.keyFile
设置为密钥文件的路径,并且replication.replSetName
设置为副本集名称。
根据需要包含额外的配置选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员运行在不同的主机上,请指定 net.bindIp
设置。
security: keyFile: <path-to-keyfile> replication: replSetName: <replicaSetName> net: bindIp: localhost,<hostname(s)|ip address(es)>
使用配置文件启动 mongod
mongod --config <path-to-config-file>
有关配置文件的更多信息,请参阅 配置选项。
命令行
如果使用命令行选项,请使用以下选项启动 mongod
--keyFile
设置为密钥文件的路径,并且--replSet
设置为副本集名称。
根据需要包含额外的配置选项。例如,如果您希望远程客户端连接到您的部署,或者您的部署成员运行在不同的主机上,请指定 --bind_ip
。
mongod --keyFile <path-to-keyfile> --replSet <replicaSetName> --bind_ip localhost,<hostname(s)|ip address(es)>
重要
为了避免由于IP地址更改而导致的配置更新,请使用DNS主机名而不是IP地址。当配置副本集成员或分片集群成员时,使用DNS主机名而不是IP地址尤其重要。
在跨越分割网络视界的集群中配置时,请使用主机名而不是IP地址。从MongoDB 5.0版本开始,仅配置了IP地址的节点将无法通过启动验证,并且不会启动。
有关命令行选项的更多信息,请参阅 mongod
参考页面。
使用本地主机接口连接到主节点。
将 mongosh
连接到 mongod
实例之一,通过 localhost 接口。您必须在与 mongod
实例相同的物理机上运行 mongosh
。
使用 rs.status()
来识别 主节点 的副本集成员。如果您连接到了主节点,请继续下一步。如果没有,请通过 localhost 接口 将 mongosh
连接到主节点。
重要
在继续之前,您必须连接到主节点。
创建用户管理员。
重要
创建第一个用户后,localhost 异常 将不再可用。
第一个用户必须具有创建其他用户的权限,例如具有 userAdminAnyDatabase
角色的用户。这确保了在 自托管部署中的本地主机异常 关闭后,您可以创建其他用户。
如果至少有一个用户没有创建用户的权限,一旦本地主机异常关闭,您可能无法创建或修改具有新权限的用户,因此可能无法访问必要的操作。
使用 db.createUser()
方法添加用户。该用户应在 admin
数据库上至少具有 userAdminAnyDatabase
角色。
您必须连接到 主节点 才能创建用户。
以下示例在admin
数据库上创建具有userAdminAnyDatabase
角色的用户fred
。
重要
密码应该是随机的、长的且复杂的,以确保系统安全并防止或延迟恶意访问。
提示
您可以使用passwordPrompt()
方法与各种用户身份验证管理方法和命令结合使用,以提示输入密码,而不是直接在方法或命令调用中指定密码。然而,您仍然可以直接像在早期的mongo
shell版本中那样直接指定密码。
admin = db.getSiblingDB("admin") admin.createUser( { user: "fred", pwd: passwordPrompt(), // or cleartext password roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } )
当提示时输入密码。有关与数据库管理操作相关的所有内置角色的完整列表,请参阅数据库用户角色。
以用户管理员的身份进行认证。
认证到admin
数据库。
在mongosh
中,使用db.auth()
进行认证。例如,以下以用户管理员fred
进行认证:
提示
您可以使用passwordPrompt()
方法与各种用户身份验证管理方法和命令结合使用,以提示输入密码,而不是直接在方法或命令调用中指定密码。然而,您仍然可以直接像在早期的mongo
shell版本中那样直接指定密码。
db.getSiblingDB("admin").auth("fred", passwordPrompt()) // or cleartext password
或者,使用-u <username>
、-p <password>
和--authenticationDatabase
参数连接一个新的mongosh
实例到主副本集成员。
mongosh -u "fred" -p --authenticationDatabase "admin"
如果您没有指定命令行选项-p
的密码,mongosh
会提示您输入密码。
创建集群管理员(可选)。
集群管理员用户拥有 clusterAdmin
角色,该角色授予了对复制操作的访问权限。
在 admin
数据库中创建集群管理员用户并分配 clusterAdmin
角色。
提示
您可以使用passwordPrompt()
方法与各种用户身份验证管理方法和命令结合使用,以提示输入密码,而不是直接在方法或命令调用中指定密码。然而,您仍然可以直接像在早期的mongo
shell版本中那样直接指定密码。
db.getSiblingDB("admin").createUser( { "user" : "ravi", "pwd" : passwordPrompt(), // or cleartext password roles: [ { "role" : "clusterAdmin", "db" : "admin" } ] } )
按提示输入密码。
有关与副本集操作相关的所有内置角色的完整列表,请参阅 集群管理角色。
内部认证的 x.509
有关使用 x.509 进行内部认证的详细信息,请参阅使用 x.509 证书进行自管理 MongoDB 的成员身份认证。
要从密钥文件内部认证升级到 x.509 内部认证,请参阅将自管理 MongoDB 从密钥文件认证升级到 x.509 认证。