mysql权限详解

一、权限表存取过程
mysql数据库中的3个权限表:user 、db、 host
权限表的存取过程是:
1)先从user表中的host、 user、 password这3个字段中判断连接的IP、用户名、密码是否存在表中,存在则通过身份验证;
2)通过权限验证,进行权限分配时,按照user db tablepriv columnpriv的顺序进行分配。
即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db, tablepriv,columnpriv;
如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;
如果db中为N,则检查tablepriv中此数据库对应的具体表,取得表中的权限Y,以此类推。

二、grant使用方法
设置用户管理权限:
grant 权限列表 [(字段列表)] on 数据库名.表名 to 用户名@域名或ip地址 [identified by '用户密码'] [with grant option]
eg:
1. 创建用户testuser,密码为123,权限为在所有数据库上执行所有权限
grant all privileges on *.* to testuser@'%' identified by '123'

2. 创建用户testuser,权限为在testdb数据库上,执行select的权限
grant select on testdb.* to testuser@'%' identified by '123';

创建用户testuser,权限为在testdb数据库的testtb表上,执行update字段name的权限
grant update (name) on testdb.testtb to testuser@'%';

查看权限:
show grants for user@host;
eg:show grants for testuser@'%';
修改权限和创建用户语句一样

收回权限
revoke 权限列表[(字段列表)] on 数据库.表名 from 用户名@域名或ip地址
eg:revoke create,drop on testdb.* from testuser@'%';
revoke grant option on testdb.* from testuser@localhost;


三、权限表

 

分类 权限 描述 应用层级
普通权限
(应用程序)
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 允许连接一次 服务器管理
特殊 all\all perivileges 授予所有权限 服务器管理
usage 仅允许用户登录,但不授予权限 服务器管理

 

四、权限例子(共27个,ALL PRIVILEGES除外)
(以下操作都是以root身份登陆进行grant授权,以p1@localhost身份登陆执行各种命令。)
1. usage
连接(登陆)权限,建立一个用户,就会自动授予其usage权限(默认授予)。
mysql> grant usage on *.* to `p1`@`localhost` identified by `123`;
该权限只能用于数据库登陆,不能执行任何操作;且usage权限不能被回收,也即REVOKE用户并不能删除用户。

2. select
必须有select的权限,才可以使用select table
mysql> grant select on pyt.* to `p1`@`localhost`;
mysql> select * from shop;

3. create
必须有create的权限,才可以使用create table
mysql> grant create on pyt.* to `p1`@`localhost`;

