[mongo] [security] 9.3.3 身份验证方式(Authentication Mechanisms)【未完】
注意
从版本4.0开始,MongoDB取消了对不推荐使用的MongoDB质询响应(MongoDB-CR)身份验证机制的支持。
MongoDB支持以下身份验证机制:
另外,MongoDB Enterprise提供了与许多外部身份验证机制的集成,包括Kerberos和LDAP。有关MongoDB Enterprise支持的其他身份验证机制,请参阅 企业身份验证机制。
默认的身份验证机制
从MongoDB 3.0开始, Salted Challenge Response Authentication Mechanism(SCRAM)是MongoDB的默认身份验证机制。
指定认证机制
要指定要使用的身份验证机制,请authenticationMechanisms 为mongod 和 设置 参数 mongos。
客户端在 db.auth() 方法中指定身份验证机制。对于 mongo Shell 和 MongoDB 工具,您还可以从命令行指定身份验证机制。
SCRAM
注意
从版本4.0开始,MongoDB删除了对Challenge-Response (MONGODB-CR) 身份验证机制的支持。
如果您的部署中有用户凭据存储在 MONGODB-CR 架构中,则必须先升级到SCRAM,然后再升级到4.0版。有关升级到SCRAM的信息 SCRAM,请参阅 升级到SCRAM。
SCRAM是MongoDB的默认身份验证机制。SCRAM基于IETF RFC 5802标准,该标准定义了实现挑战响应(challenge-response) 机制的最佳实践,用密码对用户进行身份验证。
使用SCRAM,MongoDB根据用户名、密码和身份验证数据库验证提供的用户凭据。身份验证数据库是创建用户的数据库,与用户名一起用于标识用户。
功能
MongoDB的SCRAM实现提供:
- 可调整的工作因子(即迭代次数),
- 每位使用者的随机salts,以及
- 服务器与客户端相互身份验证。
SCRAM机制
MongoDB支持以下SCRAM机制:
SCRAM机制 | 描述 |
---|---|
SCRAM-SHA-1 | 使用SHA-1哈希函数。 要修改其迭代计数SCRAM-SHA-1,请参见 scramIterationCount。 |
SCRAM-SHA-256 | 使用SHA-256哈希函数,并要求featureCompatibilityVersion(fcv)设置为4.0。 要修改其迭代计数SCRAM-SHA-256,请参见 scramSHA256IterationCount。 版本4.0中的新功能。 |
创建或更新SCRAM用户时,您可以指定SCRAM机制,也可以指定服务器还是客户端提取密码。使用SCRAM-SHA-256时,MongoDB需要服务器端密码哈希,即服务器提取密码。有关详细信息,请参见 db.createUser()和 db.updateUser()。
驱动程序支持
要使用SCRAM,如果当前驱动程序版本不支持,则必须升级驱动程序 SCRAM。
支持的最低驱动程序版本 SCRAM 为:
Driver Language | Version | Driver Language | Version |
---|---|---|---|
C | 1.1.0 | Perl | 1.0.0 |
C++ | 1.0.0 | PHP | 1.0 |
C# | 1.10 | Python | 2.8 |
Java | 2.13 | Motor | 0.4 |
Node.js | 1.4.29 | Ruby | 1.12 |
Scala |
x.509
MongoDB支持x.509证书身份验证,用于客户端身份验证以及副本集和分片群集成员的内部身份验证。
x.509证书身份验证需要安全的TLS / SSL连接。
注意
从版本4.0开始,MongoDB在可用TLS 1.1+的系统上禁用对TLS 1.0加密的支持。有关更多详细信息,请参阅禁用TLS 1.0。
证书颁发机构
对于生产用途,您的MongoDB部署应使用由单个证书颁发机构生成和签名的有效证书。您或您的组织可以生成和维护独立的证书颁发机构,或者使用第三方TLS / SSL供应商生成的证书。获取和管理证书超出了本文档的范围。
客户端x.509证书
若要向服务器进行身份验证,客户端可以使用x.509证书代替用户名和密码。
客户证书要求
客户端证书必须具有以下属性:
-
证书颁发机构(CA)必须同时为客户端和服务器颁发证书。
-
客户端证书必须包含以下字段:
keyUsage = digitalSignature extendedKeyUsage = clientAuth
-
每个唯一的MongoDB用户必须具有唯一的证书。
-
客户端X.509证书的主题,其中包含了专有名称(DN),必须区别 成员X.509证书。
客户端证书中的组织(O),组织单位(OU)或域组件(DC)属性至少必须与net.tls.clusterFile和 net.tls.certificateKeyFile服务器证书中的属性不同 。
如果MongoDB部署设置了tlsX509ClusterAuthDNOverride(从MongoDB 4.2开始可用),则客户端x.509证书的主题也必须与此值不同。
警告
如果客户端x.509证书的主题与成员x.509证书具有相同的O、OU和DC组合(如果设置了tlsX509ClusterAuthDNOverride),则会拒绝客户端连接。只有群集成员x509证书应使用相同的O、OU和DC组合,因为这将授予完全权限。
-
x.509证书一定不可 过期。
在4.4版本有改变:
如果提供的x.509证书在mongod/mongos主机系统时间的30天内过期,mongod/mongos会在连接时记录警告。有关详细信息,请参阅x.509 Certificates Nearing Expiry Trigger Warnings。
MongoDB的用户和 $external 数据库
要使用客户端证书进行身份验证,必须首先将客户端证书中的subject的值添加MongoDB用户。每个唯一的x.509客户端证书对应于一个MongoDB用户;即,不能使用单个客户端证书对多个MongoDB用户进行身份验证。
在$external数据库中添加用户;即 认证数据库是$external数据库
在版本3.6.3中更改:要与$external身份验证用户(即Kerberos,LDAP,x.509用户)一起使用会话,用户名不能大于10k字节。
验证
要使用x.509客户端证书进行连接和身份验证,请执行以下操作:
- 对于MongoDB 4.2或更高版本,请为客户端包括以下选项:
--tls(或不建议使用的--ssl选项)
- --tlsCertificateKeyFile (或不建议使用的--sslPEMKeyFile选项)
- --tlsCertificateKeyFilePassword (或不建议使用的--sslPEMKeyPassword选项)如果证书密钥文件已加密
- --authenticationDatabase '$external'
- --authenticationMechanism MONGODB-X509
- 对于MongoDB 4.0和更早版本,为客户端包括以下选项:
您还可以先建立TLS / SSL连接,然后db.auth()在$external数据库中使用 它进行身份验证。
有关两种情况的示例,请参阅使用x.509证书对客户端进行身份验证 中的使用x.509证书进行身份验证(使用tls选项)部分。
成员x.509证书 (Member x.509 Certificates)
对于内部身份验证,分片群集和副本集的成员可以使用x.509证书代替使用SCRAM身份验证机制的 密钥文件。
成员证书要求
用于验证分片群集或副本集成员身份的成员证书(net.tls.clusterFile,如果指定,则为net.tls.certificateKeyFile)必须具有以下属性:
-
单个证书颁发机构(CA)必须为分片群集或副本集的成员颁发所有x.509证书。
-
在成员证书的主题中找到的可分辨名称(DN)必须为以下至少一个属性指定非空值:组织(O)、组织单位(OU)或域组件(DC)。
-
组织属性(O's)、组织单元属性(OU's)和域组件(DC's)必须与来自这两个域的属性匹配net.tls.clusterFile文件以及net.tls.certificateKey文件其他集群成员的证书(或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 包含不匹配的 OU 属性,因为一个包含两个 OU 规范,另一个包含一个规范。
CN=host1,OU=Dept1,OU=Sales,O=MongoDB
CN=host2,OU=Dept1,O=MongoDB
-
通用名(CN)或主可选择名(SAN)之一必须与服务器的主机名匹配,该主机名由集群的其他成员使用。从MongoDB 4.2开始,在执行SAN比较时,MongoDB支持DNS名称或IP地址的比较。在以前的版本中,MongoDB仅支持DNS名称的比较。
例如,群集的证书可以具有以下主题:
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
您还可以使用不包含扩展密钥用法(EKU)的证书。
-
x.509证书不得过期。
在4.4版本改变:如果提供的x.509证书在mongod/mongos主机系统时间的30天内过期,mongod/mongos会在连接时记录警告。有关详细信息,请参阅x.509证书接近到期触发警告。
MongoDB成员身份验证配置
除了适用于部署的任何TLS/SSL配置之外,还包括以下配置,以便为副本集(即mongod实例)或分片集群(即mongod和mongos实例)的每个成员指定x.509进行内部身份验证:
- security.clusterAuthMode或--clusterAuthMode设置为x509
- net.tls.clusterFile或--tlsClusterFile(在MongoDB 4.2中都是新功能)
但是,如果未指定群集文件,则成员可以使用中指定的证书密钥文件net.tls.certificateKey文件或者--tlsCertificateKeyFile(都是MongoDB 4.2中新增的),用于成员身份验证。mongod(和mongos)实例使用此证书密钥文件向客户端证明其身份,但也可以用于成员身份验证。要同时用于客户端身份验证和成员身份验证,证书必须:
- 省略extendedKeyUsage或
- 指定extendedKeyUsage值
注意
尽管仍然可用,net.ssl.clusterFile文件(以及相应的--sslClusterFile)和net.ssl.PEMKeyFile文件(以及相应的--sslPEMKeyFile)在MongoDB 4.2中被弃用。
对于使用MongoDB 4.0版及更早版本的部署,请使用net.ssl.clusterFile文件(或相应的--sslClusterFile)和net.ssl.PEMKeyFile文件(或相应的--sslPEMKeyFile)。
-
x.509证书不得过期。
在4.4版本改变:如果提供的x.509证书在mongod/mongos主机系统时间的30天内过期,mongod/mongos会在连接时记录警告。有关详细信息,请参阅x.509证书接近到期触发警告。
- 点赞
- 收藏
- 关注作者
评论(0)