2017年1月,当你们都在为16的逝去写总结,并为17年的到来作计划的时候,一波黑客发动了一轮攻击,攻击的对象瞄准了mongodb数据库。他们删除了全部数据库数据,并留下一个勒索数据库。不幸的是,我也成为这“幸运”的一员。
当收到用户反馈说,没法登录网站时,我还在奇怪。当我连上线上服务器时,看到了这个:
图片描述html
线上的数据库“food”已经被清空,大小为:0.000GB。并且,多了一个数据库“PLEASE_READ”,查看里面的数据,真是一个大大的惊喜。mongodb
{ "_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啊。
不过幸亏这只是我本身玩玩的一个项目,刚上线不久,数据也很少,以前备份过一点数据,将该数据恢复了。shell
在查到勒索数据时,立马查看了数据库log文件:数据库
能够看到,黑客也没有使用特别高深的技术,就像怎么把大象放到冰箱里同样,只用了三步:安全
直连数据库服务器
删除数据(至于有没有备份数据,就不知道了)网站
留下勒索信息spa
多么的简单粗暴。rest
黑客可以直接访问数据,也是怪我没有关闭外网访问权限,尴尬!
还有就是,这是本身直接在官网下载安装,没有安装发行版,而默认安装的mongodb是没有安全设置的。code
关闭外网访问权限,也就是限定只能是内网访问。
在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: 恢复的时候,先删除当前数据,而后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
备份策略
全量备份:能够最快的时间快速恢复全部数据,缺点是备份成本大,时间长;
全量备份+增量备份:能够较快的恢复全部数据,缺点是恢复时间长,若是增量数据有问题,没法恢复全部数据;
搭建从库,直接切换到从库,前提是从库的数据安全可靠。
经过此次的教训,更加深入认识到数据库安全的重要性,在之后的工做中必定要更加注重服务器和数据库的安全,作好安全措施。
谨记,安全,安全,安全。