Docs 主页 → 开发应用程序 → MongoDB Manual
使用密钥文件身份验证部署副本集
概述
在副本集上执行访问控制需要配置:
在本教程中,副本集的每个成员均使用相同的内部身份验证机制和设置。
实施内部身份验证还可实施用户访问控制。要连接到副本集, mongosh
等客户端需要使用用户帐户。请参阅用户和身份验证机制。
Cloud Manager 或 Ops Manager
如果您当前正在使用或计划使用 Cloud Manager 或 Ops Manager,请参阅Cloud Manager 手册或Ops Manager 手册以了解如何实施访问控制。
考虑因素
重要
要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。
使用主机名而不是 IP 地址在分割网络范围内配置集群。从 MongoDB 5开始。 0 ,仅配置了 IP 地址的节点未通过启动验证,因此不会启动。
IP 绑定
leafygreen-ui-qufvci 和 leafygreen-ui-qufvci,默认绑定到本地主机。如果部署的成员在不同的主机上运行,或者希望远程客户端连接到部署,则必须指定 --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
实例才能加入副本集。
注意
从 MongoDB 4.2 开始,用于内部成员身份验证的密钥文件使用 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
。
重要
密码应随机、长且复杂,以确保系统安全并防止或延迟恶意访问。
提示
从 mongo
shell 的 4.2 版开始,您可以将 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
:
提示
从 mongo
shell 的 4.2 版开始,您可以将 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
角色:
提示
从 mongo
shell 的 4.2 版开始,您可以将 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 证书进行成员身份验证。
要将密钥文件内部身份验证升级到 x.509 内部身份验证,请参阅从密钥文件身份验证升级到 x.509 身份验证。