使用 x. 509 证书进行自管理 MongoDB 的成员身份验证
MongoDB 支持与安全 TLS/SSL 连接一起使用的 x.509 证书身份验证。分片集群节点和副本集节点可以使用 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)。 但是,根据 RFC ,CN 的这种用法已被弃用2818如果用作
certificateKeyFile
的证书包含extendedKeyUsage
,则该值必须同时包含clientAuth
(“TLS Web 客户端身份验证”)和serverAuth
(“TLS Web 服务器身份验证”)。extendedKeyUsage = clientAuth, serverAuth 如果用作
clusterFile
的证书包含extendedKeyUsage
,则该值必须包含clientAuth
。extendedKeyUsage = clientAuth
配置副本集/分片集群
在滚动升级程序之外,副本集或分片集群的每个组件都应使用相同的 --clusterAuthMode
设置,以确保能安全地连接到部署中的所有其他组件。
对于分片集群部署,其中包括所有 mongod
或 mongos
实例。
注意
leafygreen-ui-tqgtui 和 leafygreen-ui-tqgtui,默认绑定到本地主机。如果部署的成员在不同的主机上运行,或者希望远程客户端连接到部署,则必须指定 --bind_ip
或 net.bindIp
。
使用命令行选项 (tls
)
注意
本部分中的过程将使用 tls
设置/选项。有关使用已弃用的 ssl
别名的过程,请参阅使用命令行选项 (ssl
)。
由于 MongoDB 始终支持 TLS 1.0 及更高版本,因此 tls
设置/选项可提供与 ssl
选项相同的功能。
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 身份验证,则必须指定 --tlsCAFile
或 net.tls.CAFile
,除非使用 --tlsCertificateSelector
或 --net.tls.certificateSelector
。
包括特定配置所需的任何其他选项(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 身份验证,则必须指定 --tlsCAFile
或 net.tls.CAFile
,除非使用 --tlsCertificateSelector
或 --net.tls.certificateSelector
。
包括特定配置所需的任何其他选项(TLS/SSL 或其他)。
如需了解更多信息,请参阅为 TLS/SSL 配置 mongod
和 mongos
。
使用命令行选项 (ssl
)
注意
本部分中的过程使用已弃用的ssl
设置/选项。 有关使用tls
别名的过程,请参阅使用命令行选项 ( tls
)。
由于 MongoDB 始终支持 TLS 1.0 及更高版本,因此 tls
设置/选项可提供与 ssl
选项相同的功能。
要指定用于内部集群节点身份验证的 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 身份验证,则必须指定 --tlsCAFile
或 net.tls.CAFile
,除非使用 --tlsCertificateSelector
或 --net.tls.certificateSelector
。
包括特定配置所需的任何其他选项(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 身份验证,则必须指定 --tlsCAFile
或 net.tls.CAFile
,除非使用 --tlsCertificateSelector
或 --net.tls.certificateSelector
。
包括特定配置所需的任何其他选项(TLS/SSL 或其他)。
如需了解更多信息,请参阅为 TLS/SSL 配置 mongod
和 mongos
。
更多信息
要从密钥文件内部身份验证升级到 x. 509内部身份验证,请参阅将自管理MongoDB从密钥文件身份验证升级到 x。 509身份验证。
如需将证书滚动更新为 DN
不同的新证书,请参阅“在自管集群上滚动更新包含新 DN 的 x.509 证书”。