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学习道场