4. create routine
必须具有create routine的权限,才可以使用{create |alter|drop} {procedure|function}
mysql> grant create routine on pyt.* to `p1`@`localhost`;
当授予create routine时,自动授予EXECUTE, Alter ROUTINE权限给它的创建者:
mysql> show grants for ‘p1`@`localhost`;
+—————————————————————————+
|Grants for p1@localhost |
+———————————————————————————————————————————————————————-+
| GRANT USAGE ON *.* TO `p1`@`localhost` IDENTIFIED BY PASSWORD `*23AE809DDACAF96AF0FD78ED04B6A265E05AA257` |
| GRANT Select, Create, Create ROUTINE ON `pyt`.* TO ‘p1′@’localhost’ |
| GRANT EXECUTE, Alter ROUTINE ON PROCEDURE `pyt`.`pro_shop1` TO ‘p1′@’localhost’ |
+———————————————————————————————————————————————————————-+

5. create temporary tables(注意这里是tables,不是table)
必须有create temporary tables的权限,才可以使用create temporary tables.
mysql> grant create temporary tables on pyt.* to `p1`@`localhost`;
[mysql@mydev ~]$ mysql -h localhost -u p1 -p pyt
mysql> create temporary table tt1(id int);

6. create view
必须有create view的权限,才可以使用create view
mysql> grant create view on pyt.* to `p1`@`localhost`;
mysql> create view v_shop as select price from shop;

7. create user
要使用Create USER,必须拥有mysql数据库的全局Create USER权限,或拥有Insert权限。
mysql> grant create user on *.* to `p1`@`localhost`;
或:mysql> grant insert on *.* to p1@localhost;

8. insert
必须有insert的权限,才可以使用insert into ….. values….

9. alter
必须有alter的权限,才可以使用alter table
alter table shop modify dealer char(15);

10. alter routine
必须具有alter routine的权限,才可以使用{alter |drop} {procedure|function}
mysql>grant alter routine on pyt.* to `p1`@`localhost`;
mysql> drop procedure pro_shop;
Query OK, 0 rows affected (0.00 sec)

mysql> revoke alter routine on pyt.* from `p1`@`localhost`;
[mysql@mydev ~]$ mysql -h localhost -u p1 -p pyt
mysql> drop procedure pro_shop;
ERROR 1370 (42000): alter routine command denied to user `p1`@`localhost` for routine `pyt.pro_shop`

11. update
必须有update的权限,才可以使用update table
mysql> update shop set price=3.5 where article=0001 and dealer=`A`;

12. delete
必须有delete的权限,才可以使用delete from ….where….(删除表中的记录)

13. drop
必须有drop的权限,才可以使用
drop database db_name;
drop table tab_name;
drop view vi_name;
drop index in_name;

14. show database
通过show database只能看到你拥有的某些权限的数据库,除非你拥有全局SHOW DATABASES权限。
对于p1@localhost用户来说,没有对mysql数据库的权限,所以以此身份登陆查询时,无法看到mysql数据库:
mysql> show databases;
+———————————-+
| Database |
+———————————-+
| information_schema |
| pyt |
| test |
+———————————-+

15. show view
必须拥有show view权限,才能执行show create view。
mysql> grant show view on pyt.* to p1@localhost;
mysql> show create view v_shop;

16. index
必须拥有index权限,才能执行[create |drop] index
mysql> grant index on pyt.* to p1@localhost;
mysql> create index ix_shop on shop(article);
mysql> drop index ix_shop on shop;

17. excute
执行存在的Functions,Procedures
mysql> call pro_shop1(0001,@a);
+———+
| article |
+———+
| 0001 |
| 0001 |
+———+
mysql> select @a;
+——+
| @a |
+——+
| 2 |
+——+

18. lock tables
必须拥有lock tables权限,才可以使用lock tables
mysql> grant lock tables on pyt.* to p1@localhost;
mysql> lock tables a1 read;
mysql> unlock tables;

19. references
有了REFERENCES权限,用户就可以将其它表的一个字段作为某一个表的外键约束。

20. reload
必须拥有reload权限,才可以执行flush [tables | logs | privileges]
mysql> grant reload on pyt.* to p1@localhost;
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
mysql> grant reload on *.* to ‘p1′@’localhost’;
Query OK, 0 rows affected (0.00 sec)
mysql> flush tables;

21. replication client
拥有此权限可以查询master server、slave server状态。
mysql> show master status;
ERROR 1227 (42000): Access denied; you need the SUPER,REPLICATION CLIENT privilege for this operation
mysql> grant Replication client on *.* to p1@localhost;
或:mysql> grant super on *.* to p1@localhost;
mysql> show master status;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000006 | 2111 | | |
+——————+———-+————–+——————+
mysql> show slave status;

22. replication slave
拥有此权限可以查看从服务器,从主服务器读取二进制日志。
mysql> show slave hosts;
ERROR 1227 (42000): Access denied; you need the REPLICATION SLAVE privilege for this operation
mysql> show binlog events;
ERROR 1227 (42000): Access denied; you need the REPLICATION SLAVE privilege for this operation
mysql> grant replication slave on *.* to p1@localhost;
mysql> show slave hosts;
Empty set (0.00 sec)
mysql>show binlog events;
+—————+——-+—————-+———–+————-+————–+
| Log_name | Pos | Event_type | Server_id| End_log_pos|Info |
+—————+——-+————–+———–+————-+—————+
| mysql-bin.000005 | 4 | Format_desc | 1 | 98 | Server ver: 5.0.77-log, Binlog ver: 4 |
|mysql-bin.000005|98|Query|1|197|use `mysql`; create table a1(i int)engine=myisam|
……………………………………

23. Shutdown
关闭MySQL:
[mysql@mydev ~]$ mysqladmin shutdown
重新连接:
[mysql@mydev ~]$ mysql
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
[mysql@mydev ~]$ cd /u01/mysql/bin
[mysql@mydev bin]$ ./mysqld_safe &
[mysql@mydev bin]$ mysql

24. grant option
拥有grant option,就可以将自己拥有的权限授予其他用户(仅限于自己已经拥有的权限)
mysql> grant Grant option on pyt.* to p1@localhost;
mysql> grant select on pyt.* to p2@localhost;

25. file
拥有file权限才可以执行 select ..into outfile和load data infile…操作,但是不要把file, process, super权限授予管理员以外的账号,这样存在严重的安全隐患。
mysql> grant file on *.* to p1@localhost;
mysql> load data infile ‘/home/mysql/pet.txt’ into table pet;

26. super
这个权限允许用户终止任何查询;修改全局变量的SET语句;使用CHANGE MASTER,PURGE MASTER LOGS。
mysql> grant super on *.* to p1@localhost;
mysql> purge master logs before ‘mysql-bin.000006′;

27. process
通过这个权限,用户可以执行SHOW PROCESSLIST和KILL命令。默认情况下,每个用户都可以执行SHOW PROCESSLIST命令,但是只能查询本用户的进程。
mysql> show processlist;
+—-+——+———–+——+———+——+——-+——————+
| Id | User | Host | db | Command | Time | State | Info |
+—-+——+———–+——+———+——+——-+——————+
| 12 | p1 | localhost | pyt | Query | 0 | NULL | show processlist |
+—-+——+———–+——+———+——+——-+——————+

另外,管理权限(如 super, process, file等)不能够指定某个数据库,on后面必须跟*.*
mysql> grant super on pyt.* to p1@localhost;
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
mysql> grant super on *.* to p1@localhost;
Query OK, 0 rows affected (0.01 sec)

五、mysql安全选择

在使用PHP+MYSQL程序时候,数据库连接文件中千万不要用MYSQL的管理用户ROOT来做连接,而是每个站建立独立的数据库账户来运作这样可以防止你的mysql 密码被扫到或被破解直接提权拿到服务器权限。一般程序运行 需要MYSQL的权限如下:select、insert、update、delete、create、drop、alter、lock tables、create tmp tables。

posted @ 2012-03-09 09:51  googlegis  阅读(478)  评论(0编辑  收藏  举报

坐标合肥,非典型GIS开发人员 GitHub