近日服务器收到攻击,数据库被清空并插入了一个表,内容如下:
warning | bitcoin_address | |
---|---|---|
To recover your lost Database and avoid leaking it: Send us 0.1 Bitcoin (BTC) to our Bitcoin address 1J6jLduCXbPyxt5EMTs7iHwdafANy4ThJc and contact us by Email with your Server IP or Domain name and a Proof of Payment. If you are unsure if we have your data, contact us and we will send you a proof. Your Database is downloaded and backed up on our servers. Backups that we have right now: xxx,xxx,xxx . If we dont receive your payment in the next 10 Days, we will make your database public or use them otherwise. | 1J6jLduCXbPyxt5EMTs7iHwdafANy4ThJc | admin@yourdatabase.biz |
紧急处理
造成的原因因为mysql账号密码被暴力破解和允许远程访问,需要做一些紧急处理
- 禁用远程
为了方便,开放允许远程连接,而且没加ip限制,导致黑客有机可乘。所以我们现在要把一切远程连接关闭。
本机登陆
// 服务器中国登陆数据库
$ mysql -u 你的账号 -p
$ 你的密码
查看用户
有一个特殊的数据库,数据库名为mysql,表名为user,它存储了服务器数据库有用户信息和访问权限。
// 选用mysql系统表
$ use mysql;
// 查询全部的用户和host
$ select user,host form user;
host
为允许访问的主机地址,'%
代表全部允许,如果发现host
的信息为%
,那这就是问题所在了,把它全删了。
$ delete from user where host = '%';
这时候任何远程访问都会被禁止,无法在本机外访问了。
刷新一下缓存,让配置生效
$ flush privileges;
- 删除黑客账号
作为一个专业的黑客,自然会给自己留后路,比如偷偷加一个数据库账号,所以我们要还要查一下用户表。
$ select user from user;
如果发现不认识的账号,一定要删了,如只保留根角色
// 删除一切非根用户
$ delete from user where user != 'root';
除了这一步之外,我们还需要去db表
相应删除
// 删除一切非根用户
$ delete from db where user != 'root';
同样记得刷新缓存,让配置生效
$ flush privileges;
- 修改密码
尽管前面已经禁用了远程,可是密码已经泄露了,终究不安全,所以我们还要再去改密码。
还是在系统user表中,有一个password字段,它存储着用户的密码,不过是加密后的,更新的时候需要用系统方法password()
。这里已更新root账号的为例
// 更新密码
$ update user set password = password('你的新密码');
新密码一定要复杂,可以考虑闭着眼睛敲(记得复制出来,要不忘了)。
更新完后还是记得更新缓存(当然可以最后再刷新缓存)。
- 修改端口
mysql默认端口是3306,黑客随便试一下就可以发现了,我们应该修改一下数据库的端口。(尽管还可以进行端口扫描,可是猜不到也没作用)
首先我们在mysql环境下查询一下当前所用的端口是什么
$ show global variables like 'port';
Variable_name | port |
---|---|
port | 3306 |
退出mysql命令行模式。
如果我们计划把端口改成3305,先检查一下端口是否被占用
netstat -tunlp |grep 3305
如果没有任何输出那就证明没有被占用。
紧接着我们打开mysql的配置文件,在/etc/my.cnf。
修改3306端口为一个新的端口
vim /etc/my.cnf
[mysqld]
port=3305
如果[mysqld]
下没有port
参数,加一个即可。
保存退出vim。
然后我们重启mysql服务
$ systemctl restart mysqld
是mysqld
,不是mysql
。
然后发现3306已经连不上了,需要用新端口才可以。
- 重置数据
信息泄露了终究不安全,不过我所泄露的信息都是一些测试数据,关系不大,我重置一下就可以了。
自定义
上述操作会导致远程无法连接,如果又想安全又想方便,可以通过限制ip的方式,首先我们创建一个用户,给该用户分配有限的权限,然后设置一个复杂的密码,最后加上ip限制就可以了,下面是详细做法。
- 新建用户
使用root登录数据库后,进入到系统mysql表。假设我们创建zhangsan用户,密码是123456
$ create user zhangsan identified by '123456';
如果创建成功,会默认创建一个%
ip限制的用户,如果创建失败,先删除用户再创建即可。
- 分配权限
创建完zhangsan
用户后,我们还需要为其分配数据库,处于安全考虑,一般只分配部分数据库,比如把ABC数据库的全部权限都分配给zhangsan,执行如下:
$ grant all privileges on ABC.* to zhangsan@'%' identified by '123456';
ABC.*
代表ABC数据库下的全部权限
%
为默认不限制host。
此时zhangsan用户只能查看到ABC数据库下的
的内容。
- 限制ip
上两步都提到,host还是默认的%,不加限制,我们当然需要添加ip限制,更新一下user即可。
$ update user set host = '你的ip' where user = 'zhangsan';
此时只允许指定ip通过。
- 刷新缓存
既然修改了数据库配置,那就需要刷新使得配置生效。
$ flush privileges;
建议
针对此事项,建议做以下调整,以防范黑客攻击:
1、服务器的管理员密码具备一定复杂度,建议使用字母、数字、字符组合的密码。
2、服务器关闭远程访问(或关闭外网的远程访问),调整远程访问默认的端口号。
3、mysql的root用户密码具备一定复杂度,建议使用字母、数字、字符组合的密码。
4、mysql不允许任意远程端连接,建议仅对协同系统所在的IP地址放开连接。
5、mysql不使用默认的3306端口,建议修改为其他端口。(mysql的配置文件:Windows为my.ini、Linux为my.cnf,修改其端口号)
6、mysql设置定时备份,并将数据备份包备份在异机(或异地)。