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 格式与使用文本文件格式的现有单密钥文件兼容。

例如,

如果密钥文件包含单个密钥,您可以指定带或不带引号的密钥字符串:

my old secret key1

您可以将多个键字符串 [1] 指定为键字符串序列(可选择用引号括起来):

- my old secret key1
- my new secret key2

在文件中指定多个密钥的能力允许在不停机的情况下滚动升级密钥。 请参阅轮换自管理副本集的密钥和自管理分片集群的密钥轮换。

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

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

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

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

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

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

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

注意

MongoDB 在支持 TLS 1.1+ 的系统上禁用对 TLS 1.0 加密的支持。

使用成员证书来验证分片集群或副本集的成员资格。成员证书文件路径用 net.tls.clusterFilenet.tls.certificateKeyFile 选项配置。成员具有以下配置要求:

  • 集群成员配置必须为至少一个用于身份验证的属性指定非空值。默认情况下,MongoDB 接受:

    • 组织 (O)

    • 组织单位 (OU)

    • 域组件 (DC)

    您可以通过设置 net.tls.clusterAuthX509.extensionValue 来指定用于身份验证的替代属性。

  • 集群成员配置必须包含相同的 net.tls.clusterAuthX509.attributes 并使用匹配值。属性顺序不重要。以下示例设置 OOU,但不设置 DC

    net:
    tls:
    clusterAuthX509:
    attributes: O=MongoDB, OU=MongoDB Server

注意

如果禁用enforceUserClusterSeparation参数,则应用以下行为:

  • 如果配置文件中的clusterAuthModekeyFile ,则会禁用O/OU/DC检查。 这允许拥有成员证书的客户端以$external数据库中存储的用户身份进行身份验证。

  • 如果配置文件中的clusterAuthMode不是keyFile ,则服务器不会启动。

如果将enforceUserClusterSeparation参数设置为false ,则服务器不区分应用程序用于进行身份验证的客户端证书和具有特权访问权限的集群内证书。 如果您的clusterAuthModekeyFile ,则此操作无效。 但是,如果clusterAuthModex509 ,则使用允许模式的用户证书将与集群证书合并并授予特权访问权限。

如果执行以下操作,您的现有证书将被授予内部特权:

  1. 使用此参数允许的名称创建一个用户。

  2. enforceUserClusterSeparation参数设置为false

  3. clusterAuthMode 设置为 x509

在未验证是否已删除具有enforceUserClusterSeparation标志允许您创建的提升权限的用户之前,不得从keyFile升级到x509

要将enforceUserClusterSeparation参数设置为false ,请在启动期间运行以下命令:

mongod --setParameter enforceUserClusterSeparation=false

证书具有以下要求:

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

  • 至少一个主题备用名称 (SAN) 条目必须与其他集群成员使用的服务器主机名匹配。比较 SAN时,MongoDB 可以比较 DNS 名称或 IP 地址。

    如果您不指定subjectAltName , MongoDB会改为比较公用名 (CN)。 但是,根据 RFC ,CN 的这种用法已被弃用2818

  • 如果用作 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用于使用自管理MongoDB进行成员身份验证的证书。

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

后退

配置 OIDC