x.509
MongoDB 支持 x.509 证书认证,用于客户端认证以及副本集和分片集群成员的内部认证。
x.509 证书身份验证需要安全的 TLS/SSL connection。
证书颁发机构
对于生产用途,您的 MongoDB 部署应使用由证书颁发机构生成和签名的有效证书。 您或您的组织可以生成和维护独立的证书颁发机构,或使用第三方 TLS 供应商生成的证书。 获取和管理证书不在本文档的讨论范围之内。
客户端 x.509 证书
要对服务器进行身份验证,客户端可以使用 x.509 证书而不是用户名和密码。
客户端证书要求
客户端证书要求:
单个证书颁发机构 (CA) 必须同时为客户端和服务器颁发证书。
每个唯一的 MongoDB 用户必须有一个唯一的证书。
x.509 证书不能过期。
[NOTE]注意
在 4.4 版中更改:如果提供的 x.509 证书在
mongod
/mongos
主机系统时间的 30 天内过期,mongod/mongos 会记录连接警告。 有关详细信息,请参阅 x.509 Certificates Nearing Expiry Trigger Warnings 。客户端证书必须包含以下字段:
keyUsage = digitalSignature extendedKeyUsage = clientAuth
以下客户端证书属性中的至少一个必须与
net.tls.clusterFile
和net.tls.certificateKeyFile
服务器证书中的属性不同:- 组织 (
O
) 组织单位 (
OU
)域组件 (
DC
)
- 组织 (
包含专有名称 (DN) 的客户端 x.509 证书的主题必须不同于member x.509 certificates的主题。
[IMPORTANT]重要
如果客户端 x.509 证书的主题与Member x.509 Certificate (或
tlsX509ClusterAuthDNOverride
,如果已设置)的O
、OU
和DC
属性完全匹配,则客户端连接被接受,权限被授予完全,并在日志中出现一条提示信息。只有cluster member x509 certificates应该使用相同的 O、OU 和 DC 属性组合。
4.2 新版功能:如果 MongoDB 部署设置了
tlsX509ClusterAuthDNOverride
,则客户端 x.509 证书的主题不得与该值匹配。
MongoDB 用户和 $external 数据库
要使用客户端证书进行身份验证,您必须首先将客户端证书的主题添加为 $external
数据库中的 MongoDB 用户。 `$external 数据库是用户的Authentication Database。
每个唯一的 x.509 客户端证书适用于一个 MongoDB 用户。 您不能使用单个客户端证书对多个 MongoDB 用户进行身份验证。
要对 $external 身份验证用户(Kerberos、LDAP 或 x.509 用户)使用Client Sessions and Causal Consistency Guarantees,用户名不能超过 10k 字节。
TLS 连接 X509 证书启动提示
从 MongoDB 5.0 开始,mongod
和 mongos
现在在其证书不包含Subject Alternative Name属性时发出启动警告。
以下平台不支持公用名验证:
- iOS 13 and higher
- MacOS 10.15 and higher
- Go 1.15 and higher
使用这些平台的客户端将不会向使用主机名由specified by CommonName attributes的 x.509 证书的 MongoDB 服务器进行authenticate。
成员 x.509 证书
对于分片集群和副本集成员之间的内部身份验证,您可以使用 x.509 证书而不是keyfiles。
成员证书要求
使用成员证书来验证分片集群或副本集的成员身份。 成员证书存储在 net.tls.clusterFile
和 net.tls.certificateKeyFile
中。 成员证件要求:
单个证书颁发机构 (CA) 必须为分片集群或副本集的成员颁发所有 x.509 证书。
x.509 证书不能过期。
[NOTE]注意
在 4.4 版中更改:如果提供的 x.509 证书在
mongod
/mongos
主机系统时间的 30 天内过期,mongod/mongos 会记录连接警告。 有关详细信息,请参阅 x.509 Certificates Nearing Expiry Trigger Warnings 。在成员证书的主题中找到的可分辨名称 (
DN
) 必须至少为以下属性之一指定非空值:- 组织 (
O
) - 组织单位 (
OU
) - 域组件 (
DC
)
- 组织 (
每个集群成员证书在其
net.tls.clusterFile
和net.tls.certificateKeyFile
证书中必须具有相同的 Os、OU 和 DC。 这也适用于tlsX509ClusterAuthDNOverride
值(如果已设置)。 属性顺序无关紧要。这是一个例子。 下面两个
DN
有O
和OU
的匹配规范,不指定DC
。CN=host1,OU=Dept1,O=MongoDB,ST=NY,C=US C=US, ST=CA, O=MongoDB, OU=Dept1, CN=host2
以下示例不正确,因为
DN
不匹配。 一个DN
有两个OU
规范,另一个只有一个OU
规范。CN=host1,OU=Dept1,OU=Sales,O=MongoDB CN=host2,OU=Dept1,O=MongoDB
Common Name (
CN
) 或 Subject Alternative Name (SAN
) 条目之一必须与其他集群成员的服务器主机名匹配。 从 MongoDB 4.2 开始,在比较SAN
时,MongoDB 可以比较 DNS 名称或 IP 地址。 在以前的版本中,MongoDB 只比较 DNS 名称。例如,集群的证书可能具有以下
subject
s: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 Web 客户端身份验证”)。extendedKeyUsage = clientAuth
用于成员身份验证的 MongoDB 配置
您可以使用 TLS 在副本集(每个 mongod
实例)或分片集群(每个 mongod
和 mongos
实例)的每个成员之间进行内部身份验证。
要使用 TLS 进行内部身份验证,请使用以下设置:
security.clusterAuthMode
or--clusterAuthMode
set tox509
net.tls.clusterFile
or--tlsClusterFile
(从 MongoDB 4.2 开始可用)
mongod
和 mongos
实例使用它们的证书密钥文件向客户端证明它们的身份,但证书密钥文件也可用于成员身份验证。 如果不指定集群文件,成员将使用他们的证书密钥文件进行成员身份验证。 使用 net.tls.certificateKeyFile
或 --tlsCertificateKeyFile
指定证书密钥文件(从 MongoDB 4.2 开始可用)。
要将证书密钥文件用于客户端身份验证和成员身份验证,证书必须:
- 省略
extendedKeyUsage
或 指定
extendedKeyUsage = serverAuth, clientAuth
参见
原文 - x.509
译者:景圣