MySQL用户权限管理学习笔记

用户权限管理

grant 语句在执行时候,如果权限表中不存在账号,则创建账号,如果已经存在,则执行权限的新增

创建用户z1@localhost并赋予所有数据库的select权限

grant select on *.* to 'z1'@'localhost'

revoke select,insert, on *.* from 'user'@'localhost'

空host等价于%,host列值可使用%和_,以最具体的Hos值排序,主机名和IP号是最具体的

host值为*或者空表示所有外部IP都可以连接,但是不包括本机,如果要包括本地服务器,必须单独为localhost赋予权限

grant super,process,file on *.* to 'user'@'%',这几个权限属于管理权限,不能够指定某个数据库,on后面必须指定 *.*。usage 权限只能用于数据库登录,不能执行任何操作,不能收回,Revoke 并不能删除用户。

查看账户权限:show grants for 'user'@'host'或select * from schema_privileges where grantee='user'@'host'

删除账号:drop user 'user'@'host'

例如:grant select on *.* to 'z1'@'localhost' with max_user_connections 5。清除设置只需要将 grant usage on *.* to 'user'@'host' with max_user_connectons 0;

资源限制是对某一个账号累加的,清除相关累加值使用root账号执行 flush user_resources/ flush privileges/ mysqladmin reload这三个命令中的任何一个。

修改用户密码示例:

mysqladmin -u user_name -h host_name password 'newpwd'

set password for 'user'@'host'=password('123456');

如果是更新自己密码,则可以省略for

set password=password('123456');

还可以使用grant usage 在 *.*来指定账户密码,而不影响当前账户权限

grant usage on *.* to 'user'@'host' identified by password('123456');

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';

use mysql;

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';

FLUSH PRIVILEGES;

创建用户:

create user 'root'@'%' identified by '123456';这条语句做了两个动作,往mysql.user表里插入一行,但没有指定权限,在内存里,往数组acl_users里插入一个acl_user对象。

grant all privileges on *.* to 'root'@'%' with grant option;这是给用户root赋一个最高的权限,在磁盘上,将mysql.user表里权限字段的值都修改为Y,内存里,数组acl_users中找到这个用户对应的对象,将access值修改为二进制的全1。如要有新的客户端用此用户root登录,mysql会为新连接维护一个线程对象,然后从acl_user数组里到这个用户的权限,并将权限拷贝到这个线程的对象中。所有全局权限的判断都直接使用线程对象内部保存的权限位。

grant命令对于全局权限,同时更新磁盘和内存,命令完成即时生效,接下来新创建的连接会使用新的权限,对于已经存在的连接,它的全局权限不受grant命令影响。

全局权限作于整个mysql实例,并不是指某个特定的数据库或表。即on *.*

基于库的权限记录在mysql.db表中,grant all privileges on db1.* to user@host with grant option;该语句做了两个动作,一是在mysql.db表中插入一条记录并记为Y,另一个是在acl_dbs表中增加一个对象且权限为1;

grant 对于已经存在连接影响,在全局权限和基于db的权限的效果是不同的。

对于super权限的,这个权限信息是在当前的连接线程中的,而revoke操作不影响到这个线程对象。

如果当前会话已经处于一个db里面,即执行了use db,那么此时拿到这个库的权限会保存在会话变量中的,在切换出db之前该会话对db库一直拥有权限。

除了db级别的还表级别和列级别的权限。这两类权限组合起来放在内存的hash结构的column_pri_hash中。

赋于列级别的权限 grant select(id),insert(id,a) on mydb.table to user@host with grant option;

对这两类的权限操作也会立即修改数据表和内存。

 

flush privileges;

综上grant 语句都是即时生效的,即同时将数据写到数据表中并更新内存。

如果sessionA在未选定当前数据库的情况下,对权限操作,则同样只影响在未选定的数据库操作的会话,而不影响已执行use db的会话,因为执行过use db的会话,已将权限对象保存在线程内存中了。也不影响全局权限super,process,file,grant,revoke。

如果会话已执行了use db情况下,则后续的在此会话中对此数据库表的权限操作都会时实生效,但是如果对其他数据库表的操作不影响其他已执行了相应的use db的会话。

 

