08.MySQL安全管理
徐亮伟, 江湖人称标杆徐。多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型电商运维工作。
个人博客"徐亮伟架构师之路"累计受益数万人。
笔者Q:552408925、572891887
架构师群:471443208
在讨论安全时,我们需要考虑整个服务器主机安全(而不仅仅是MySQL服务)需要抵御攻击, 窃听, 扫描, 破解等。
MySQL
对所有连接数据库用户进行了ACL
访问控制,减少服务器被内部不规范操作导致故障。
MySQL
还支持客户端和服务器之间的SSL
加密连接。
当然这里讨论的许多概念都不是特定于MySQL
几乎所有的应用程序都适用相同的一般思路。
MySQL
运行时,请遵循以下准则:
- 不要给用户配置超级用户权限
- 不要在数据库中存储明文密码
- 不要使用较为简单的字符密码
- 不允许非授信任主机使用扫描
用户账户管理
1.登录和退出MySQL
, 使用mysql -u root -p
可以连接数据库, 但这只是本地连接数据库的方式, 在生产很多情况下都是连接网络中某一个主机上的数据库
-P //指定连接远程数据库端口[默认3306]
-h //指定连接远程数据库地址[默认localhost]
-u //指定连接远程数据库账户[默认root]
-p //指定连接远程数据库密码[默认密码为空]
-e //执行mysql数据库sql指令
-S //指定mysql数据库Socket
//不安全
[root@sql ~]# mysql -uroot -p'mypass'
//推荐方式
[root@sql ~]# mysql -uroot -p
Enter password:
//推送远程登录方式
[root@sql ~]# mysql -h192.168.56.11 -P3306 -uroot -p
Enter password:
//非交互式操作数据库
[root@sql ~]# mysql -uroot -pBgx123.com -e "show databases;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
2.创建用户
//先创建用户, 后授权(CREATE USER 语句创建)
mysql> create user bgx1@'localhsot' identified by 'BGX123.com';
//基于已有用户进行授权
mysql> grant all on *.* to bgx4@'localhost';
//使用GRANT 语句创建用户并授权
mysql> grant all on *.* to bgx2@'localhost' identified by 'BGX123.com';
3.删除用户
//1.drop user 语句删除
mysql> drop user 'bgx1'@'localhost';
#注意mysql5.6:先回收权限, 然后删除
mysql> revoke all privilege user_name;
mysql> drop user user_name;
//2.delete语句删除
mysql> delete from mysql.user
where user='bgx1' and host='localhost';
4.修改root
用户密码
//方法1, Shell修改方式
# mysqladmin -uroot -p'old_password' password 'new_password'
//方法2, 修改数据表
mysql> update mysql.user set
authentication_string=password('new_password')
where user='root' and host='localhost';
//刷新权限
mysql> flush privileges;
//方法3, 设定密码
mysql> set password=password('new_password');
5.修改其他用户密码
//方法1
mysql> create user bgx1@'localhost' identified by 'Bgx123.com';
mysql> set password for bgx1@'localhost'=password('new_password');
//方法2, 修改数据表
mysql> update mysql.user set
authentication_string=password('new_password')
where user='bgx1' and host='localhost';
//刷新权限
mysql> flush privileges;
//普通用户自己修改自己密码
set password=password("new_password");
访问权限系统
mysql权限表
- mysql.user 全局授权
- 用户字段
- 权限字段
- 安全字段
- 资源控制字段
- mysql.db (数据库级)
- 用户字段
- 权限字段
- mysql.tables_priv(表级)
- mysql.columns_priv(列级)
- 权限应用的顺序
- user->db->tables->columns
语法格式:
grant 权限列表 on 库名.表名 to '用户名'@'客户端主机' [identified by ' 密码' with option 参数];
相关参数:
- 1.权限列表
- all 所有权限(不包括授权权限)
- 单独授权
select,update,insert,delete
- 2.库名表名
*.*
所有库下的所有表Global level
bgx.*
针对bgx
库下的所有表Database level
bgx.student
针对bgx
库下的student
表Table level
SELECT (id),INSERT (name,age) ON bgx.t1
针对bgx
库下面t1
表的字段Column level
- 3.客户端主机
localhost
指定本机192.168.56.11
指定具体主机192.168.56.0
网段的所有主机192.168.2.%
网段的所有主机%
指定所有主机
- 4.
with
参数GRANT OPTION
授权选项MAX_QUERIES_PER_HOUR
定义每小时允许执行的查询数MAX_UPDATES_PER_HOUR
定义每小时允许执行的更新数MAX_CONNECTIONS_PER_HOUR
定义每小时可以建立的连接数MAX_USER_CONNECTIONS
定义单个用户同时可以建立的连接数
grant
授权示例
//
GRANT ALL ON *.* TO admin1@'%' IDENTIFIED BY '(Bgx123.com)';
//
GRANT ALL ON *.* TO admin2@'%' IDENTIFIED BY '(Bgx123.com)' WITH GRANT OPTION;
//
GRANT ALL ON bbs.* TO admin3@'%' IDENTIFIED BY '(Bgx123.com)';
//
GRANT ALL ON bbs.* TO admin3@'192.168.70.160' IDENTIFIED BY '(Bgx123.com)';
//
GRANT ALL ON bbs.user TO admin4@'%' IDENTIFIED BY '(Bgx123.com)';
//
GRANT SELECT(id),INSERT(name,age) ON bbs.user TO admin5@'%' IDENTIFIED BY '(Bgx123.com)';
访问权限回收
1.查看用户权限
mysql> show grants;
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
SHOW GRANTS\G
//查看其它用户权限
mysql> show grants for bgx2@'localhost';
+---------------------------------------------------+
| Grants for bgx2@localhost |
+---------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'bgx2'@'localhost' |
+---------------------------------------------------+
1 row in set (0.00 sec)
2.回收权限
语法: REVOKE 权限列表 ON 数据库名 FROM 用户名@'客户端主机';
//回收Delete权限
mysql> revoke DELETE on *.* from bgx2@'localhost';
//回收所有权限
mysql> revoke ALL PRIVILEGES ON *.* from 'bgx2'@'localhost';
//回收grant权限
mysql> revoke GRANT OPTION ON *.* from 'bgx2'@'localhost';