Docs 菜单

Docs 主页开发应用程序MongoDB Manual

内部/成员身份验证

在此页面上

  • Keyfiles
  • x.509
  • 后续步骤

您可以要求副本集分片集群的成员相互进行身份验证。对于成员的内部身份验证,MongoDB 可以使用密钥文件x. 509证书。

所选方法用于所有内部通信。例如,当客户端使用支持的身份验证机制之一向 进行身份验证时,mongos 随后使用配置的内部身份验证方法连接到所需的 mongod 进程。

注意

启用内部身份验证还可同时启用客户端授权

密钥文件使用 SCRAM 挑战和响应身份验证机制,其中密钥文件包含成员的共享密码。

密钥的长度必须介于 6 到 1,024 个字符之间,且只能包含 base64 集合中的字符。MongoDB 去除空白字符(例如x0dx09x20),方便跨平台使用。因此,以下操作会生成相同的密钥:

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

用于内部成员身份验证的密钥文件使用 YAML 格式,以允许密钥文件中包含多个密钥。 YAML 格式接受以下任一项:

  • 单个密钥字符串(与早期版本相同)

  • 键字符串序列

YAML 格式与使用文本文件格式的现有单密钥文件兼容。

例如,

在文件中指定多个密钥的功能支持在不停机的情况下对密钥进行滚动升级。请参阅副本集轮换密钥分片集群轮换密钥

部署的所有 mongodmongos 实例必须共享至少一个公用密钥。

在 UNIX 系统上,密钥文件不得具有群组或全局权限。在 Windows 系统中,不检查密钥文件权限。

您必须在托管副本集或分片集群成员的每台服务器上存储密钥文件。

[1] 对于 MongoDB 的加密存储引擎,用于本地密钥管理的密钥文件只能包含单个密钥。

要指定密钥文件,请使用 security.keyFile 设置或 --keyFile 命令行选项。

有关密钥文件内部身份验证的示例,请参阅将副本集更新为密钥文件身份验证

副本集或分片集群的成员可以使用 x.509 证书进行内部身份验证,而不是使用密钥文件。MongoDB 支持与安全的 TLS/SSL 连接一起使用的 x.509 证书身份验证。

注意

MongoDB 禁用对 TLS 1的支持。在使用 TLS 1的系统上进行0加密。 1 + 可用。

使用成员证书验证分片集群或副本集的成员资格。 成员证书存储在net.tls.clusterFilenet.tls.certificateKeyFile中。 成员证书要求:

  • 必须由一个证书颁发机构 (CA) 同时向分片集群或副本集成员颁发所有 x.509 证书。

  • x.509 证书不能过期。

    注意

    如果提供的 x.509 证书在mongod/mongos主机系统时间后的30天内过期, mongod / mongos会记录连接警告。有关更多信息,请参阅x.509 证书即将过期trigger警告

  • 在成员证书的subject中找到的标识名 ( DN ) 必须为以下至少一个属性指定非空值:

    • 组织 (O)

    • 组织单位 (OU)

    • 域组件 (DC)

  • 在多集群部署中,每个集群必须使用不同的 X. 509成员证书。每个证书的OOUDC标识名 (DN) 字段必须具有唯一值。

    如果两个集群的证书具有相同 DN 值,则一个集群上的受感染服务器可以作为另一个集群的成员进行身份验证。

  • 每个集群成员证书必须在其net.tls.clusterFilenet.tls.certificateKeyFile证书中具有相同的OOUDC 。 这也适用于tlsX509ClusterAuthDNOverride值(如果已设置)。 属性顺序并不重要。

    以下是一个示例。 下面的两个DN具有匹配的OOU规范,并且未指定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

您可以使用 TLS 在副本集(每个mongod 实例)或分片集群(每个 mongodmongos 实例)的每个节点之间进行内部身份验证。

要使用 TLS 进行内部身份验证,请使用以下设置:

mongodmongos实例使用其证书密钥文件向客户端证明其身份,但证书密钥文件也可用于成员身份验证。如果不指定集群文件,成员将使用其证书密钥文件进行成员身份验证。使用net.tls.certificateKeyFile--tlsCertificateKeyFile指定证书密钥文件。

要将证书密钥文件同时用于客户端身份验证和成员资格身份验证,证书必须满足以下任一条件:

  • 省略 extendedKeyUsage

  • 指定 extendedKeyUsage = serverAuth, clientAuth

有关 x.509 内部身份验证的示例,请参阅使用 x.509 证书进行成员身份验证。

要将密钥文件内部身份验证升级到 x.509 内部身份验证,请参阅从密钥文件身份验证升级到 x.509 身份验证

← 通过原生 LDAP 使用 Active Directory 对用户进行身份验证和授权