x.509
MongoDB 支持 x.509 证书认证,用于客户端认证以及副本集和分片集群成员的内部认证。
x.509 证书身份验证需要安全的TLS/SSL 连接。
证书颁发机构
对于生产用途,您的 MongoDB 部署应使用由证书颁发机构生成和签名的有效证书。您或您的组织可以生成和维护独立的证书颁发机构,或使用第三方 TLS 供应商生成的证书。获取和管理证书超出了本文档的范围。
客户端 x.509 证书
要向服务器进行身份验证,客户端可以使用 x.509 证书而不是用户名和密码。
客户端证书要求
客户端证书要求:
单个证书颁发机构 (CA) 必须同时为客户端和服务器颁发证书。
每个唯一的 MongoDB 用户必须有一个唯一的证书。
x.509 证书不能过期。
笔记:
在 4.4 版中更改:如果提供的 x.509 证书在 mongod/mongos 主机系统时间的 30 天内过期,mongod/mongos 会记录连接警告。有关详细信息,请参阅 x.509 证书即将到期触发器警告。
客户端证书必须包含以下字段:
keyUsage = digitalSignature extendedKeyUsage = clientAuth
以下客户端证书属性中的至少一个必须与服务器证书和 服务器证书 中的属性不同:
net.tls.clusterFile
net.tls.certificateKeyFile
- 组织 (
O
) - 组织单位 (
OU
) - 域组件 (
DC
)
- 组织 (
包含专有名称 (DN) 的客户端 x.509 证书的主题必须不同于成员 x.509 证书的主题。
重要的:
如果客户端x.509证书的主题与成员x.509证书(或tlsX509ClusterAuthDNOverride,如果已设置)的O、OU和DC属性完全匹配,则接受客户端连接,授予完全权限,并在日志中显示警告消息
Only cluster member x509 certificates should use the same
O
,OU
, andDC
attribute combinations.4.2新版功能:如果设置了 MongoDB 部署
tlsX509ClusterAuthDNOverride
,则客户端 x.509 证书的主题不得与该值匹配
MongoDB 用户和$external
数据库
要使用客户端证书进行身份验证,您必须首先将客户端证书添加subject
为数据库中的 MongoDB 用户$external
。该$external
数据库是用户的身份验证数据库。
每个唯一的 x.509 客户端证书适用于一个 MongoDB 用户。您不能使用单个客户端证书对多个 MongoDB 用户进行身份验证。
要对身份验证用户(Kerberos、LDAP 或 x.509 用户)使用客户端会话和因果一致性保证,$external
用户名不能超过 10k 字节
TLS 连接 X509 证书启动警告
从 MongoDB 5.0 开始,mongod
现在mongos
当他们的证书不包含 Subject Alternative Name属性时发出启动警告。
以下平台不支持公用名验证:
- iOS 13 及更高版本
- MacOS 10.15 及更高版本
- Go 1.15 及更高版本
使用这些平台的客户端将不会 向使用主机名由 CommonName 属性指定的x.509 证书的 MongoDB 服务器进行 身份验证。
成员 x.509 证书
对于分片集群和副本集成员之间的内部身份验证,您可以使用 x.509 证书而不是keyfiles 。
会员证书要求
使用成员证书来验证分片集群或副本集的成员身份。成员证书存储在 net.tls.clusterFile
和中net.tls.certificateKeyFile
。会员证件要求:
单个证书颁发机构 (CA) 必须为分片集群或副本集的成员颁发所有 x.509 证书。
x.509 证书不能过期。
笔记:
在4.4版中更改:
mongod
/如果提供的 x.509 证书在主机系统时间 的几天mongos
内过期,则在连接时记录警告。有关详细信息,请参阅 x.509 证书即将到期触发器警告。30``mongod/mongos
DN
在成员证书的 中找到的 可分辨名称 ( ) 必须至少为以下属性之一subject
指定非空值:- 组织 (
O
) - 组织单位 (
OU
) - 域组件 (
DC
)
- 组织 (
每个集群成员证书在其和 证书中必须具有相同的
O
s、OU
s 和DC
s 。如果已设置,这也适用于该值。属性顺序无关紧要。net.tls.clusterFile
net.tls.certificateKeyFile
tlsX509ClusterAuthDNOverride
这是一个例子。下面的两个
DN
s 具有O
与 和 的匹配规范OU
,并且DC
未指定。CN=host1,OU=Dept1,O=MongoDB,ST=NY,C=US C=US, ST=CA, O=MongoDB, OU=Dept1, CN=host2
以下示例不正确,因为
DN
s 不匹配。一种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
s 时,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
或--clusterAuthMode
设置为x509
net.tls.clusterFile
或--tlsClusterFile
(从 MongoDB 4.2 开始可用)
mongod
和mongos
实例使用它们的证书密钥文件向客户端证明它们的身份,但证书密钥文件也可用于成员身份验证。如果不指定集群文件,成员将使用他们的证书密钥文件进行成员身份验证。net.tls.certificateKeyFile
使用或 指定证书密钥文件--tlsCertificateKeyFile
(从 MongoDB 4.2 开始可用)。
要将证书密钥文件用于客户端身份验证和成员身份验证,证书必须:
- 省略
extendedKeyUsage
或 - 指定
extendedKeyUsage = serverAuth, clientAuth
翻译:韩鹏帅
原文:x.509