使用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
,但不设置DC
net: 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 证书。