自管理内部/成员资格身份验证
您可以要求副本集和分片的集群的成员相互进行身份验证。 对于成员的内部身份验证, MongoDB可以使用密钥文件或x. 509证书。
所选方法用于所有内部通信。例如,当客户端使用支持的身份验证机制之一向 进行身份验证时,mongos
随后使用配置的内部身份验证方法连接到所需的 mongod
进程。
注意
启用内部身份验证还可同时启用客户端授权。
Keyfiles
密钥文件使用 SCRAM 挑战和响应身份验证机制,其中密钥文件包含成员的共享密码。
密钥要求
密钥的长度必须介于 6 到 1,024 个字符之间,且只能包含 base64 集合中的字符。MongoDB 去除空白字符(例如x0d
、x09
和 x20
),方便跨平台使用。因此,以下操作会生成相同的密钥:
echo -e "mysecretkey" > key1 echo -e "my secret key" > key1 echo -e "my secret key\n" > key2 echo -e "my secret key" > key3 echo -e "my\r\nsecret\r\nkey\r\n" > key4
Keyfile 格式
用于内部成员身份验证的密钥文件使用 YAML 格式,允许在密钥文件中包含多个密钥。YAML 格式接受以下任一形式:
单个密钥字符串(与早期版本相同)
键字符串序列
YAML 格式与使用文本文件格式的现有单密钥文件兼容。
例如,
如果密钥文件包含单个密钥,您可以指定带或不带引号的密钥字符串:
my old secret key1
您可以将多个键字符串 [1] 指定为键字符串序列(可选择用引号括起来):
- my old secret key1 - my new secret key2
在文件中指定多个密钥的能力允许在不停机的情况下滚动升级密钥。 请参阅轮换自管理副本集的密钥和自管理分片集群的密钥轮换。
部署的所有 mongod
和 mongos
实例必须共享至少一个公用密钥。
在 UNIX 系统上,密钥文件不得具有群组或全局权限。在 Windows 系统中,不检查密钥文件权限。
您必须在托管副本集或分片集群成员的每台服务器上存储密钥文件。
[1] | 对于 MongoDB 的加密存储引擎,用于本地密钥管理的密钥文件只能包含单个密钥。 |
密钥文件的 MongoDB 配置
要指定密钥文件,请使用 security.keyFile
设置或 --keyFile
命令行选项。
有关密钥文件内部身份验证的示例,请参阅将自管理副本集更新为密钥文件身份验证。
x.509
副本集或分片集群的成员可以使用 x。 509 证书进行内部身份验证,而不是使用密钥文件。这也称为双向 TLS 或 mTLS。 MongoDB支持 x. 509 证书身份验证,用于安全 TLS/SSL 连接。
注意
MongoDB 在支持 TLS 1.1+ 的系统上禁用对 TLS 1.0 加密的支持。
成员证书要求
使用成员证书验证分片集群或副本集的成员资格。 成员证书存储在net.tls.clusterFile
和net.tls.certificateKeyFile
中。 成员证书要求:
必须由一个证书颁发机构 (CA) 同时向分片集群或副本集成员颁发所有 x.509 证书。
x.509 证书不能过期。
在成员证书的
subject
中找到的标识名 (DN
) 必须为以下至少一个属性指定非空值:组织 (
O
)组织单位 (
OU
)域组件 (
DC
)
在多集群部署中,每个集群必须使用不同的 X. 509成员证书。 每个证书的
O
、OU
和DC
标识名 (DN) 字段必须具有唯一值。如果两个集群的证书具有相同 DN 值,则一个集群上的受感染服务器可以作为另一个集群的成员进行身份验证。
每个集群成员证书必须在其
net.tls.clusterFile
和net.tls.certificateKeyFile
证书中具有相同的O
、OU
和DC
。 这也适用于tlsX509ClusterAuthDNOverride
值(如果已设置)。 属性顺序并不重要。以下是一个示例。 下面的两个
DN
具有匹配的O
和OU
规范,并且未指定DC
。CN=host1,OU=Dept1,O=MongoDB,ST=NY,C=US C=US, ST=CA, O=MongoDB, OU=Dept1, CN=host2 以下示例不正确,因为
DN
不匹配。 一个DN
有两个OU
规范,另一个OU
只有一个规范。CN=host1,OU=Dept1,OU=Sales,O=MongoDB CN=host2,OU=Dept1,O=MongoDB 公用名 (
CN
) 或主题备用名称 (SAN
) 条目之一必须与其他集群成员的服务器主机名匹配。 从 MongoDB 4.2 开始,在比较SAN
时,MongoDB 可以比较 DNS 名称或 IP 地址。 在以前的版本中,MongoDB 仅比较 DNS 名称。例如,集群的证书可以包含以下
subject
:subject= CN=<myhostname1>,OU=Dept1,O=MongoDB,ST=NY,C=US subject= CN=<myhostname2>,OU=Dept1,O=MongoDB,ST=NY,C=US subject= CN=<myhostname3>,OU=Dept1,O=MongoDB,ST=NY,C=US 如果用作
certificateKeyFile
的证书包含extendedKeyUsage
,则该值必须同时包含clientAuth
(“TLS Web 客户端身份验证”)和serverAuth
(“TLS Web 服务器身份验证”)。extendedKeyUsage = clientAuth, serverAuth 如果用作
clusterFile
的证书包含extendedKeyUsage
,则该值必须包含clientAuth
。extendedKeyUsage = clientAuth
MongoDB 配置
您可以使用 TLS 在副本集(每个mongod
实例)或分片集群(每个 mongod
和 mongos
实例)的每个节点之间进行内部身份验证。
要使用 TLS 进行内部身份验证,请使用以下设置:
mongod
和 mongos
实例使用证书密钥文件向客户端证明自己的身份,但证书密钥文件也可用于成员身份验证。如果不指定集群文件,成员将使用其证书密钥文件进行成员身份验证。用 net.tls.certificateKeyFile
或 --tlsCertificateKeyFile
指定证书密钥文件。
要将证书密钥文件同时用于客户端身份验证和成员资格身份验证,证书必须满足以下任一条件:
省略
extendedKeyUsage
或指定
extendedKeyUsage = serverAuth, clientAuth
后续步骤
以 x示例。 509内部身份验证,请参阅使用 x。 509用于使用自管理MongoDB进行成员身份验证的证书。
要从密钥文件内部身份验证升级到 x. 509内部身份验证,请参阅将自管理MongoDB从密钥文件身份验证升级到 x。 509身份验证。