文档菜单
文档首页
/
MongoDB 手册
/ / /

自管理内部/会员身份验证

本页内容

  • 密钥文件
  • x.509
  • 下一步操作

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

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

注意

启用内部身份验证也将启用 客户端授权

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

密钥长度必须在6到1024个字符之间,且只能包含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

可以指定多个密钥字符串(如需,可加引号)作为密钥字符串序列

- my old secret key1
- my new secret key2

在文件中指定多个密钥的能力允许在不中断服务的情况下滚动更新密钥。请参阅为自管理副本集旋转密钥为自管理分片集群旋转密钥。

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

在UNIX系统上,密钥文件不得具有组或世界权限。在Windows系统上,不检查密钥文件权限。

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

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

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

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

副本集或分片集群的成员可以使用x.509证书进行内部认证,而不是使用密钥文件。这也被称为相互TLS或mTLS。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

您必须在升级到 x509 之前验证您已删除具有提升权限的用户,这些权限是 enforceUserClusterSeparation 标志允许您创建的。

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

mongod --setParameter enforceUserClusterSeparation=false

证书有以下要求:

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

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

    如果您没有指定 subjectAltName,MongoDB 将比较通用名称(CN)。然而,根据 RFC2818,这种 CN 的使用已被弃用。

  • 如果用作 certificateKeyFile 的证书包含 extendedKeyUsage,则值必须包含 clientAuth("TLS Web 客户端身份验证")和 serverAuth("TLS Web 服务器身份验证")。

    extendedKeyUsage = clientAuth, serverAuth
  • 如果用作 clusterFile 的证书包含 extendedKeyUsage,则值必须包含 clientAuth

    extendedKeyUsage = clientAuth

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

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

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

要使用证书密钥文件进行客户端身份验证和成员身份验证,证书必须:

  • 省略 extendedKeyUsage

  • 指定 extendedKeyUsage = serverAuth, clientAuth

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

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

返回

授权用户