mysql的安全措施了解下

因为最近频发mysql数据库经常被某国的黑客攻击,恐吓咱们要拿比特币来赎回我的数据,殊不知就是你交了比特币,数据也拿不回来。那我们就需要给我的mysql加强点防御,不让他们轻易攻克我的mysql,从而出现数据丢失,对公司或者咱们造成无法挽回的损失图片。

别人轻易攻克我们的mysql的主要有一下特点:

任何机器ip客户端都可以访问我们的mysql

root账户暴露到外网,root权限大,俗话说权力越大越危险

数据丢失无法复原,因为没有开启binlog

数据没有备份容灾

下面是我们经常用的mysql的安全设置方案

mysql 配置白名单访问
步骤如下:
登录mysql

mysql -uroot -p mysql
切换至mysql库
use mysql;
查看有白名单权限的用户
select Host,User from user;
指定ip有权限访问mysql
GRANT ALL ON *.* to root@'192.168.1.4' IDENTIFIED BY 'your-root-password';
如果没有密码则不用填,

GRANT ALL ON *.* to root@'192.168.1.4' ;
@后面的是指定白名单的ip

MySQL通配符不是用* 而是用 %
允许一个网段登录,1个通配符或多个通配符,都需要增加WITH GRANT OPTION参数(如果不增加此参则无法实现,文档最后有官方解释)
GRANT ALL PRIVILEGES ON *.* TO root@'192.168.192.%' IDENTIFIED BY 'root' WITH GRANT OPTION;

GRANT ALL PRIVILEGES ON *.* TO root@'192.168.%.%' IDENTIFIED BY 'root' WITH GRANT OPTION;
删除白名单用户权限:(确定上一步指定的IP可以登陆后去除所有节点登陆权限)

如果Host出现%则表示任意节点都可以登陆,可将%的项去除,实现仅白名单登录目的。

DELETE FROM user WHERE User='root' and Host='%';
删除白名单用户的权限
DELETE FROM user WHERE User='username' and Host='host';
刷新
修改权限之后都要刷新才会生效

FLUSH PRIVILEGES;
验证

mysql> select host,user from user;
+-----------------+---------------+
| host            | user          |
+-----------------+---------------+
| 192.168.192.%   | root          |
| 192.168.192.134 | root          |
| localhost       | mysql.session |
| localhost       | mysql.sys     |
| localhost       | root          |
+-----------------+---------------+
5 rows in set (0.00 sec)
授权节点登录正常



未授权节点登录异常


然后官网查了下GRANT OPTION参数:

https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html
GRANT OPTION参数:



“允许用户将自己的权限授予其他用户,两个拥有不同权限且具有GRANT OPTION权限的用户可以组合权限。

除此之外还有处理 root账号不要暴露外网访问,密码设置复杂点,开辟新的用户,权限设置小一点,开启binlog

mysql设置白名单用户和指定ip访问设置到此搞定

mysql开启binlog






1 登录mysql查看是否开启binlog

show variables like 'log_%';











ON: 开启状态,OFF:关闭状态

2:修改my.cnf文件

在linux中可以通过命令查找文件位置

find / -name my.cnf
在[mysqld]后面增加如下配置

server_id=2
log_bin=mysql-bin
binlog_format=ROW
3:重启服务并验证

systectl restart mysqld

二、windows系统(mysql-5.7版本)

1:修改mysql的配置文件my.ini

my.ini位于C:\ProgramData\MySQL\MySQL Server 5.7。该文件默认不允许修改,需要右键取得所有权之后才能保存修改。

在[mysqld]下添加以下参数

log-bin=mysql-bin
binlog_format=Row
2:重启mysql验证

验证如下:



数据库备份

可以采用linux的脚本,对mysql半夜12点进行数据备份

Linux数据库备份脚本

前提:保存备份文件的服务器需要安装mysql,可以执行mysqldump命令

脚本编写(mysql_dump.sh)

脚本内容:注意一定要在unix环境下编写,如果在windows环境下重定向后文件名会出现问题。

注意替换mysql安装的路径(/usr/local/mysql/bin/mysqldump)和文件保存的路径(/test/dump/)

这里注意下: 备份时会锁表,尽量避免读写高峰期备份

#! /bin/bash
 login_user="root"
 
 login_passwd=""
 
 vDate=`date +%Y%m%d`
 
 backup_dir="/home/data/backups/"$vDate"/"
 
 echo $backup_dir
 
 if [ ! -d $backup_dir ];then
         mkdir -p $backup_dir
 fi
 
 # 将需要备份的数据放入
 db_array=("数据库1名字" "数据库2名字" "数据库3名字") #配置要备份的数据库
 
 for db_name in ${db_array[*]}
 do
     mysqldump -u root -p$login_passwd $db_name > $backup_dir$db_name.sql
 done
 
 # 删除7天前备份的文件
 find backup_dir -atime +7 -name "*.sql" -exec rm -rf {} \
 
 echo "备份结束"



执行 sh mysql_dump.sh,便可以在/test/dump目录下发现备份的数据库文件了

定时任务执行
使用linux的crontab命令定时执行备份数据的脚本

crontab -e
编辑定时任务,这里凌晨二点执行一次,编辑完保存即可,(夜猫子熬不到半夜两点)

00 02 * * * /bin/sh /test/mysql_dump.sh
定时任务的执行最小单位为分钟,详情代表如下:

*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期中星期几 (0 - 6) (星期天 为0)
|    |    |    +---------- 月份 (1 - 12)
|    |    +--------------- 一个月中的第几天 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

查看定时任务执行的日志:

tail -f /var/log/cron
至此linux下的定时备份MySQL数据,也完成了

mysql数据库容灾实时备份主从下期会补上,敬请期待









作者:老王

欢迎关注微信公众号 : IT学习道场