Mysql权限管理白皮书

mysql权限管理白皮书

1:MySQL权限的工作原理

l  连接验证阶段----确定用户能否连接DB

l  请求验证阶段----确定用户是否有足够权限操作DB

         工作过程:连接验证阶段--mysql权限系统检查用户能否允许连接到mysql服务器,根据连接的主机mysql用户,查询 user表进行连接验证。

         请求验证阶段--Mysql权限系统根据用户对DB的所有操作请求,查询可能用到的权限表user,db,host,tables_priv,columns_priv,确定该用户是否有操作权限。

2:权限级别

         Mysql权限由如下:

* ALTER: 修改表和索引。

* CREATE: 创建数据库和表。

* DELETE: 删除表中已有的记录。

* DROP: 抛弃(删除)数据库和表。

* INDEX: 创建或抛弃索引。

* INSERT: 向表中插入新行。

* REFERENCE:未使用。

* SELECT: 检索表中的记录。

* UPDATE: 修改现存表记录。

* FILE: 读或写服务器上的文件。

* PROCESS: 查看服务器中执行的线程信息或杀死线程。

* RELOAD: 重载授权表或清空日志、主机缓存或表缓存。

* SHUTDOWN: 关闭服务器。

* ALL: 所有权限,ALL PRIVILEGES同义词。

* USAGE: 特殊的“无权限” 权限

         Mysql权限级别:全局级别、数据库级别、表级别、列级别、routine级别

Global Level :

         GlobalLevel 的权限控制又称为全局权限控制,所有权限信息都保存在 mysql.user 表中。 Global Level 的所有权限都是针对整个mysql的,对所有的数据库下的所有表及所有字段都有效。(grant  ...  on  *.*  to '用户名'@'IP'  [ identifiedby '密码' ]

Database Level

         DatabaseLevel相比第一个级别,主要少了以下几个权限: CREATE USER,FILE,PROCESS,RELOAD, REPLICATION CLIENT,REPLI CATIONSLAVE,SHOW DATABASES,SHUTDOWN,SUPER和USAGE 这几个权限,没有增加任何权限。(grant  ...  on  db1.*  to '用户名'@'IP'  [ identifiedby '密码' ]

Table Level

         TableLevel 的权限作用范围是授权语句中所指定数据库的指定表。仅ALTER,CREATE, DELETE, DROP,INDEX,INSERT,SELECT ,UPDATE 这八种权限。(grant  ...  on  db1.tb1  to '用户名'@'IP'  [ identifiedby '密码' ]

Column Level

         ColumnLevel 级别的权限仅有INSERT , SELECT 和 UPDATE 这三种。( grant select(id, se, rank) on test.yql8 to '用户名'@'IP' [ identified by '密码' ])

Routine Level

         RoutineLevel 的权限主要只有 EXECUTE 和 ALTER ROUTINE 两种,主要针对的对象是procedure 和 function 这两种对象,在授予 Routine Level 权限的时候,需要指定数据库和相关对象。

         除了上面几类权限之外,还有一个非常特殊的权限 GRANT,拥有GRANT权限的用户可以将自身所拥有的任何权限全部授予其他任何用户, GRANT 权限的授予方式也和其他任何权限都不太一样,通常都是通过在执行 GRANT授权语句的时候在最后添加 WITH GRANT OPTION 子句达到授予 GRANT 权限的目的。

3:用户分类

         根据权限级别,可将用户分类分为两大类:超级用户、普通用户。

         超级用户:即拥有Globallevel权限。

         普通用户:数据库级用户、表级用户、列级用户、子程序级用户。

4:权限分配

         创建超级用户

         方式1:grant  all [privileges] on  *.*  to  '用户名'@'IP'[ identified by '密码' ]

IP可为'host.domain.cn'或者%(匹配任何); '用户名'可为''空,任何用户访问;*.*的第一个*表示数据库,第二个*表示表。

         方式2:insert intouser values("IP","name","password","Y","Y",........)

         创建普通用户:

         DB级用户:grant all [privileges]  on test.* to '用户名'@'IP' [ identifiedby '密码' ]相应修改的系统表有user表、db表。

         Table级用户:grant all [privileges] on test.test to '用户名'@'IP' [ identifiedby '密码' ]相应修改的系统表有user表、tables_priv表。

         Column级用户:grant select(id, se, rank) on test.yql8 to  '用户名'@'IP' [ identifiedby '密码' ]相应修改的系统表有user表、tables_priv表、columns_priv表。

         子程序级用户: grant execute on procedure/ functiontest.yql8 to '用户名'@'IP';

5:权限回收

使用REVOKE。 revokeprivileges on *.* from  '用户名'@'IP'  user表中的条目仍存在。

修改权限表。delete from mysql.db where user='*' andhost ='*' and db='*'

6:备有语句

n  查看当前用户权限:showgrants;

n  查看其他用户权限:showgrants for '*'@'*';

n  创建用户:createuser '用户名'@'IP'identified by '密码';

n  修改用户密码:SETPASSWORD FOR用户名@'IP' =PASSWORD('password2')

n  删除用户:dropuser  '*'@'*';

n  创建表权限:grantcreate on  *.*  to  '用户名'@'IP';

n  创建临时表权限:grant create temporary tables on *.* to '用户名'@'IP';

n  创建视图权限:grantcreate view on *.* to '用户名'@'IP';

n  创建用户权限:grantcreate user on  *.* to '用户名'@'IP';

n  显示视图权限:grantshow view on *.* to '用户名'@'IP';

n  查看主从/服务器状态权限:grant replication client  on *.* to  '用户名'@'IP'identified by '密码'(show master status ; show slave status)。

n  从服务器读取二进制日志权限:grant replication slave on *.* to  '用户名'@'IP'identified by '密码'。(show binlog events; show slave hosts;)

n  文件权限:grantfile  on *.* to '用户名'@'IP'identified by '密码'。(可以执行select ..into outfile和load data infile...)

n  super权限: grant super on  *.* to '用户名'@'IP'identified by '密码'。这个权限允许用户终止任何查询;修改全局变量的SET语句;使用CHANGE MASTER,PURGE MASTER LOGS。(清理三天之前的日志:purge master logs before date_sub(now(), interval 3 day); 清理到指定日期的前的日志:PURGEMASTER LOGS BEFORE '2003-04-02 22:46:26')

n  查看/关闭数据库连接:grantsuper on*.*to '用户名'@'IP'。(show processlist)

显示数据库列表。show databases

n  显示数据库结构:showtables;

n  显示表结构:describe表名

n  系统用户名:selectSYSTEM_USER()

n  用户名:selectUSER()

n  当前用户名:selectcurrent_user

n  连接用户名:selectsession_user()

n  数据库名:selectdatabase()

n  数据库版本:selectversion()

n  读取本地文件:selectload_file()

n  数据库路径:select@@datadir

n  Mysql安装路径:select @@basedir

n  操作系统版本:select@@version_compile_os

n  查询时间: selectnow(); select curdate(); select curtime()

 

 

你可能感兴趣的:(mysql)