MySQL用户与权限管理
为了防止无良网http://www.cnblogs.com/shijiaqi1066/p/3738057.html站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/SJQ
http://www.cnblogs.com/shijiaqi1066/p/3738057.html
MySQL权限系统
MySQL的权限相关信息主要存储于mysql.user,mysql.db,mysql.host,mysql.table_priv和mysql.column_priv。这些表被称为grant tables。
1 用户管理
CREATER USER 命令创建用户
创建用户首先必须拥有mysql数据库的全局CREATE USER 权限,或INSERT权限。对于每个账户,CREATE USER会在没有权限的mysql.user表中创建一条记录。若账户不存在,则出现错误。使用自选的IDENTIFIED BY子句设置用户密码。
该命令创建的用户无任何特别权限,仅拥有初始USAGE权限(即无权限)。
CREATE USER user [IDENTIFIED BY [PASSWORD 'PASSWORD']][, user [IDENTIFIED BY [PASSWORD 'PASSWORD']]]
注:编译安装的MySQL5.6 需要指定密码的哈希算法。否则会出现如下异常:
ERROR 1827 (HY000): The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function.
在MySQL配置文件中进行如下配置:
[mysqld] default-authentication-plugin=sha256_password
default-authentication-plugin表示默认身份认证插件。
可接受的值有:mysql_native_password(使用MySQL本地密码)和sha256_password(用SHA-256 密码)
该选项的值影响服务操作的几个方面:
1)对于没有明确指名插件,决定哪个插件分配到新用户。
2)在启动时设置系统变量 old_passwords 的值和默认插件所需的密码散列格式发生冲突。这结果影响 PASSWORD() 函数使用的密码散列方法。
3)下面任何创建新账号的语句,服务器将使用默认验证插关联帐户和分配指定的密码给帐户,该哈希值是old_passwords的值。CREATE USER ... IDENTIFIED BY 'cleartext password';
GRANT ... IDENTIFIED BY 'cleartext password';
DROP USER命令删除用户
闲置账户应该被删除。DROP USER 不能自动关闭任何打开的用户对话;而且,若用户有打开的对话,此时取消用户,则命令不会生效,直到用户对话被关闭后才生效。一旦对话被关闭,用户也被取消,此用户再次登录时将失败。
DROP USER user[,user]...
RENAME USER 重命名用户
当旧账户不存在或新账户已存在,则会出现错误。
RENAME USER old_user TO new_user[ ,old_user TO new_user]...
查看所有用户
由于mysql的用户信息都存于mysql.user表中,所以查询用户只需要查看这种表即可。
select * from mysql.user;
2 权限管理
要为某个用户授权使用GRANT命令,要去除某个用户的权限使用REVOKE命令。还有一种暴力的方法即直接更新grant tables系统表。
当给某个用户授权时,需要指定用户名与主机。格式:'username'@'hostname'。
授权时,若仅指定用户名,则MySQL会自动认为是对'username'@'%'授权。要去除某个用户的权限,也需要指定主机。
2.1 查看用户的权限
查看当前用户(自己)权限:
show grants;
查看其他 MySQL 用户权限:
方法一:
SHOW GRANTS FOR 'username'@'hostname'
方法二:
查询grant tables的权限信息。
2.2 GRANT和REVOKE命令
GRANT和REVOKE命令用来管理访问权限,也可以用来创建和删除用户,但在MySQL5.0.2可以利用GREATE USER和DROP USER命令更容易实现。
GRANT和REVOKE命令对于谁可以操作服务器及其内容的各个方面提供了多程度的控制。
Grant语句格式
GRANT 权限 ON 数据库对象 TO 用户
Revoke语句格式
revoke 跟 grant 的语法差不多,只需要把关键字 “to” 换成 “from” 即可:
REVOKE 权限 ON 数据库对象 FORM 用户
2.3 管理权限
特别的权限权限描述
权限 | 描述 |
ALL(或ALL PREVILEGES) | 授予所有权限。设置除GRANT OPTION之外的所有简单权限。 |
USAGE | 无权限。 |
管理员权限权限描述
权限 | 描述 |
CREATE TEMPORARY TABLES | 允许管理员在CREATE TABLE语句中使用TEMPORARY关键字。 |
FILE | 允许将数据从文件读入表,或从表读入文件。 |
LOCK TABLES | 允许使用LOCK TABLES语句。 |
PROCESS | 允许管理员查看属于所有用户的服务器进程。 |
RELOAD | 允许管理员重新载入授权表、清空授权、主机、日志和表格。 |
REPLICATION CLIENT | 允许在复制主机(Master)和从机(Slave)上使用SHOW STATUS。 |
REPLICATION SLAVE | 允许复制从服务器连接到主服务器。 |
SHOW DATABASES | 允许使用SHOW DATABASES语句查看所有的数据库列表。没有这个权限,用户只能看到他们能够看到的数据库。 |
SHUTDOWN | 允许管理员关闭MySQL服务器。 |
SUPER | 允许管理员关闭属于任何用户的线程。 |
普通用户的权限权限应用于描述
权限 | 描述 |
SELECT | 列允许用户从表中选择行 |
INSERT | 列允许用户在表中插入新行 |
UPDATE | 列允许用户修改现存表里行中的值 |
DELETE | 允许用户删除现存表的行 |
INDEX | 允许用户创建和拖动特定表索引 |
ALTER | 允许用户改变现存表的结构。例如,可添加列、重命名列或表、修改列的数据类型 |
CREATE | 表允许用户创建新数据库或表。如果在GRANT中指定了一个特定的数据库或表,他们只能够创建该数据库或表,即他们必须首先删除(Drop)它 |
DROP | 表允许用户拖动(删除)数据库或表 |
2.4 授权层级
MySQL中的权限分为5个级别:
全局层级(Global Level)
全局权限适用于服务器中的所有数据库。
数据库层级(Databases Level)
数据库权限适用于一个给定数据库中的所有目标。这些权限被存储于mysql.db和mysql.host中。
grant 权限 on 库.*
revoke 权限 on 库.*
表层级(Table Level)
表权限适用于一个给定表中的所有列。这些权限被存储于mysql.tables_priv表中。
grant 权限 on 库.表
revoke 权限 on 库.表
列层级(Column Level)
列权限适用于一个给定表中的单一列。这些权限被存储于mysql.columns_priv表中。当使用revoke时,必须指定被授予权限的列。
子程序层级(Routine Level)
CREATE ROUTINE,ALERT ROUTINE,EXECUTE和GRANT权限适用于已存储的子程序,这些权限可以被授予为全局层级和数据库层级;而且,除了CREATE ROUTINE外,这些权限可以被授予为子程序层级,并存储在mysql.procs_priv表中。
例:grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。
grant select on testdb.* to common_user@'%' grant insert on testdb.* to common_user@'%' grant update on testdb.* to common_user@'%' grant delete on testdb.* to common_user@'%'
或
grant select, insert, update, delete on testdb.* to common_user@'%'
例:grant 数据库开发人员,创建表、索引、视图、存储过程、函数。。。等权限。
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 操作 MySQL 外键权限。
grant references on testdb.* to developer@'192.168.0.%';
例:grant 操作 MySQL 临时表权限。
grant create temporary tables on testdb.* to
例:grant 操作 MySQL 索引权限。
grant index on testdb.* to
例:grant 操作 MySQL 存储过程、函数 权限。
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 作用在整个 MySQL 服务器上。
grant select on *.* to dba@localhost; -- dba 可以查询 MySQL 中所有数据库中的表。 grant all on *.* to dba@localhost; -- dba 可以管理 MySQL 中的所有数据库
例:grant 作用在单个数据库上。
grant select on testdb.* to dba@localhost; -- dba 可以查询 testdb 中的表。
例:grant 作用在单个数据表上。
grant select, insert, update, delete on testdb.orders to
例:grant 作用在表中的列上。
grant select(id, se, rank) on testdb.apache_log to
例:MySQL grant 作用在存储过程、函数上。
grant execute on procedure testdb.pr_add to 'dba'@'localhost' grant execute on function testdb.fn_add to 'dba'@'localhost'
如果想让授权的用户,也可以将这些权限 MySQLgrant 给其他用户,需要选项 "grant option",但这个特性一般用不到。实际中,数据库权限最好由 DBA 来统一管理。
例:
grant select on testdb.* to dba@localhost with grant option;
3 权限生效
权限信息数据量小,且访问频繁,所以每次启动MySQL时,都会将所有权限信息都加载到内存中,并保存在几个特定的结构里。使用GRANT命令,REVOKE命令,CREATER USER命令,DROP USER命令修改用户相关权限时,在修改grant tables的同时,也会修改内存中的权限信息。
每次手动修改了相关权限表之后,都需要执行“FLUSH PRIVILEGES”命令。所以尽量使用GRANT,REVOKE,CREATER USER,DROP USER等命令。
MySQL数据库服务器启动时,以及使用GRANT与REVOKE语句的时,服务器会自动读取grant表。同时,可以手动修改它们。
当手动更新它们时,MySQL服务器将不会注意到他们已经被修改了。必须向服务器指出已经对权限进行修改,有3种方法可以实现这个任务。可以在MySQL命令提示符下(必须以管理员身份进入)键入命令:
flush privileges;
或在shell环境下使用
mysqladmin flush-privileges
或
mysqladmin reload
此后当数据库再次连接的时候,系统将检查全局级别权限;当下一条命令被执行时,将检查数据库级别的权限;而表级别和列级别权限权限将在用户下次请求的时候被检查。
4 设置账户密码
(1)可以用mysqladmin命令指定密码:
mysqladmin -u user_name -h host_name password "newpwd"
mysqladmin重设服务器host_name,且用户名为user_name用户的密码,新密码为"newpwd"。
(2)set password命令设置用户密码:
只有特定用户(可以更新mysql数据库的用户,如root)身份登录,才可以修改其他用户密码。
set password for 'jeffrey'@'%' = password('biscuit');
若不以匿名用户连接,则可以省略for子句而修改自己的密码:
set password = password('biscuit');
(3) 在全局级别下使用GRANT USAGE语句(在*.*)指定某个账户的密码,而不影响账户当前权限:
GRANT USAGE ON *.* TO 'jeffrey'@'%' IDENTIFIED BY 'biscuit';
(4)在创建新账户时建立密码,要为password列提供一个具体值:
mysql -u root mysql INSERT INTO user(Host,User,Password) VALUES ('%','jeffrey',PASSWORD('biscuit')); FLUSH PRIVILEGES;
注意: FLUSH PRIVILEGES; 该语句用于刷新权限,否则对用户的操作不起作用。
(5)更改已有账户的密码,要应用UPDATE语句来设置password列值。
mysql -u root mysql UPDATE user SET Password =PASSWORD('bagel') WHERE Host = '%' AND User ='francis'; FLUSH PRIVILEGES;
设置密码时,使用SET PASSWORD,INSERT,UPDATE设定密码,使用PASSWORD()函数对密码进行加密。
若使用GRANT..IDENTIFIED BY语句或mysqladmin password命令设置密码,这些命令会对密码自动加密,不需要使用PASSWORD()函数。
5 安全
在管理级别,一定不能将mysql.user表的访问权限授予任何非管理账户。
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/SJQ