使用密钥文件身份验证部署自管理副本集
Overview
在 副本集上执行访问控制需要配置:
使用内部身份验证配置副本集节点之间的安全性,以及
使用在自管理部署中使用基于角色的访问控制来确保客户端与副本集连接之间的安全性。
在本教程中,副本集的每个成员均使用相同的内部身份验证机制和设置。
实施内部身份验证还可执行用户访问控制。要连接到副本集,像 mongosh
这样的客户端需要使用用户账户。请参阅用户和身份验证机制。
Cloud Manager 或 Ops Manager
如果您正在使用或计划使用 Cloud Manager 或 Ops Manager,请参阅 Cloud Manager 手册或 Ops Manager 手册以了解如何执行访问控制。
Considerations
重要
要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。
在水平分割网络配置下,请使用主机名而非 IP 地址来配置集群。从 MongoDB 5.0 开始,仅配置了 IP 地址的节点将无法通过启动验证,因而不会启动。
IP 绑定
leafygreen-ui-tqgtui 和 leafygreen-ui-tqgtui,默认绑定到本地主机。如果部署的成员在不同的主机上运行,或者希望远程客户端连接到部署,则必须指定 --bind_ip
或 net.bindIp
。
操作系统
本教程主要介绍 mongod
流程。Windows 用户应改用 mongod.exe
程序。
密钥文件安全
密钥文件是最低限度的安全手段,也最适合测试或开发环境。对于生产环境,建议使用 x.509 证书。
用户和身份验证机制
本教程仅介绍在 admin
数据库上创建最少数量的管理用户。在用户身份验证方面,本教程使用默认的 SCRAM 身份验证机制。质询响应安全机制最适合测试或开发环境。对于生产环境,建议使用 x.509 证书或自管理 LDAP 代理身份验证(仅用于 MongoDB Enterprise)或自管理部署上的 Kerberos 身份验证(仅用于 MongoDB Enterprise)。
如需详细了解为特定认证机制创建用户,请参阅特定认证机制页面。
请参阅➤ 配置基于角色的访问控制,了解用户创建和管理的最佳实践。
使用密钥文件访问控制来部署新副本集
重要
要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。
在水平分割网络配置下,请使用主机名而非 IP 地址来配置集群。从 MongoDB 5.0 开始,仅配置了 IP 地址的节点将无法通过启动验证,因而不会启动。
创建密钥文件。
通过密钥文件身份验证,副本集中的每个 mongod
实例都使用密钥文件的内容作为共享密码,对部署中的其他节点进行身份验证。只有具有正确密钥文件的 mongod
实例才能加入副本集。
注意
用于内部成员身份验证的密钥文件使用 YAML 格式,允许在密钥文件中包含多个密钥。YAML 格式接受以下任一形式:
单个密钥字符串(与早期版本相同)
键字符串序列
YAML 格式与使用文本文件格式的现有单密钥文件兼容。
密钥的长度必须介于 6 到 1,024 个字符之间,且只能包含 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
中运行 rs.initiate()
方法。
rs.initiate()
可以接受一个可选的副本集配置文档。在复制集配置文档中,包括:
_id
字段设置为在replication.replSetName
或--replSet
选项中指定的副本集名称。members
数组,为副本集的每个节点包含一个文档。
以下示例会启动一个三节点副本集。
重要
仅在副本集的一个 mongod
实例上运行 rs.initiate()
。
重要
要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。
在水平分割网络配置下,请使用主机名而非 IP 地址来配置集群。从 MongoDB 5.0 开始,仅配置了 IP 地址的节点将无法通过启动验证,因而不会启动。
rs.initiate( { _id : "myReplSet", members: [ { _id : 0, host : "mongo1.example.net:27017" }, { _id : 1, host : "mongo2.example.net:27017" }, { _id : 2, host : "mongo3.example.net:27017" } ] } )
rs.initiate()
触发选举,并选出一名节点担任主节点。
在继续之前连接到主节点。使用 rs.status()
查找主节点。
创建用户管理员。
重要
创建第一个用户后,本地主机异常就不再可用。
第一个用户必须拥有创建其他用户的特权,如具备 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"
创建集群管理员。
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身份验证。