MongoDB 8.0——安全性

📅 2026/8/4 4:20:59
MongoDB 8.0——安全性
安全性1、安全性介绍2、基于SCRAM的身份验证2.1、SCRAM机制2.2、使用SCRAM对客户端进行身份验证3、基于x.509的身份验证3.1、x.509机制3.2、使用x.509对客户端进行身份验证4、加密4.1、加密方法4.2、选择正在使用的加密方法4.3、静态加密4.4、TLS/SSL1、安全性介绍MongoDB数据库的安全性主要通过多种机制和技术来保障包括身份验证、访问控制、加密、传输加密以及审计日志等。这些措施共同作用确保数据的安全性和完整性。MongoDB的主要安全功能包括身份验证MongoDB支持多种身份验证机制如SCRAM和X.509证书身份验证用于用户凭据的验证。访问控制基于角色的访问控制(Role-Based AccessControlRBAC)为不同用户和应用程序分配不同的访问权限。加密支持数据传输加密和存储加密使用SSL/TLS协议对数据传输进行加密并使用加密算法对数据存储进行加密。传输加密通过TLS/SSL协议配置加密mongod、mongos、应用程序和MongoDB之间的通信通道确保数据传输的安全。审计日志记录所有的数据库操作包括谁对数据库进行了哪些操作帮助管理员监控数据库的访问和操作情况。常见的MongoDB安全威胁主要有以下几方面。未经授权的访问未经授权的用户或应用程序可能会访问MongoDB数据库导致数据泄露或篡改。数据库泄露配置不当或存在漏洞可能会导致数据库内容泄露给未经授权的第三方。拒绝服务攻击(Distributed Denial of ServiceDDoS)恶意用户可能会发起拒绝服务攻击导致数据库无法正常响应请求影响业务正常运行。数据篡改恶意用户可能会篡改数据库中的数据破坏数据的完整性。2、基于SCRAM的身份验证2.1、SCRAM机制MongoDB数据库中的Salted质询响应身份验证机制(Salted Challenge Response AuthenticationMechanismSCRAM)是MongoDB默认的身份验证机制。当用户进行身份验证时MongoDB会使用SCRAM针对用户的name、password和authenticationdatabase来验证所提供的用户凭证。SCRAM基于IETF RFC 5802标准该标准定义了实现质询响应机制以使用密码对用户进行身份验证的最佳实践。MongoDB的SCRAM实现提供了以下功能可调工作因子迭代计数​。每个用户的随机盐。服务器和客户端之间的双向身份验证。MongoDB数据库支持的SCRAM机制如表所示。创建或更新SCRAM用户时可以指定如下内容要使用的SCRAM机制。对密码进行摘要处理的是服务器还是客户端。如果使用SCRAM-SHA-256MongoDB需要服务器端密码哈希这意味着服务器会对密码进行摘要处理。如果使用SCRAM-SHA-1MD5是有必要使用的但并不用于加密目的。如果使用的是FIPS模式则不使用SCRAM-SHA-1而是使用SCRAM-SHA-256、Kerberos、LDAP或x.509。2.2、使用SCRAM对客户端进行身份验证在独立运行的mongod实例上进行客户端身份验证设置SCRAM的步骤如下步骤1在没有访问控制的情况下启动MongoDB。在没有访问控制的情况下启动独立运行的mongod实例打开终端并以mongod用户的身份运行以下命令mongod--port27017--dbpath/var/lib/mongodb上面代码中使用的端口(port 27017)和数据目录路径(/var/lib/mongodb)只是具体的示例。设计人员可以根据自己的实际项目需求进行指定。这里补充说明一下当mongod启动时会在数据目录路径(/var/lib/mongodb)中创建一些系统文件。为了确保系统文件具有正确的所有权需要以mongod用户身份登录。如果以root用户身份启动mongod则必须稍后更新文件所有权。步骤2连接到实例。打开新终端并使用mongosh连接到集群具体命令如下mongosh--port27017如要连接到其他部署可根据需要指定–host等其他命令行选项进行连接。步骤3创建用户管理员。使用mongosh切换到admin数据库添加具有userAdminAnyDatabase和readWriteAnyDatabase角色的myUserAdmin用户具体命令如下use admin db.createUser({user:myUserAdmin,pwd:passwordPrompt(),//or cleartext passwordroles:[{role:userAdminAnyDatabase,db:admin},{role:readWriteAnyDatabase,db:admin}]})在上述代码中passwordPrompt()方法会提示输入密码在使用时也可以直接将密码指定为字符串。这里建议使用passwordPrompt()方法可以避免将密码显示在屏幕上同时避免将密码泄露到Shell历史记录中。一般情况下userAdminAnyDatabase角色允许用户进行如下操作创建用户。授予或撤销用户的角色。创建或修改自定义角色。另外可以根据需要为用户分配其他内置角色或用户自定义角色。创建该用户的数据库即为该用户的身份验证数据库。虽然该用户需要通过此数据库进行身份验证但该用户还可能会在其他数据库中拥有角色。同时该用户的身份验证数据库不会限制该用户的特权。步骤4使用访问控制重新启动MongoDB实例。关闭mongod实例使用mongosh发出以下命令db.adminCommand({shutdown:1})然后退出mongosh命令行。在启用访问控制的情况下启动mongod如果在命令行中启动mongod则需要添加–auth命令行选项mongod--auth--port27017--dbpath/var/lib/mongodb如果使用配置文件启动mongod则添加以下security.authorization配置文件设置连接到此实例的客户端现在必须对自身进行身份验证并且只能执行由所分配角色确定的操作。步骤5连接并认证为用户管理员。使用mongosh即可进行身份验证包括在连接期间进行身份验证和在连接后进行身份验证两种情形。在连接期间进行身份验证使用-u username、-p和–authenticationDatabasedatabase命令行选项启动mongosh具体命令如下mongosh--port27017--authenticationDatabaseadmin-umyUserAdmin-p然后根据提示输入密码。在连接后进行身份验证使用mongosh连接到数据库部署mongosh--port27017在mongosh中切换到身份验证数据库并使用db.auth(username, pwd)方法进行身份验证use admin db.authmyUserAdmin,passwordPrompt()// or cleartext password然后根据提示输入密码。3、基于x.509的身份验证3.1、x.509机制MongoDB数据库支持将x.509证书用于客户端身份验证以及副本集和分片集群成员的内部身份验证使用x.509证书进行身份验证需要安全的TLS/SSL连接。MongoDB对于生产用途的部署要求使用由证书颁发机构生成和签名的有效证书。对于客户端x.509证书要对服务器进行身份验证客户端可以使用x.509证书来替代用户名和密码。关于x.509客户端证书的具体要求说明如下必须由一个证书颁发机构(Certificate AuthorityCA)同时向客户端和服务器颁发证书。每个唯一的MongoDB用户必须拥有唯一的证书。x.509证书不能过期。如果显示的x.509证书在mongod/mongos主机系统时间后的30天内过期则mongod/mongos会在连接时记录警告。客户端证书必须包含以下字段以下客户端证书属性中至少有一个必须与net.tls.clusterFile和net.tls.certificateKeyFile服务器证书中的属性不同组织(Organization, O)。组织单位(Organizational Unit, OU)。域控制器(Domain Controller, DC)。keyUsagedigitalSignature extendedKeyUsageclientAuth客户端x.509证书的subject包含标识名(DistinguishedName, DN)必须与成员x.509证书的subject不同。如果MongoDB部署设置了tlsX509ClusterAuthDNOverride则客户端x.509证书的主题不得与该值匹配。要使用客户端证书进行身份验证必须先将客户端证书的subject作为MongoDB用户添加到$external数据库中$external数据库是用户的身份验证数据库。每个唯一的x.509客户端证书对应一个MongoDB用户不能使用一个客户端证书验证多个MongoDB用户。要对$external身份验证用户Kerberos、LDAP或x.509用 户使用客户端会话和因果一致性保证用户名不能大于10KB。3.2、使用x.509对客户端进行身份验证下面介绍通过设置x.509证书身份验证用于独立运行mongod实例上的客户端身份验证。这种方法也称为双向TLS或mTLS。关于TLS/SSL、PKIPublic KeyInfrastructure公钥基础设施证书尤其是x.509证书和证书颁发机构的完整描述已超出本文档的范围。对于生产用途MongoDB部署应使用由证书颁发机构生成和签名的有效证书。如果使用x.509身份验证则必须指定–tlsCAFile或net.tls.CAFile除非使用–tlsCertificateSelector或–net.tls.certificateSelector。对于客户端x.509证书使用时必须拥有有效的x.509证书客户x.509证书必须符合客户端证书要求。如果指 定–tlsAllowInvalidCertificates或net.tls.allowInvalidCertificates: true则无效证书仅足以建立TLS连接但不足以进行身份验证。在独立运行的mongod实例上进行客户端身份验证设置x.509的步骤具体内容如下步骤1使用x.509身份验证进行部署。通过命令行为x.509身份验证配置mongod实例要配置独立运行的mongod实例可运行以下命令步骤2添加x.509证书subject作为用户。要使用客户端证书进行身份验证必须先以MongoDB用户身份将客户端证书中的subject值添加到$external数据库。每个唯一的x.509客户端证书对应一个MongoDB用户同时不能使用一个客户端证书验证多个MongoDB用户。对于用户名有如下要求要对$external身份验证用户Kerberos、LDAP或x.509用户使用客户端会话和因果一致性保证用户名不能大于10KB。subject字符串中的RDN必须与RFC2253标准兼容。步骤3使用x.509证书进行身份验证。将x.509客户端证书主题添加为相应的MongoDB用户后可以使用该客户端证书进行身份验证包括使用身份验证进行连接和连接后进行身份验证两种情形。使用身份验证进行连接要在连接过程中进行身份验证可运行以下命令连接后进行身份验证在连接后使用db.auth()方法进行身份验证。例如使用mongosh命令连接到mongod若要进行身份验证则需要使用$external数据库中的db.auth()方法在mechanism字段中指定MONGODB-X509。4、加密4.1、加密方法MongoDB数据库提供以下加密方法正在使用的加密。分别是可查询Queryable Encryption和客户端字段级加密(Client-Side Field LevelEncryptionCSFLE)。选择正在使用的加密方法可以在同一部署中同时使用可查询加密(QueryableEncryption)和客户端字段级加密但它们在同一集合中彼此不兼容。静态加密。静态加密与传输加密和保护相关账户、密码和加密密钥的安全策略结合使用。静态加密可以帮助确保符合安全和隐私标准包括HIPAA、PCI-DSS和FERPA。TLS/SSL传输加密​。MongoDB支持使用TLS/SSL传输层安全性/安全套接层加密MongoDB的所有网络 流量。TLS/SSL可确保MongoDB网络流量只能由目标客户端读取。4.2、选择正在使用的加密方法MongoDB提供两种“正在使用的加密”方法分别是可查询加密和客户端字段级加密。使用其中一种方法时即可在自动加密和显式加密之间进行选择。可查询加密和客户端字段级加密都允许客户端应用程序在通过网络传输数据之前对其进行加密。敏感数据由客户端透明地加密和解密并且仅以加密形式与服务器通信。在实施使用可查询加密或客户端字段级加密的应用程序时需要特别注意以下安全注意事项客户端字段级加密和可查询加密不提供任何ACID一致性保证以防止攻击者访问客户主密钥和数据加密密钥。客户端字段级加密和可查询加密不能提供ACID一致性保证攻击者可以对包含加密数据的集合进行任意写入访问权限。MongoDB使用模式验证来实施集合中特定字段的加密。如果没有客户端模式客户端将下载集合的服务器端模式来确定要加密哪些字段。如果要避免此问题可使用客户端模式验证。由于CSFLE和Queryable Encryption不提供验证模式完整性的机制因此依赖服务器端模式意味着相信服务器的模式没有被篡改。如果攻击者破坏了服务器他们就可以修改模式使以前加密的字段不再被标记为加密这会导致客户端发送该字段的明文值。可查询加密支持对加密字段进行相等和范围查询。对使用可查询加密进行前缀、后缀和子字符串查询的支持正在开发中。客户端字段级加密支持对确定性加密字段进行相等查询。可查询加密的新加密算法使用基于结构化加密的随机加密可从同一输入生成不同的加密输出值。客户端字段级加密算法同时支持随机加密和确定性加密。但是它仅支持查询确定性加密的字段。使用确定性加密给定的输入值始终加密为相同的输出值。MongoDB对可查询加密和客户端字段级加密的查询进行加密以便服务器避免有关明文文档或查询值的信息。借助可查询加密私有查询更进一步可以编辑日志和元数据以清理有关查询存在的信息这样可以确保更强的隐私性和机密性。4.3、静态加密MongoDB静态加密与传输加密结合使用时可以保护相关账户、密码和加密密钥的安全策略从而确保数据库符合安全和隐私标准包括HIPAA、PCI-DSS和FERPA。MongoDB Enterprise 3.2为WiredTiger存储引擎引入了一个原生加密选项此功能允许MongoDB加密数据文件仅限持有解密密钥的各方可以解码和读取数据。Windows上的MongoDB Enterprise不再支持将AES256-GCM作为静态加密的分组密码算法仅Linux版本支持此用法。如果启用加密MongoDB Enterprise使用的默认加密模式则是通过OpenSSL实现的AES256-CBC或是采用密码分组链接模式的256位高级加密标准​。AES-256使用对称密钥即使用同一密钥来加密和解密文本。MongoDB Enterprise for Linux还支持经过身份验证的加密AES256-GCM或是采用Galois/Counter模式的256位高级加密标准​。加密存储引擎使用认证的底层操作系统加密提供程序来执行加密操作。例如在Linux操作系统上安装的MongoDB将使用OpenSSL libcrypto FIPS-140模块。要在符合FIPS标准的模式下运行MongoDB需要将操作系统配置为在FIPS强制模式下运行。配置MongoDB以启用net.tls.FIPSMode设置。重新启动mongod或mongos。检查服务器日志文件以确认FIPS模式已启用。如果FIPS模式已启用则日志文件中会显示消息FIPS 140-2 modeactivated。数据加密流程包括步骤1生成主密钥。步骤2为每个数据库生成密钥。步骤3用数据库密钥加密数据。步骤4使用主密钥来加密数据库密钥。此加密在存储层以透明方式进行即从文件系统的角度来看所有数据文件都是完全加密的而数据仅以未加密状态存在于内存和传输过程中。如果要加密MongoDB的所有网络流量可以使用TLS/SSL传输层安全性/安全套接字层​。4.4、TLS/SSLMongoDB支持使用TLS/SSL加密MongoDB的所有网络流量。TLS/SSL可确保MongoDB网络流量只能由目标客户端读取。1. mongod和mongos证书密钥文件在建立TLS/SSL连接时mongod和mongos会向其客户端提交证书密钥文件以确定其身份。证书密钥文件包含公钥证书及其关联的私钥但仅向客户端透露公钥部分。MongoDB可以使用自签名证书或证书颁发机构颁发的任何有效TLS证书。如果使用自签名证书尽管会加密通信通道以防止窃听连接但不会验证服务器身份。2客户端的TLS/SSL配置客户端必须支持TLS/SSL才能连接到需要TLS/SSL连接的mongod或mongos实例。关于TLS/SSL、PKI公钥基础设施证书和证书颁发机构的完整描述可以参看官方权威说明。对于TLS/SSL连接mongosh会验证mongod或mongos实例提供的证书。3为FIPS配置MongoDBFIPS是加密系统的属性而不是访问权限控制系统的属性。但是如果环境需要符合FIPS标准的加密和访问权限控制则必须确保访问权限控制系统仅使用符合FIPS标准的加密。MongoDB的FIPS支持涵盖MongoDB使用SSL/TLS库进行网络加密、SCRAM身份验证和x.509身份验证的方式。如果使用Kerberos或LDAP身份验证则必须确保这些外部机制与FIPS兼容。