使用 x.509 证书进行会员身份验证

在本页面

2.6 版的新功能。

MongoDB 支持与安全TLS/SSL connection一起使用的 x.509 证书身份验证。分片的群集成员和副本集成员可以使用 x.509 证书来验证其对群集或副本集的成员身份,而不是使用keyfiles。成员身份验证是一个内部过程。

启用内部身份验证也会启用基于角色的访问控制。Client 端必须以用户身份进行身份验证,才能在部署中连接并执行操作。

Important

TLS/SSL,PKI(公钥基础结构)证书(尤其是 x.509 证书)和证书颁发机构的完整描述不在本文档的范围之内。本教程假定您具有 TLS/SSL 的先验知识以及对有效 x.509 证书的访问权限。

会员 x.509 证书

Note

您必须具有有效的 x.509 证书。

从 MongoDB 3.6.6 开始,如果在使用 x.509 身份验证时指定--sslAllowInvalidCertificatesssl.allowInvalidCertificates: true,则无效的证书仅足以构建 TLS/SSL 连接,而对于身份验证则“不足”。

Certificate Requirements

用于内部身份验证以验证分片群集或副本集成员身份的成员证书必须具有以下属性:

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

  • 在成员证书的subject中找到的专有名称(DN)必须为以下至少个属性指定非空值:组织(O),组织单位(OU)或域组件(DC) 。

  • 组织属性(O),组织单位属性(OU)和域组件(DC)必须与其他群集成员的证书中的属性匹配。为了匹配,证书必须匹配这些属性的所有规范,甚至必须匹配这些属性的非规范。属性的 Sequences 无关紧要。

在下面的示例中,两个DN包含OOU的匹配规范以及DC属性的非规范。

CN=host1,OU=Dept1,O=MongoDB,ST=NY,C=US
C=US, ST=CA, O=MongoDB, OU=Dept1, CN=host2

但是,以下两个DN包含OU属性的不匹配,因为一个包含两个OU规范,另一个包含一个规范。

CN=host1,OU=Dept1,OU=Sales,O=MongoDB
CN=host2,OU=Dept1,O=MongoDB
  • 公用名(CN)或主题备用名(SAN)条目之一必须与集群的其他成员使用的服务器的主机名匹配。

例如,群集的证书可以具有以下主题:

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
  • 如果证书包含扩展密钥用法(extendedKeyUsage)设置,则该值必须包含clientAuth(“ TLS WebClient 端身份验证”)。
extendedKeyUsage = clientAuth

您还可以使用不包含扩展密钥用法(EKU)的证书。

会员证书和 PEMKeyFile

要为 Client 证书认证配置 MongoDB,mongodmongos指定PEMKeyFile以通过配置文件中的net.ssl.PEMKeyFile设置或--sslPEMKeyFile命令行选项向 Client 端证明其身份。

如果未为内部成员身份验证指定clusterFile证书,则 MongoDB 将尝试使用PEMKeyFile证书进行成员身份验证。为了将PEMKeyFile证书用于内部身份验证以及 Client 端身份验证,则PEMKeyFile证书必须:

  • 省略extendedKeyUsage

  • 指定extendedKeyUsage值,除了serverAuth还包括clientAuth

配置副本集/共享群集

在滚动升级过程之外,replica setsharded cluster的每个组件都应使用相同的--clusterAuthMode设置,以确保它可以安全地连接到部署中的所有其他组件。

对于replica set个部署,这包括副本集的所有mongod个成员。

对于sharded cluster个部署,这包括所有mongodmongos个实例。

Note

从 MongoDB 3.6 开始,默认情况下mongodmongos绑定到 localhost。如果部署的成员在不同的主机上运行,或者希望远程 Client 端连接到部署,则必须指定--bind_ipnet.bindIp。有关更多信息,请参见Localhost 绑定兼容性更改

使用命令行选项

要为内部集群成员身份验证指定 x.509 证书,请附加其他 TLS/SSL 选项--clusterAuthMode--sslClusterFile,如以下示例中针对副本集的成员所示:

mongod --replSet <name> --sslMode requireSSL --clusterAuthMode x509 --sslClusterFile <path to membership certificate and key PEM file> --sslPEMKeyFile <path to TLS/SSL certificate and key PEM file> --sslCAFile <path to root CA PEM file> --bind_ip localhost,<ip address>

包括您的特定配置所需的所有其他选项,TLS/SSL 或其他。例如,如果成员密钥已加密,则将--sslClusterPassword设置为密码短语以解密密钥或让 MongoDB 提示 Importing 密码短语。有关详情,请参见TLS/SSL 证书密码短语

Warning

如果未指定--sslCAFile选项及其目标文件,则 x.509Client 端和成员身份验证将不起作用。分片系统中的mongodmongos将无法针对发出证书的可信证书颁发机构(CA)验证与其连接的进程的证书,从而破坏证书链。

从 2.6.4 版开始,如果未指定 CA 文件,则mongod将不会启用 x.509 身份验证。

使用配置文件

您可以在YAML formatted配置文件中指定 MongoDB 的配置,如以下示例所示:

security:
   clusterAuthMode: x509
net:
   ssl:
      mode: requireSSL
      PEMKeyFile: <path to TLS/SSL certificate and key PEM file>
      CAFile: <path to root CA PEM file>
      clusterFile: <path to x.509 membership certificate and key PEM file>
   bindIp: localhost,<ip address>

有关设置的更多信息,请参见security.clusterAuthModenet.ssl.modenet.ssl.PEMKeyFilenet.ssl.CAFilenet.ssl.clusterFile

Additional Information

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