linux入门-mysql安全防范

作者: MsgSS | 来源:发表于2019-04-29 18:33 被阅读4次

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

    warning bitcoin_address email
    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账号密码被暴力破解和允许远程访问,需要做一些紧急处理

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

    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设置定时备份,并将数据备份包备份在异机(或异地)。

    相关文章

      网友评论

        本文标题:linux入门-mysql安全防范

        本文链接:https://www.haomeiwen.com/subject/weeunqtx.html