由于最近涉及大公司的数据泄露,安全性再次成为一个热门话题。例如,据ZDNet报道,中国企业泄露了惊人的5.9亿份简历。大部分的简历泄漏都是由于数据库安全性差,没有密码就暴露在网上,或者由于意外的防火墙错误而导致数据库在线。在文中提到的8起黑客攻击中,只有一起与MongoDB有关,但这一漏洞占到了曝光文件的三分之一左右
在另一个报道中,一个印度政府机构在网上留下了数百万孕妇的详细信息。暴露的数据包含了关于病人、医生和医疗中心的详细信息。在撰写本文时,MongoDB数据库仍然在没有密码的情况下暴露在网上。好消息是病历已经从数据库中删除了
由于它的NoSQL起源和文档体系结构设计,MongoDB比SQL数据库更加灵活和可伸缩。因此,MongoDB中存储的数据通常比传统SQL数据库多得多,MongoDB数据库的数据量通常超过1万亿字节。单个数据库中可以暴露的大量数据使得涉及MongoDB的漏洞更具破坏性
好消息是,自2009年推出MongoDB产品以来,在提高MongoDB安全性方面做了很多工作。以上提到的所有违规都可以通过一些简单的行动来避免
MongoDB提供了什么来缓解安全威胁?让我们探讨几个领域和建议的解决方案,以及MongoDB的未来
MongoDB中的数据加密
MongoDB最严重的问题之一是数据文件没有加密。Percona Server for MongoDB自3.6.8版起,为MongoDB社区版提供静态加密。在上游MongoDB软件中,静态数据加密仅在MongoDB Enterprise中可用
下面的示例演示如何在Percona Server for MongoDB中为静态数据激活WiredTiger加密。首先,需要在中编辑加密选项mongod.conf文件地址:
# Encryption variables in mongod.conf shell
[root@app ~]# grep security -A2 etc/mongod.conf
security:
enableEncryption: true
encryptionKeyFile: data/key/mongodb.key复制
默认情况下,用于MongoDB的Percona服务器使用AES256-CBC密码模式。需要使用OpenSSL创建密钥,如下所示:
# Create Encryption KeyShell
[root@app ~]# mkdir data/key
[root@app ~]# openssl rand -base64 32 > data/key/mongodb.key
[root@app ~]# chmod 600 data/key/mongodb.key复制
现在为MongoDB启动Percona服务器:
[root@app ~]# systemctl start mongod复制
要检查数据库中是否成功启用了加密,请使用以下命令:
# Security outputShell
mongo > db.serverCmdLineOpts().parsed.security
{ "enableEncryption" : true, "encryptionKeyFile" : "/data/key/mongodb.key" }复制
MongoDB中的传输加密
MongoDB支持在客户机和节点之间以及集群中的节点之间使用传输加密。加密流量确保没有人可以“嗅探”网络上的敏感数据。例如,Wireshark或Tcpdump等工具可以轻松捕获未加密的敏感数据,如用户名和密码
MongoDB支持用于安全TLS/SSL连接的X.509证书身份验证。成员可以使用X.509证书来验证其副本集的成员资格
为了使用加密,有必要在所有节点上创建证书,并让证书颁发机构(CA)对其进行签名。因为使用证书颁发机构可能会非常昂贵,所以也可以使用自签名证书。在私有基础设施中不需要使用公共CA
要设置SSL,必须修改配置文件:
# etc/mongod.conf
net:
port: 27017
ssl:
mode: <disabled|allowSSL|preferSSL|requireSSL>
PEMKeyFile: etc/ssl/mongo复制
MongoDB中的授权
对MongoDB部署启用访问控制将强制进行身份验证,要求用户标识自己。访问启用了访问控制的MongoDB部署时,用户只能执行由其角色确定的操作。此外,当启用访问控制时,副本集和分片集群需要成员之间的内部身份验证。遵循最小特权原则很重要。任何人都不应被授予超出其工作所需的权限,甚至DBA也应使用非提升帐户登录
MongoDB通过基于角色的授权授予对数据和命令的访问权限,并包含内置角色,这些角色提供数据库系统中通常需要的不同访问级别。此外,还可以创建用户定义的角色
要在MongoDB中创建角色并将其添加到用户:
db.createRole({
role : 'write_foo2_Collection',
privileges : [ {resource : {db : "percona", collection : "foo2"}, actions : ["insert","remove"]}
],
roles : ["read"]
})
db.updateUser('client_read', roles : ['write_foo2_Collection'])复制
MongoDB中的身份验证
大多数涉及MongoDB的漏洞都是因为默认情况下禁用了身份验证。MongoDB提供了对每个数据库级别的身份验证的支持。用户存在于单个逻辑数据库的上下文中。但是,MongoDB不支持诸如密码复杂性、基于年龄的轮换、用户角色与服务功能的集中化和标识等项目
谢天谢地,LDAP可以用来填补这些空白。许多连接器允许使用Windows Active Directory(AD)系统与LDAP进行通信
LDAP支持在MongoDB Enterprise中可用,但在MongoDB Community Edition中不可用。但是,它也可以在MongoDB的其他开源版本中使用,比如用于MongoDB的Percona服务器
要在Percona Server for MongoDB中设置LDAP身份验证,请执行以下步骤:
1。配置mongod.conf文件将文件放入/etc/sasl2文件夹(作为根目录):
Shell
# mkdir -p etc/sasl2
# echo 'pwcheck_method: saslauthd
saslauthd_path: var/run/saslauthd/mux
log_level: 5
mech_list: plain' > etc/sasl2/mongod.conf复制
2。编辑mongod.conf文件,或添加启动参数,以便使用sasauthd库验证用户和密码。如果使用配置文件:
setParameter:
authenticationMechanisms: PLAIN,SCRAM-SHA-1复制
如果使用启动参数:
--setParameter authenticationMechanisms=PLAIN,SCRAM-SHA-1复制
以root用户身份创建第一个用户。考虑到进程已启动并正在运行,有必要创建一个管理员用户。对于本例,将创建一个名为admin、具有根角色的用户(这意味着该用户可以执行数据库中的任何操作):
mongo > use admin
mongo > db.createUser({user : 'admin', pwd: '1234', roles :['root']})复制
使用LDAP身份验证创建标准用户。在执行下一个操作时,管理数据库中没有保存密码。下面的命令基于LDAP创建一个用户,密码验证在数据库外部执行。Cyrus库为验证回答OK或NOK,授权文档(角色)仍由数据库管理:
use admin
> db.auth('admin','1234')
1
> db.getSiblingDB("$external").createUser({
user : 'support1',
roles: [ {role : "read", db: 'percona'} ]
})
Successfully added user: {
"user" : "support1",
"roles" : [
{
"role" : "read",
"db" : "percona"
}
]
}复制
MongoDB中的审计
审计不是为了减轻安全威胁,而是在调查未经授权的访问或跟踪数据访问和修改时提供帮助。一般的数据库审计概念是关于跟踪数据库记录和权限的使用。对数据库进行审核时,可以监视对数据的每个操作,并将其记录到审核跟踪中,包括涉及哪个数据库对象或数据记录、哪个帐户执行了操作以及活动何时发生的信息
MongoDB Atlas在本机提供审计日志记录,Percona Server for MongoDB将此功能扩展到MongoDB社区版。要在命令行或配置文件中为MongoDB启用Percona服务器中的审核日志,请在命令行中添加以下条目:
mongod --dbpath /var/lib/mongodb --auditDestination file --auditFormat BSON --auditPath /var/lib/mongodb/auditLog.bson复制
或者在MongoDB配置文件中:
auditLog:
destination: file
format: BSON
path: /var/lib/mongodb/auditLog.bson复制
MongoDB喜欢防火墙
必须将任何数据库服务器置于防火墙之后,特别是当它包含个人识别信息(PII)或受保护的健康信息(PHI)时。使用默认端口,允许匿名登录,并将数据库暴露在Internet上,这些都会造成一场完美的漏洞风暴。防火墙是第一道防线,尤其是在公共云中运行MongoDB时
最后,值得一提的是,MongoDB最近聘请了有史以来第一位首席信息安全官lenasmart,这对MongoDB安全的未来是个好兆头。斯马特是一位拥有20年网络安全经验的老手,拥有令人印象深刻的简历,最近担任国际金融科技公司Tradeweb的全球首席信息安全官。我们可以预期MongoDB的安全性将继续提高
Vinicius Grippa在Percona担任MongoDB和MySQL的支持工程师,Percona是企业级MySQL、MongoDB和PostgreSQL解决方案和服务的提供商