账户权限安全配置需要的常用命令 

1. 新建一个用户并给予相应数据库的权限 grant select,insert,update,delete,create,drop privileges on database.* to user@localhost identified by 'passwd'; grant all privileges on database.* to user@localhost identified by 'passwd';

grant create on testdb.* to developer@'192.168.0.%'; grant alter on testdb.* to developer@'192.168.0.%'; grant drop on testdb.* to developer@'192.168.0.%';

grant references on testdb.* to developer@'192.168.0.%'; --外键操作权限

grant create temporary tables on testdb.* to developer@'192.168.0.%'; --临时表权限

grant index on testdb.* to developer@'192.168.0.%'; --索引操作权限

grant create view on testdb.* to developer@'192.168.0.%'; 创建视图 grant show view on testdb.* to developer@'192.168.0.%'; 查看视图源代码权限:

 

grant create routine on testdb.* to developer@'192.168.0.%'; -- now, can show procedure status grant alter routine on testdb.* to developer@'192.168.0.%'; -- now, you can drop a procedure grant execute on testdb.* to developer@'192.168.0.%';

grant execute on procedure testdb.pr_add to 'dba'@'localhost' --作用在存储过程上 grant execute on function testdb.fn_add to 'dba'@'localhost' --作用在函数上

 

这里在给一个用户授权多张表时,可以多次执行以下语句。例如:

grant select(user_id,username) on smp.users to mo_user@'%' identified by '123345'; grant select on smp.mo_sms to mo_user@'%' identified by '123345';

grant select(id, se, rank) on testdb.apache_log to dba@localhost; --作用在列上

 

all privileges 不包括 grant 权限,所以在后面要跟with grant option 

2. 刷新权限 flush privileges;

3. 显示授权 show grants;

4. 移除授权 revoke delete on *.* from 'user'@'localhost';

5. 删除用户 drop user 'user'@'localhost';

6. 给用户改名 rename user 'jack'@'%' to 'jim'@'%';

7. 给用户改密码 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');

mysql 5.6 默认root用户,只能从本机

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B' WITH GRANT OPTION

| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION

 

mysql 5.7默认root用户,任何主机

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION

 

在创建用户时,如果指定域名,如果域名的ip被恶意修改,则数据库就会被恶意的IP访问,导致安全隐患。例如:

grant select on test1.* to 'user'@'www.xxx.com'

编辑hosts文件,增加此域名和ip的对应关系

192.168.3.33 www.xxx.com

如果将此域名对应的ip修改,则连接失败。

删除匿名账号:

drop user ''@'localhost';

给root账号设置密码:set password=password('123456');

可以将密码写入my.cnf

[client]

user=username

password=password

对文件进行严格权限限制:chmod +600 /etc/my.cnf

不要把 file、process、或super权限赋予管理员以外的权限。

file权限可以通过select .... into outfile ..写到服务器上具有写权限的目录;

可以通过load data infile '/usr/local/mysql/backup/db1' into table t1 命令写入数据库

Proecess可以被用来执行 show processlist命令,从而可以看到执行的sql语句。例如:

1、打开第一个session lock table ser read;

2、打开另一个session 用root执行密码修改操作,因user被锁定,所以sql被挂起。

3、打开第三个session 用具有process权限的账号登录执行show processlist

super 权限能执行kill命令,终止其他用户进程。kill 掉 show processlist查出来的进程。

load data 默认读的是服务器上文件,但是加上local后,可将本地具有访问权限的文件加载到数据库中,解决办法是,可以用--local-infile=0选项启动mysqld从服务端禁用load data local命令。类似,对于mysqlimport --local或 -L选项启用本地数据文件装载。

drop table 时不收回以前的相关访问授权,在删除表时要同时取消其他用户在此表上的相应的权限

revoke命令漏洞

在一个数据库上多次赋予权限,权限会自动合并,但是在多个数据库上多次赋予权限,每个数据库都会认为是单独的一组权限,必须在数据库上用revoke命令来单独进行权限收回,而revoke all privileges on *.* 并不会替用户自动完成。例如:

grant select ,insert on test1.* to 'user'@'host'

grant all privileges on *.* to 'user'@'host'

root账户的权限不能被收回

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章