起因
2017年1月,当大家都在为16的逝去写总结,并为17年的到来做计划的时候,一波黑客发动了一轮攻击,攻击的对象瞄准了mongodb数据库。他们删除了所有数据库数据,并留下一个勒索数据库。不幸的是,我也成为这“幸运”的一员。
当收到用户反馈说,无法登陆网站时,我还在奇怪。当我连上线上服务器时,看到了这个:
线上的数据库“food”已经被清空,大小为:0.000GB。而且,多了一个数据库“PLEASE_READ”,查看里面的数据,真是一个大大的惊喜。
{
"_id" : ObjectId("58702744f933f563e815c44f"),
"Info" : "Your DB is Backed up at our servers, to restore send 0.1 BTC to the Bitcoin Address then send an email with your server ip",
"Bitcoin Address" : "1J5ADzFv1gx3fsUPUY1AWktuJ6DF9P6hiF",
"Email" : "kraken0@india.com"
}
数据被删,没有做过备份,然后被勒索0.1BTC,有大神说黑客也没有证据说明他对你的数据库做了备份,且我也没有BTC啊。
不过幸好这只是我自己玩玩的一个项目,刚上线不久,数据也不多,之前备份过一点数据,将该数据恢复了。
防范措施
在查到勒索数据时,立马查看了数据库log文件:
可以看到,黑客也没有使用特别高深的技术,就像怎么把大象放到冰箱里一样,只用了三步:
- 直连数据库
- 删除数据(至于有没有备份数据,就不知道了)
- 留下勒索信息
多么的简单粗暴。
黑客能够直接访问数据,也是怪我没有关闭外网访问权限,尴尬!
还有就是,这是自己直接在官网下载安装,没有安装发行版,而默认安装的mongodb是没有安全设置的。
记住这个教训,立马采取一些措施:
关闭万网访问权限
关闭外网访问权限,也就是限定只能是内网访问。
在mongodb.conf中配置:
bind_ip 127.0.0.1
修改默认端口
mongodb默认的端口是27017,修改端口:
port 27038
访问用户授权
在admin 数据库中创建用户,如 supper 密码为 supWDxsf67%H(此处均为举例说明,请勿使用此账号密码)
步骤一:在未开启认证的环境下,登录到数据库
[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27028 (此处修改了默认端口)
MongoDB shell version: 2.0.1
connecting to: 127.0.0.1:27028/test
步骤二:切换到admin数据库
> use admin
switched to db admin
>
步骤三:创建管理员账号
> db.addUser("supper", "supWDxsf67%H")
或
>db.createUser({user:"supper",pwd:"supWDxsf67%H",roles:["root"]})
{ "n" : 0, "connectionId" : 4, "err" : null, "ok" : 1 }
{
"user" : "supper",
"readOnly" : false,
"pwd" : "51a481f72b8b8218df9fee50b3737c44",
"_id" : ObjectId("4f2bc0d357a309043c6947a4")
}
新增的用户在system.users中
> db.getCollectionNames()
[ "system.indexes", "system.users", "system.version" ]
说明:
1)MongoDB从V3版本开始取消使用addUser方法,采用db.createUser方法创建用户;
2)账号不要设置为常见账号,密码需要满足一定的复杂度,至少8位以上,包括大小写字母、数字、特殊字符混合体,不要使用生日、姓名、身份证编号等常见密码。
步骤四:验证用户是否创建成功
> db.auth("supper","supWDxsf67%H")
1
> exit
bye
步骤五:杀掉进程,重启mongoDB服务
./mongod --dbpath=/path/mongodb --bind_ip=192.168.0.1 --port=27028 --fork=true logpath=/path/mongod.log &
经常备份你的数据库
对数据进行本地异地备份,好的备份策略是保证数据安全的最后一根救命稻草。
推荐策略:可靠的本地备份+远程备份存储方案
MongoDB备份方式(API参考):
>mongodump -h dbhost -d dbname -o dbdirectory
-h:
MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d:
需要备份的数据库实例,例如:test
-o:
备份的数据存放位置,例如:c:\data\dump,该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。
MongoDB数据恢复方式(API参考):
mongodb使用 mongorestore 命令来恢复备份的数据。
语法
mongorestore命令脚本语法如下:
>mongorestore -h dbhost -d dbname --directoryperdb dbdirectory
-h:
MongoDB所在服务器地址
-d:
需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
--directoryperdb:
备份数据所在位置,例如:c:\data\dump\test,这里为什么要多加一个test,而不是备份时候的dump。
--drop:
恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
备份策略
- 全量备份:可以最快的时间快速恢复所有数据,缺点是备份成本大,时间长;
- 全量备份+增量备份:可以较快的恢复所有数据,缺点是恢复时间长,如果增量数据有问题,无法恢复所有数据;
- 搭建从库,直接切换到从库,前提是从库的数据安全可靠。
后记
通过这次的教训,更加深刻认识到数据库安全的重要性,在以后的工作中一定要更加注重服务器和数据库的安全,做好安全措施。
谨记,安全,安全,安全。