[mongo] [security] 9.3.3 身份验证方式(Authentication Mechanisms)【未完】

举报
dber 发表于 2021/01/29 13:37:55 2021/01/29
【摘要】 注意从版本4.0开始,MongoDB取消了对不推荐使用的MongoDB质询响应(MongoDB-CR)身份验证机制的支持。MongoDB支持以下身份验证机制:SCRAM(默认)x.509证书认证。另外,MongoDB Enterprise提供了与许多外部身份验证机制的集成,包括Kerberos和LDAP。有关MongoDB Enterprise支持的其他身份验证机制,请参阅 企业身份验证机制...

注意

从版本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客户端证书进行连接和身份验证,请执行以下操作:

您还可以先建立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进行内部身份验证:

但是,如果未指定群集文件,则成员可以使用中指定的证书密钥文件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证书接近到期触发警告。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。