linux入门-mysql安全防范

近日服务器收到攻击,数据库被清空并插入了一个表,内容如下:

warningbitcoin_addressemail
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.1J6jLduCXbPyxt5EMTs7iHwdafANy4ThJcadmin@yourdatabase.biz

紧急处理

造成的原因因为mysql账号密码被暴力破解和允许远程访问,需要做一些紧急处理

  1. 禁用远程
    为了方便,开放允许远程连接,而且没加ip限制,导致黑客有机可乘。所以我们现在要把一切远程连接关闭。
    本机登陆
// 服务器中国登陆数据库
$ mysql -u 你的账号 -p
$ 你的密码

查看用户
有一个特殊的数据库,数据库名为mysql,表名为user,它存储了服务器数据库有用户信息和访问权限。

// 选用mysql系统表
$ use mysql;
// 查询全部的用户和host
$ select user,host form user;

host为允许访问的主机地址,'%代表全部允许,如果发现host的信息为%,那这就是问题所在了,把它全删了。

$ delete from user where host = '%';

这时候任何远程访问都会被禁止,无法在本机外访问了。
刷新一下缓存,让配置生效

$ flush privileges;
  1. 删除黑客账号
    作为一个专业的黑客,自然会给自己留后路,比如偷偷加一个数据库账号,所以我们要还要查一下用户表。
$ select user from user;

如果发现不认识的账号,一定要删了,如只保留根角色

// 删除一切非根用户
$ delete from user where user != 'root';

除了这一步之外,我们还需要去db表相应删除

// 删除一切非根用户
$ delete from db where user != 'root';

同样记得刷新缓存,让配置生效

$ flush privileges;
  1. 修改密码
    尽管前面已经禁用了远程,可是密码已经泄露了,终究不安全,所以我们还要再去改密码。
    还是在系统user表中,有一个password字段,它存储着用户的密码,不过是加密后的,更新的时候需要用系统方法password()。这里已更新root账号的为例
// 更新密码
$ update user set password = password('你的新密码');

新密码一定要复杂,可以考虑闭着眼睛敲(记得复制出来,要不忘了)。
更新完后还是记得更新缓存(当然可以最后再刷新缓存)。

  1. 修改端口
    mysql默认端口是3306,黑客随便试一下就可以发现了,我们应该修改一下数据库的端口。(尽管还可以进行端口扫描,可是猜不到也没作用)
    首先我们在mysql环境下查询一下当前所用的端口是什么
$ show global variables like 'port'; 
Variable_nameport
port3306

退出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已经连不上了,需要用新端口才可以。

  1. 重置数据
    信息泄露了终究不安全,不过我所泄露的信息都是一些测试数据,关系不大,我重置一下就可以了。

自定义

上述操作会导致远程无法连接,如果又想安全又想方便,可以通过限制ip的方式,首先我们创建一个用户,给该用户分配有限的权限,然后设置一个复杂的密码,最后加上ip限制就可以了,下面是详细做法。

  1. 新建用户
    使用root登录数据库后,进入到系统mysql表。假设我们创建zhangsan用户,密码是123456
$ create  user  zhangsan  identified  by  '123456';

如果创建成功,会默认创建一个%ip限制的用户,如果创建失败,先删除用户再创建即可。

  1. 分配权限
    创建完zhangsan用户后,我们还需要为其分配数据库,处于安全考虑,一般只分配部分数据库,比如把ABC数据库的全部权限都分配给zhangsan,执行如下:
$ grant all privileges on ABC.* to zhangsan@'%' identified by '123456';

ABC.*代表ABC数据库下的全部权限
%为默认不限制host。

此时zhangsan用户只能查看到ABC数据库下的
的内容。

  1. 限制ip
    上两步都提到,host还是默认的%,不加限制,我们当然需要添加ip限制,更新一下user即可。
$ update user set host = '你的ip' where user = 'zhangsan';

此时只允许指定ip通过。

  1. 刷新缓存
    既然修改了数据库配置,那就需要刷新使得配置生效。
$ flush privileges;

建议

针对此事项,建议做以下调整,以防范黑客攻击:

1、服务器的管理员密码具备一定复杂度,建议使用字母、数字、字符组合的密码。

2、服务器关闭远程访问(或关闭外网的远程访问),调整远程访问默认的端口号。

3、mysql的root用户密码具备一定复杂度,建议使用字母、数字、字符组合的密码。

4、mysql不允许任意远程端连接,建议仅对协同系统所在的IP地址放开连接。

5、mysql不使用默认的3306端口,建议修改为其他端口。(mysql的配置文件:Windows为my.ini、Linux为my.cnf,修改其端口号)

6、mysql设置定时备份,并将数据备份包备份在异机(或异地)。

    原文作者:Msgyvcici
    原文地址: https://www.jianshu.com/p/fc40a549e293
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