之所以想写这篇文章,是因为在工作中,经常被MySQL的用户授权问题折腾一下.日积月累....忍不住吐槽一下.
MySQL的安全包括很多方面,主要分为内部安全,外部安全及数据传输安全.
内部安全指MySQL的启动和安装目录权限,避免其他用户进入目录,随意访问数据.
外部安全指网络访问,其中用户授权是重点,也是接下来我要吐槽的.
加密传输,这个不多说,大部分数据库处于内网,很少有人使用.
mysql库的user表,是最常用来查看权限的,例如用下面的SQL查看当前实例有多少个授权用户和某一个用户的权限
SELECTuser,host,passwordFROM mysql.user;
SHOW GRANTS FOR 'username'@'hostname';
1.权限表条目增多.如果有20台主机需要连数据库,那么需要根据20台主机分别授权.
2.权限混乱,很难保证相同的用户名具有相同的权限.
3.追加授权操作成本太高.经常遇到这样的情况1,开发人员提交权限申请,密码处注明,"与原来一样".dba去MySQL查密码,结果同样的用户名,从不同IP连过来的密码不一致,分别查出权限后,再与开发确认后,进行授权.情况2,应用添加新机器,已经发布上线,突然发现没有权限,急忙催促dba添加.
4."脏授权"无法清理,很多因服务器更换,导致的旧IP授权留在数据库中,没人去清理.
因此,建议在内网的数据库,并且做了合理的网段隔离,应该把数据库授权的工作尽量简化,对网段授权.这虽然增加的连接MySQL的范围.但是如果有人要窃取数据的话,仍然要满足下面的条件:
1.登录到内网并有权限登录到任意一台服务器
2.知道MySQL的连接地址和帐号/密码
与精确到IP地址唯一不同的地方,便是"登录到任意一台,还是指定一台",这其中的安全与效率问题,需要大家根据自己的环境,折中考虑授权策略.
自动化脚本grant.py.txt
1. 脚本运行在python2.7环境中.
2. 如果grant.ini配置文件不存在,则会自动生成.
配置文件说明如下:
[proposer]
#申请人邮件地址
to_email =
# 抄送地址
cc_email =
[server]
# 登录目标数据库主机的用户名
srv_user =
# 数据库主机名
srv_host = db1
# 服务器的密码(禁止填写)
#srv_pwd =
[db]
# 登录数据库的用户名
db_user = xxxx
# 通过IP和端口连接
db_host = 127.0.0.1
db_port = 3306
# 对程序提供的ip(vip)地址
db_ip_writer = 192.168.250.1
#db_ip_reader =
# 登录数据库的密码(禁止填写)
#db_pwd = xxx
[grants]
# 添加的权限
permission = UPDATE,DELETE,INSERT,SELECT
# 库范围
database = *
# 表范围
table = *
# 添加的用户名
user = test1
# 允许连接的主机
host = 127.0.0.1,192.168.250.1,192.168.250.2
# 连接的密码(不需要填写,脚本会自动生成16位的密码,由Aa-Zz,0-9组成),追加用户授权时,可修改为加密的密文.
#password =
# 其他
#others =
脚本逻辑:
1.读取配置文件
2.拼接sql
3.显示/确认
4.确认后,写入用户目录的tempfile.sql文件中
5.将tempfile.sql文件传到目标服务器
6.在目标服务执行mysql ... -e 'source tempfile.sql'
7.删除本地和目标服务器的tempfile.sql文件
8.发送邮件通知申请人