简介
创建用户以及给用户合理的分配权限是提高安全的最有效措施之一。不仅仅是MySQL数据库、对于其他数据库、操作系统、应用系统等等,用户权限分配都是有效的安全措施之一。即使被黑客攻破,但是由于其拿到的用户权限较低,可以有效降低危害。所以对外开放的系统,应尽量使用较低权限的用户。
详解
用户相关命令
create user 'testuser'@'%' identified by 'password';
--创建用户,密码为password,允许所有IP都可以连接
create user 'testuser'@'10.%' identified by 'password';
--创建用户,密码为password,仅允许IP为 10. 的网段可以连接
drop user 'admin'@'localhost';(@不加默认为“%”)
--删除用户
Delete FROM user Where User='test' and Host='localhost';
--从USER表删除用户(不建议使用)
ALTER USER 'testlocal'@'localhost' identified by 'password';
--修改用户testlocal用户localhost地址的密码为password
ALTER USER 'testlocal'@'192.168.1.2' identified by 'password1';
--修改用户testlocal用户192.168.1.2地址的密码为password1
RENAME USER 'test'@'localhost' TO test1@localhost
--修改用户名,将test用户名改为test1
MySQL的用户其实可以说是由两部分组成,用户名 网段/IP地址。这也是一个安全设计,网段或IP地址可以限制用户的连接地址,比如设置为localhost
或127.0.0.1
,则只允许本机使用此用户名连接MySQL。也可以使用通配符%
,比如testuser@%
就是允许所有的IP都可以使用testuser
用户连接MySQL,既可以远程连接。再比如testuser@10.%
,允许IP地址以 10 开头的网段用testuser
用户连接MySQL。
删除用户的方式有两种,但是不建议使用第二种方式直接从user
表删除。这与权限有关,在其他表中会存储着用户的权限数据,直接删除user
表中数据会删除用户但是不会删除用户的相关权限数据。
用户权限
权限层级
MySQL的权限是有多个层级的,分别是,存储在各个表当中。
mysql.user表 | mysql.db表 | mysql.tables_priv表 | mysql.columns_priv表 |
---|---|---|---|
全局权限 | 数据库权限 | 表权限 | 列权限 |
权限判断过程大概是这样的: 客户端操作核实阶段,当客户端的连接请求被MySQL服务器端通过其身份认证后。那么接下来就可以发送数据库的操作命令给服务器端处理,服务器检查用户要执行的操作,在确认权限时,MySQL首先检查user表,如果指定的权限没有在user表中被授权;MySQL将检查db表,db表时下一安全层级,其中的权限限定于数据库层级,在该层级的SELECT权限允许用户查看指定数据库的所有表中的数据;如果在该层级没有找到限定的权限,则MySQL继续检查tables_priv表以及columns_priv表,如果所有权限表都检查完毕,但还是没有找到允许的权限操作,MySQL将返回错误信息,用户请求的操作不能执行,操作失败。
权限分类
权限的分类也有很多种,就比如select
查权限、delete
删权限。直接看下表:
分类 | 权限 | 描述 | 应用层级 |
---|---|---|---|
普通权限(应用程序) | CREATE | 允许用户创建数据库或表 | 数据库、表或索引 |
DROP | 允许用户删除数据库或表 | 数据库或表 | |
GRANT OPTION | 允许用户授予权限 | 数据库、表或保存的程序 | |
ALTER | 允许用户改变表结构 | 表 | |
DELETE | 允许用户删除现存表的行 | 表 | |
INDEX | 允许用户创建、修改表索引 | 表 | |
INSERT | 允许用户在表中插入新的记录 | 表 | |
SELECT | 允许用户查看表记录 | 表 | |
UPDATE | 允许用户修改表中现有的记录 | 表 | |
CREATE VIEW | 允许用户创建视图 | 视图 | |
SHOW VIEW | 允许用户查看视图创建语句 | 视图 | |
ALTER ROUTINE | 允许用户修改存储过程、函数 | 保存的程序 | |
CREATE ROUTINE | 允许用户创建存储过程、函数 | 保存的程序 | |
EXECUTE | 允许用户允许以创建的子程序 | 保存的程序 | |
管理员 | FILE | 允许用户使用select…into outfile、load data infile 将数据从文件读入表或从表读入文件 | 服务器主机上的文件访问 |
CREATE TEMPORARY TABLES | 允许用户创建临时表 | 服务器管理 | |
LOCK TABLES | 允许用户使用LOCK TABLES | 服务器管理 | |
CREATE USER | 允许用户使用CREATE USER,DORP USER,RENAME USER,REVOKE ALL PRIVILEGES | 服务器管理 | |
PROCESS | 允许用户使用show processlist 查看线程 | 服务器管理 | |
RELOAD | 允许用户使用flush 、重载授权表、清空授权、主机、日志等 | 服务器管理 | |
REPLICATION CLIENT | 允许用户询问从属服务器或主机服务器地址 | 服务器管理 | |
REPLICATION SLAVE | 用于主从复制性从属服务器(从主服务器中读取二进制日志文件) | 服务器管理 | |
SHOW DATABASES | 允许使用show databases 查看所有的数据库列表,没有这个权限,用户只能看到拥有权限的数据库 | 服务器管理 | |
SHUTDOWN | 允许使用mysqladmin shutdown 关闭mysql服务器 | 服务器管理 | |
SUPER | 允许使用change master,kill,purge master logs 和set global 语句,mysqladmin debug 命令,当数据库达到max_connections 允许连接一次 | 服务器管理 | |
特殊 | allall perivileges | 授予所有权限 | 服务器管理 |
usage | 仅允许用户登录,但不授予权限 | 服务器管理 |
相关语法
show grants
--查看当前用户权限
show grants for 'test'@'localhost'
--查看指定用户的权限,一般只有root用户可以查看其他用户权限
grant 权限 on 数据库.* to 用户;
--数据库权限操作
grant select on testdb.* to 'testuser'@'localhost';
--将 testdb 数据库的查询权限授权给 testuser@localhost
grant 权限 on 数据库.数据表 to 用户;
--表权限操作
grant select on testdb.testtable to 'testuser'@'localhost';
--将 testbd库的 testtables 表的查询权限授权给 testuser@localhost
grant 权限(列名1,列名2···) on 数据库.数据表 to 用户;
--列权限操作
grant select(column_1,column_2) on testdb.testtable to 'testuser'@'localhost'
--将 testbd 库的 testtables 表的 column_1,column_2 列的查询权限授权给 testuser@localhost
revoke 权限(列名1,列名2···) on 数据库.数据表 from 用户;
--撤销权限,撤销权限语法和授权相似,只需把grant换成revoke,to换成from即可
··· with grant option;
--被授权的用户可以将此权限授权给其他用户
grant select on testdb.testtable to 'testuser'@'localhost' with grant option;
--将 testbd库的 testtables 表的查询权限授权给 testuser@localhost ,同时 testuser@localhost 用户可以将 testbd库的 testtables 表的查询权限授权给其他用户
flush privileges;
--刷新权限,在执行授权或者撤销权限操作后,需要执行此条语句才会有效
information_schema、performance_schema、test数据库
这三个数据库是安装MySQL默认有的三个库,比较特别。
information_schema数据库不占用物理磁盘,是虚拟数据库。类似于视图,从其他库中取数据。保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表列的数据类型与访问权限等。
information_schema和test数据库默认所有用户都有权限,即使是新建用户。可以新建个用户,然后登录使用show databases;
语句查看,会显示这两个数据库。
默认情况下用户只能查看information_schema中的部分表,如果要指用户可以查看全部的表,就要授于它process 权限才行。语法:grant process on *.* to 'testuser'@'localhost';
PERFORMANCE_SCHEMA数据库主要用于收集数据库服务器性能参数。并且库里表的存储引擎均为PERFORMANCE_SCHEMA,而用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表。MySQL5.5默认是关闭的,需要手动开启,在配置文件里添加:
代码语言:javascript复制[mysqld]
performance_schema=ON
SQL
PERFORMANCE_SCHEMA数据库不能使用 ALL 权限类型直接授权。