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库下的studentTable 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';