使用x.509证书进行自托管MongoDB的成员身份验证
MongoDB支持使用x.509证书进行身份验证,与安全的TLS/SSL连接一起使用。分片集群成员和副本集成员可以使用x.509证书来验证其对集群或副本集的成员资格,而不是使用密钥文件。成员身份验证是一个内部过程。
注意
MongoDB在系统支持TLS 1.1+时禁用了对TLS 1.0加密的支持。
启用内部身份验证也将启用自托管部署中的基于角色的访问控制。客户端必须作为用户进行身份验证,才能连接并执行部署中的操作。
请参阅自托管部署上的用户和角色管理教程,了解向部署添加用户的说明。
请参阅使用x.509证书在自托管部署上对客户端进行身份验证教程,了解使用x.509证书进行用户身份验证的说明。
重要
关于TLS/SSL、PKI(公钥基础设施)证书(尤其是x.509证书)和证书颁发机构的全面描述超出了本文档的范围。本教程假定您已了解TLS/SSL以及有权访问有效的x.509证书。
成员x.509证书
注意
您必须拥有有效的x.509证书。
如果您指定--tlsAllowInvalidCertificates 或 net.tls.allowInvalidCertificates: true,则无效证书仅足以建立TLS连接,但不足以进行身份验证。
证书要求
使用成员证书验证对分片集群或副本集的成员身份。成员证书文件路径由 net.tls.clusterFile 和 net.tls.certificateKeyFile 选项配置。成员有以下配置要求
集群成员配置必须指定用于身份验证的至少一个属性的空值。默认情况下,MongoDB 接受
组织 (
O)组织单位 (
OU)域组件 (
DC)
您可以通过设置
net.tls.clusterAuthX509.extensionValue使用用于身份验证的替代属性。集群成员配置必须包含相同的
net.tls.clusterAuthX509.attributes并使用匹配的值。属性顺序无关紧要。以下示例设置O和OU,但不设置DCnet: tls: clusterAuthX509: attributes: O=MongoDB, OU=MongoDB Server
注意
如果您禁用了 enforceUserClusterSeparation 参数,则以下行为适用
如果您的配置文件中的
clusterAuthMode是keyFile,则禁用O/OU/DC检查。这允许拥有成员证书的客户端作为存储在$external数据库中的用户进行身份验证。如果您的配置文件中的
clusterAuthMode不是keyFile,则服务器不会启动。
如果您将 enforceUserClusterSeparation 参数设置为 false,则服务器不会区分客户端证书(应用程序用于身份验证)和集群证书(具有特权访问)。如果您的 clusterAuthMode 是 keyFile,则此设置没有影响。但是,如果您的 clusterAuthMode 是 x509,则使用允许的方案的用户证书与集群证书合并,并授予特权访问。
如果执行以下操作,则现有证书将获得内部权限
创建一个用户,其名称允许此参数。
将
enforceUserClusterSeparation参数设置为false。将
clusterAuthMode设置为x509。
在验证您已移除由 enforceUserClusterSeparation 标志允许创建的具有高级权限的用户之前,不要从 keyFile 升级到 x509。
要将 enforceUserClusterSeparation 参数设置为 false,请在启动时运行以下命令
mongod --setParameter enforceUserClusterSeparation=false
证书有以下要求
单一证书颁发机构 (CA) 必须为分片集群或副本集的成员颁发所有 x.509 证书。
至少有一个主题备用名称 (SAN) 条目必须与用于其他集群成员的服务器主机名匹配。在比较
SAN时,MongoDB 可以比较 DNS 名称或 IP 地址。如果您没有指定
subjectAltName,MongoDB 将比较通用名称 (CN)。然而,这种 CN 的用法已被RFC2818如果用作
certificateKeyFile的证书包含extendedKeyUsage,则值必须包含clientAuth("TLS Web 客户端身份验证") 和serverAuth("TLS Web 服务器身份验证")。extendedKeyUsage = clientAuth, serverAuth 如果用作
clusterFile的证书包含extendedKeyUsage,则值必须包含clientAuth。extendedKeyUsage = clientAuth
配置副本集/分片集群
在滚动升级程序之外,副本集或分片集群的每个组件都应该使用相同的 --clusterAuthMode 设置,以确保它可以安全地连接到部署中的所有其他组件。
对于 副本集 部署,这包括副本集的所有 mongod 成员。
对于 分片集群 部署,这包括所有 mongod 或 mongos 实例。
使用命令行选项(tls)
注意
本节中的过程使用 tls 设置/选项。对于使用已废弃的 ssl 别名的过程,请参阅 使用命令行选项(ssl)。
tls 设置/选项与 ssl 选项提供相同的功能,因为 MongoDB 一直支持 TLS 1.0 及更高版本。
mongod --replSet <name> --tlsMode requireTLS --clusterAuthMode x509 --tlsClusterFile <path to membership certificate and key PEM file> --tlsCertificateKeyFile <path to TLS/SSL certificate and key file> --tlsCAFile <path to root CA file> --bind_ip localhost,<hostname(s)|ip address(es)>
重要
要使用 x.509 身份验证,除非您使用 --tlsCertificateSelector 或 --net.tls.certificateSelector,否则必须指定 --tlsCAFile 或 net.tls.CAFile。
包含您特定配置所需的所有其他选项,包括 TLS/SSL 或其他选项。
security: clusterAuthMode: x509 net: tls: mode: requireTLS certificateKeyFile: <path to its TLS/SSL certificate and key file> CAFile: <path to root CA PEM file to verify received certificate> clusterFile: <path to its certificate key file for membership authentication> bindIp: localhost,<hostname(s)|ip address(es)>
重要
要使用 x.509 身份验证,除非您使用 --tlsCertificateSelector 或 --net.tls.certificateSelector,否则必须指定 --tlsCAFile 或 net.tls.CAFile。
包含您特定配置所需的所有其他选项,包括 TLS/SSL 或其他选项。
有关更多信息,请参阅 配置 mongod 和 mongos 以使用 TLS/SSL。
使用命令行选项(ssl)
注意
本节中的过程使用已废弃的 ssl 设置/选项。对于使用 tls 别名的过程,请参阅 使用命令行选项(tls)。
tls 设置/选项与 ssl 选项提供相同的功能,因为 MongoDB 一直支持 TLS 1.0 及更高版本。
要指定内部集群成员身份验证的 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,<hostname(s)|ip address(es)>
重要
要使用 x.509 身份验证,除非您使用 --tlsCertificateSelector 或 --net.tls.certificateSelector,否则必须指定 --tlsCAFile 或 net.tls.CAFile。
包含您特定配置所需的所有其他选项,包括 TLS/SSL 或其他选项。
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,<hostname(s)|ip address(es)>
重要
要使用 x.509 身份验证,除非您使用 --tlsCertificateSelector 或 --net.tls.certificateSelector,否则必须指定 --tlsCAFile 或 net.tls.CAFile。
包含您特定配置所需的所有其他选项,包括 TLS/SSL 或其他选项。
有关更多信息,请参阅 配置 mongod 和 mongos 以使用 TLS/SSL。
附加信息
要从密钥文件内部认证升级到 x.509 内部认证,请参阅从密钥文件认证升级到 x.509 认证的自助管理 MongoDB。
要执行证书的滚动更新,将证书更新到具有不同 DN 的新证书,请参阅在自助管理集群上滚动更新包含新 DN 的 x.509 证书。