缘由
最近翻出之前写的代码,使用了阿里云上面的mongdb服务,结果运行一直报错,经过多处排查发现是数据库请求返回为空,通过Robo 3T登录看了下mongdb数据库,结果如下:
惨遭攻击,被索要Bitcoin,幸好只是不重要的数据,不过以此为例,对之前做的东西进行反思,是不是没有一点安全意识?尽管只是一个练习项目。
查看mongod日志 /var/log/mongodb/mongod.log,可以看的有法国/荷兰/韩国等的PyMongo, mongo-go-driver等的客户端的连接,连接后对方就开始丧心病狂的先drop file admin local weather 等数据库。
观察推测对方使用软件扫描端口,一旦发现有机可乘,便通过修改/etc/mongod.conf, 修改net bindIp,以便其能通过不同IP访问,然后建立多个连接进行删库操作。
改进
- 修改默认端口,mongodb默认是27017,改成一个自定义的端口,并且绑定本机,编辑/etc/mongod.conf下的配置信息。
# mongod.conf
net:
port: 12121
bindIp: 127.0.0.1
security:
authorization: enabled
上面设置新端口为12121,你也可以用其他端口,查询一个端口是否被使用可以使用以下命令
$ nc -l 3000
nc: Address already in use
$ nc -l 23456
Listening on [0.0.0.0] (family 0, port 23456)
使用lsof -i :port
可以查询哪个进程服务(pid)使用了特定的port,(关于lsof的详细使用,可以参考这里
) 然后可以kill -9 pid
杀掉对应的进程。
- 编辑好后需要重启服务才能生效
sudo service mongod restart
遇到上述命令无法执行,编辑sudo vim /etc/systemd/system/mongodb.service
写入以下内容:
[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target
[Service]
User=mongodb
ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf
[Install]
WantedBy=multi-user.target
- 开启mongodb权限验证
mongo --port 12121
use admin
db.createUser( { user: "*******", pwd: "********", roles: [ { role: "readWriteAnyDatabase", db: "admin" }, { role: "userAdminAnyDatabase", db: "admin" } ] } )
db.auth("username", "password") // 对用户角色进行授权
db.system.users.find()
后续计划
开启主从复制
https://zhuanlan.zhihu.com/p/50597960
https://blog.csdn.net/Mr_EvanChen/article/details/80408750
https://blog.csdn.net/ycy258325/article/details/84767053
https://lihaoquan.me/2018/9/29/postgresql-master-slave-ha.html