Menu Close

MariaDB用户权限及权限管理

1. MariaDB 权限级别介绍

  • 全局:可以管理整个MySQL
  • 库:可以管理指定的数据库
  • 表:可以管理指定数据库的指定表
  • 字段:可以管理指定数据库的指定表的指定字段

权限存储在 mysql 库的 user, db, global_priv, tables_priv, columns_priv, procs_priv 几个系统表中,待 mariadb 实例启动后就加载到内存中。

2. User表

user表有39个字段。这些字段可以分为4类:

  • 用户列:
    用户列包括Host、User、Password,分别表示主机名、用户名和密码。登录用的就是这个用户名与密码;

  • 权限列:
    user表的权限列包括 Select_priv、Insert_priv 等以 priv 结尾的字段。
    这些字段的值只有Y和N。Y表示该权限可以用到所有数据库上;N表示该权限不能用到所有数据库上
    通常,可以使用GRANT语句为用户赋予一些权限,也可以通过Update语句更新user表的方式来设置权限(但不推荐);

  • 安全列:
    user表的安全列有4个字段:ssl_type、ssl_cipher、x509_issuer、x509_subject;
    ssl用于加密;x509标准可以用来标识用户。普通的发行版都没有加密功能。可以使用 SHOW VARIABLES LIKE 'have_openssl' 语句来查看是否具有ssl功能。如果取值为DISABLED,那么则没有ssl加密功能。

  • 资源控制列:
    user表的4个资源控制列是:
    max_questions:每小时可以允许执行多少次查询;
    max_updates:每小时可以允许执行多少次更新;
    max_connections:每小时可以建立多少连接;
    max_user_connections:单个用户可以同时具有的连接数;
    默认值为0,表示无限制。

2.1 权限列的含义

权限 描述
select_priv 确定用户是否可以通过SELECT命令选择数据
insert_priv 确定用户是否可以通过INSERT命令插入数据
update_priv 确定用户是否可以通过UPDATE命令修改现有数据
delete_priv 确定用户是否可以通过DELETE命令删除现有数据
create_priv 确定用户是否可以创建新的数据库和表
drop_priv 确定用户是否可以删除现有数据库和表
reload_priv 确定用户是否可以执行刷新和重新加载MySQL所用各种内部缓存的特定命令,包括日志、权限、主机、查询和表
shutdown_priv 确定用户是否可以关闭MySQL服务器,将此权限提供给root账户之外的任何用户时,都应当非常谨慎
process_priv 确定用户是否可以通过SHOW
file_priv 确定用户是否可以执行select into outfile和load data infile命令
grant_priv 确定用户是否可以将已经授予给该用户自己的权限再授予其他用户,例如,如果用户可以插入、选择和删除foo数据库中的信息,并且授予了GRANT权限,则该用户就可以将其任何或全部权限授予系统中的任何其他用户
references_priv 目前只是某些未来功能的占位符,现在没有作用
index_priv 确定用户是否可以创建和删除表索引
alter_priv 确定用户是否可以重命名和修改表结构
show_db_priv 确定用户是否可以查看服务器上所有数据库的名字,包括用户拥有足够访问权限的数据库,可以考虑对所有用户禁用这个权限,除非有特别不可抗拒的原因
super_priv 确定用户是否可以执行某些强大的管理功能,例如通过KILL命令删除用户进程,使用SETGLOBAL修改全局MySQL变量,执行关于复制和日志的各种命令
create_tmp_table_priv 确定用户是否可以创建临时表
lock_tables_priv 确定用户是否可以使用LOCK
execute_priv 确定用户是否可以执行存储过程,此权限只在MySQL5.0及更高版本中有意义
repl_slave_priv 确定用户是否可以读取用于维护复制数据库环境的二进制日志文件,此用户位于主系统中,有利于主机和客户机之间的通信
repl_client_priv 确定用户是否可以确定复制从服务器和主服务器的位置
create_view_priv 确定用户是否可以创建视图,此权限只在MySQL5.0及更高版本中有意义
show_view_priv 确定用户是否可以查看视图或了解视图如何执行,此权限只在MySQL5.0及更高版本中有意义Create_routine_priv|确定用户是否可以更改或放弃存储过程和函数,此权限是在MySQL5.0中引入的Alter_routine_priv|确定用户是否可以修改或删除存储函数及函数,此权限是在MySQL5.0中引入的create_user_priv|确定用户是否可以执行CREATE
event_priv 确定用户能否创建、修改和删除事件,这个权限是MySQL5.1.6新增的
trigger_priv 确定用户能否创建和删除触发器,这个权限是MySQL5.1.6新增的
create_tablespace_priv 创建表的空间

3. 权限管理

3.1. MySQL的各种权限

权限 权限级别 权限说明
create create_priv 数据库、表或索引
drop drop_priv 数据库或表
grant option grant_priv 数据库、表、存储过程或函数
references references_priv 数据库或表
alter alter_priv 修改表
delete delete_priv 删除表
index index_priv 用索引查询表
insert insert_priv 插入表
select select_priv 查询表
update update_priv 更新表
create view create_view_priv 创建视图
show view show_view_priv 查看视图
alter routine alter_routine 修改存储过程或存储函数
create routine create_routine_priv 创建存储过程或存储函数
execute execute_priv 执行存储过程或存储函数
file file_priv 加载服务器主机上的文件
create temporary tables create_temp_table_priv 创建临时表
lock tables lock_tables_priv 锁定表
create user create_user_priv 创建用户
process process_priv 服务器管理
reload reload_priv 重新加载权限表
replication client repl_client_priv 服务器管理
replication slave repl_slave_priv 服务器管理
show databases show_db_priv 查看数据库
shutdown shutdown_priv 关闭服务器
super super_priv 超级权限

3.2. 授权

GRANT语法如下:

GRANT priv_type [(column_list)] ON database.table
TO user [IDENTIFIED BY [PASSWORD] 'password']
[,user [IDENTIFIED BY [PASSWORD] 'password']]...
WITH with_option[with_option]
  • priv_type参数表示权限类型;
  • column_list:参数表示权限作用于哪些列上,没设置则位于整个表上;
  • user参数由用户名和主机名构成;形式是"'username'@'hostname'";
  • IDENTIFIED BY 参数用于为用户设置密码;
  • password:用户新密码;

WITH关键字后面带有一个或多个with_option参数。有5个选项:

  • GRANT OPTION:被授权的用户可以将这些权限赋予给别的用户;
  • MAX_QUERIES_PER_HOUR count:设置没消失可以允许执行count次查询;
  • MAX_UPDATES_PER_HOUR count:设置每个消失可以允许执行count次更新;
  • MAX_CONNECTIONS_PER_HOUR count:设置每小时可以建立count个连接;
  • MAX_USER_CONNECTIONS count:设置单个用户可以同时具有的count个连接数;

示例:

  • 授予 root@'%' 用户全部权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
  • 授予 myuser@'%' 用户查询与更改的权限,同时允许其授权给其他用户
GRANT SELECT,UPDATE ON *.* TO 'myuser'@'%' WITH GRANT OPTION;

3.3. 回收权限

收回权限,就是取消某个用户的某些权限。MySQL中使用REVOKE关键字来为用户设置权限。
语法如下:

REVOKE priv_type[(column_list)]
ON database.table
FROM user[,user]

收回全部权限的REVOKE语句的基本语法如下:

REVOKE ALL PRIVILEGES,GRANT OPTION FROM user[,user]...

示例:

  • 回收用户myuser的SELECT权限
REVOKE SELECT ON *.* FROM 'myuser'@'%'
  • 收回myuser的所有权限:
REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'myuser'@'%'

3.4. 查看权限

SHOW GRANTS 语句用于查看权限。同时mysql数据库下的user表中存储着用户的基本权限。

SELECT * FROM mysql.user;
SHOW GRANTS;