数据控制语言(Data Control Language, DCL)用于用户权限的管理,包括了GRANT与REVOKE命令。
授权(GRANT)
MySQL有很精细的权限控制:
服务器级 ----> DB级 -----------> 表 -----------------> 列 ------------------>对象,存储过程,视图等
mysql.user mysql.db mysql.tables_priv mysql.columns_priv mysql.procs_priv
一、授权:
#复制账户
create user 'repl'@'172.17.73.%' identified by 'L"04)-Xd*~2/%T';
grant replication slave,replication client on *.* to 'repl'@'172.17.73.%';
#应用账户
create user 'xxx'@'172.17.73.%' identified by 'R75,CI8#u[>w9j';
grant select,insert,update,delete,create,create temporary tables,execute,show view,index,create,alter on test.* to 'xxx'@'172.17.73.%';
grant select on mysql.proc to 'xxx'@'172.17.73.%';
#监控账户
create user 'monitor'@'localhost' identified by 'mVWp~09K!h#s';
grant select,super,process,show databases,replication slave,replication client on *.* to 'monitor'@'localhost';
#备份账户
create user 'backup'@'localhost' identified by 'd*CRK$AZVr2t+{';
grant select,reload,super,replication slave,replication client,show view,alter routine,event,trigger on *.* to 'backup'@'localhost';
#xtrbackup
create user 'xtrbackup'@'localhost' identified by '[{ehE!)w:0xpL8';
grant select,reload,lock tables,PROCESS,replication slave,replication client on *.* to 'xtrbackup'@'localhost';
#中间件账号maxscale权限
CREATE USER 'maxscale'@'172.17.73.%' identified by 'Oracle_123';
GRANT SELECT on mysql.user to 'maxscale'@'172.17.73.%';
GRANT SELECT ON mysql.db TO 'maxscale'@'172.17.73.%';
GRANT SELECT ON mysql.tables_priv TO 'maxscale'@'172.17.73.%';
GRANT SHOW DATABASES ON *.* TO 'maxscale'@'172.17.73.%';
GRANT REPLICATION SLAVE, REPLICATION CLIENT,SELECT ON *.* TO maxscale@'172.17.73.%';
flush PRIVILEGES;
#开发账户
create user 'dev'@'%' identified by 'X0WMbwPrYD';
grant select on test.* to 'dev'@'%';
兼容工具或JDBC特性:
grant select on mysql.help_topic to 'xxx'@'172.17.73.%';
grant select on mysql.proc to 'xxx'@'172.17.73.%';
修改用户名:
rename user OLD_NAME to NEW_NAME;
----------------------
修改密码:
alter user 'root'@'%' identified by '12345678';
也可以:
#新版本5.7MYSQL修改密码:
update mysql.user set authentication_string=password('zabbix') where user='zabbix';
mariadb及5.6以下:
update mysql.user set password=password('zabbix') where user='zabbix';
修改认证插件:
ALTER USER 'root'@'%' IDENTIFIED WITH sha256_password BY 'pwd'; 指定认证插件
update user set plugin='mysql_native_password' where user = 'root' and host = '%';
MySQL 8.0 中,caching_sha2_password 是默认的身份验证插件,默认的密码加密方式是 SHA2。
需要修改my.cnf 中配置项并重启服务后生效。此选项暂不支持 MySQL 8.0 动态修改特性。
[mysqld]
default_authentication_plugin = mysql_native_password
MySQL 8.0 中已有的 SHA2 密码修改为 SHA1 的模式。
mysql> ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'password';
mysql> FLUSH PRIVILEGES;
认证中大小写敏感。
字段user,password,authencation_string,db,table_name大小写敏感
字段host,column_name,routine_name大小写不敏感
删除用户
mysql> drop user 'test'@'localhost';
Query OK, 0 rows affected (0.00 sec)
二、查看权限
(1)查看所有用户
mysql> select host,user,plugin,authentication_string,password_expired,password_lifetime,account_locked from mysql.user;
+-----------+-------------------+----------------------------------+-------------------------------------------+----------------------------+-------------------+----------------+
| host | user | plugin | authentication_string | password_expired | password_lifetime | account_locked |
+-----------+-------------------+---------------------------------+--------------------------------------------+----------------------------+-------------------+----------------+
| localhost | root | mysql_native_password | | N | NULL | N |
| localhost | mysql.session | mysql_native_password | *THISISNOTAVALIDPASS.... | N | NULL | Y |
| localhost | mysql.sys | mysql_native_password | *THISISNOTAVALIDPASSW | N | NULL | Y |
+-----------+--------------------+---------------------------------+---------------------------------------------+------------------+-------------------+----------------+
认证插件 密码加密字符串 密码是否过期 密码过期时间 账号登录是否锁定
(2)查看用户的权限
mysql> show grants for 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
2 rows in set (0.02 sec)
user表中host列的值的意义
% 匹配所有主机
localhost localhost不会被解析成IP地址,直接通过UNIXsocket连接
127.0.0.1 会通过TCP/IP协议连接,并且只能在本机访问;
::1 ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1
(3)忘记root密码,处理办法
[root@vm00 ~]# /etc/init.d/mysqld --skip-grant-tables
忽略权限表启动。(不检验权限)
Mysql –uroot mysql
更新root密码:
UPDATE user SET Password=PASSWORD('mysql') where USER='root';
或者:
set password for 'root'@'%' = Password('mysql')
新版本5.7MYSQL修改密码:
update mysql.user set authentication_string=password('mysql') where user='mysql';
FLUSH PRIVILEGES;
=====================================MySQL 角色管理
MySQL 8.0 角色是指定的权限集合,和用户帐户一样可以对角色进行权限的授予和撤消。如果用户被授予角色权限,则该用户拥有该角色的权限。
(1)MySQL 8.0 提供的角色管理功能如下:
CREATE ROLE 角色创建
DROP ROLE 角色删除
GRANT 为用户和角色分配权限
REVOKE 为用户和角色撤销权限
SHOW GRANTS 显示用户和角色的权限
SET DEFAULT ROLE 指定哪些帐户角色默认处于活动状态
SET ROLE 更改当前会话中的活动角色
CURRENT_ROLE() 显示当前会话中的活动角色
为了清楚区分角色的权限,建议将角色名称命名得比较直观。
mysql> CREATE ROLE 'app', 'dba', 'dev_read';
注:角色名称格式类似于由用户和主机部分组成的用户帐户,如:role_name@host_name。如果省略主机部分,则默认为 “%”,表示任何主机。
给角色授予对应的权限。
mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON wordpress.* TO 'app';
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO 'dba';
mysql> GRANT SELECT ON wordpress.* TO 'dev_read';
给用户分配角色
mysql> GRANT app TO 'app01'@'%';
mysql> GRANT ops TO 'ops01'@'%';
mysql> GRANT dev_read TO 'dev01'@'%';
如果要将多个用户同时加入多个角色,可以使用类似语句。
mysql> GRANT dev_read, dev_write TO 'dev02'@'%', 'dev03'@'%';
ALL [PRIVILEGES]表示除了GRANT OPTION和PROXY权限外,授予权限级别的所有可用权限。
(2)查看用户权限:
mysql> SHOW GRANTS FOR 'dev01'@'%';
+-------------------------------------+
| Grants for dev01@% |
+-------------------------------------+
| GRANT USAGE ON *.* TO `dev01`@`%` |
| GRANT `dev_read`@`%` TO `dev01`@`%` |
+-------------------------------------+
2 rows in set (0.00 sec)
如果要显示角色所代表的权限,需要加上 USING 子句和授权角色的名称。
mysql> SHOW GRANTS FOR 'dev01'@'%' USING dev_read;
+----------------------------------------------+
| Grants for dev01@% |
+----------------------------------------------+
| GRANT USAGE ON *.* TO `dev01`@`%` |
| GRANT SELECT ON `wordpress`.* TO `dev01`@`%` |
| GRANT `dev_read`@`%` TO `dev01`@`%` |
+----------------------------------------------+
3 rows in set (0.00 sec)
(3)设置默认角色
向用户帐户授予角色后,当用户帐户连接到数据库服务器时,它并不会自动使角色变为活动状态。
#查看当前角色。
mysql> SELECT current_role();
+----------------+
| current_role() |
+----------------+
| NONE |
+----------------+
1 row in set (0.00 sec)
要在每次用户帐户连接到数据库服务器时指定哪些角色应该处于活动状态,需用使用 SET DEFAULT ROLE 语句来指定。
# 以下语句将把 dev01 帐户分配的所有角色都设置为默认值。
mysql> SET DEFAULT ROLE ALL TO 'dev01'@'%';
用户帐户可以通过指定哪个授权角色处于活动状态来修改当前用户在当前会话中的有效权限。
将活动角色设置为 NONE,表示没有活动角色。
mysql> SET ROLE NONE;
将活动角色设置为所有授予的角色。
mysql> SET ROLE ALL;
将活动角色设置为由 SET DEFAULT ROLE 语句设置的默认角色。
mysql> SET ROLE DEFAULT;
同时设置多个活动的角色。
mysql> SET ROLE granted_role_1, granted_role_2, ...
(4)撤消角色或角色权限
正如可以授权某个用户的角色一样,也可以从用户帐户中撤销这些角色。
mysql> REVOKE role FROM user;
从 dev_write 角色中撤消掉修改权限。
REVOKE INSERT, UPDATE, DELETE ON wordpress.* FROM 'dev_write';
角色中撤销权限会影响到该角色中任何用户的权限。
删除角色:
DROP ROLE 'role_name', 'role_name', ...;
删除角色会从授权它的每个帐户中撤消该角色。
(5)克隆权限
MySQL 8.0 将每一个用户帐户视为角色,因此可以将用户帐户授予另一个用户帐户。例如:将一开发人员帐号权限复制到另一开发人员帐号。
将 dev02 用户帐户的权限复制到 dev04 用户帐户
mysql> GRANT 'dev02'@'%' TO 'dev04'@'%';
三、回收权限,密码过期时间管理,锁定账号
revoke跟grant的语法差不多,只需要把关键字 “to” 换成 “from” 即可;
mysql> revoke delete on *.* from 'test'@'localhost';
(2)密码过期时间管理
default_password_lifetime 其默认值为 0,表示禁用自动密码过期。
default_password_lifetime 的值如是是正整数 N ,则表示允许的设置密码生存周期 为 N,单位为天 。
如果你要建立一个全局策略,让所有用户的密码的使用期限为六个月。
[mysqld]
default_password_lifetime=180
也可以设置默认密码过期策略为 180 天后过期
mysql> SET PERSIST default_password_lifetime = 180;
# 设置默认密码过期策略为永不过期
mysql> SET PERSIST default_password_lifetime = 0;
# MySQL 8.0 永久动态修改参数会保存在配置文件 mysqld-auto.cnf 中,保存的格式为JSON串。
$ cat /var/lib/mysql/mysqld-auto.cnf
{ "Version" : 1 , "mysql_server" : { "default_password_lifetime" : { "Value" : "180" , "Metadata" : { "Timestamp" : 1525663928688419 , "User" : "root" , "Host" : "" } } } }
创建或修改一个用户的密码过期时间为 90 天。
mysql> CREATE USER 'mike'@'%' IDENTIFIED BY '000000' PASSWORD EXPIRE INTERVAL 90 DAY;
mysql> ALTER USER `mike`@`%` PASSWORD EXPIRE INTERVAL 90 DAY;
创建或修改一个用户的密码过期时间为永不过期。
mysql> CREATE USER 'mike'@'%' PASSWORD EXPIRE NEVER;
mysql> ALTER USER 'mike'@'%' PASSWORD EXPIRE NEVER;
创建或修改一个遵循全局到期策略的用户。
mysql> CREATE USER 'mike'@'%' PASSWORD EXPIRE DEFAULT;
mysql> ALTER USER 'mike'@'%' PASSWORD EXPIRE DEFAULT;
(3)锁定管理
创建一个带帐户锁的用户
mysql> CREATE USER 'mike-temp1'@'%' IDENTIFIED BY '000000' ACCOUNT LOCK;
锁定用户:
ALTER USER 'mike'@'%' ACCOUNT LOCK;
解锁此用户
mysql> ALTER USER 'mike-temp1'@'%' ACCOUNT UNLOCK;
(4)密码重用
从 MySQL 8.0 开始允许限制重复使用以前的密码。可以根据密码更改次数、已用时间或两者来建立密码重用限制。
如果根据密码更改次数限制帐户,则无法从指定数量的最新密码中选择新密码。例如:如果密码更改的最小数量设置为 3,则新密码不能与任何最近的3个密码相同。
如果根据密码修改时间来限制帐户,则无法将指定时间历史记录中的密码中选择为新密码。例如:如果密码重用间隔设置为 60,则新密码不得在最近 60 天内选择的密码相同。
注:空密码不记录在密码历史记录中,并随时可以重复使用。
要建立全局密码重用策略,可修改 password_history 和 password_reuse_interval 系统变量。
禁止重复使用最近 6 个密码或最近 180 天内使用过的任何密码为例。
[mysqld]
password_history=6
password_reuse_interval=180
该参数是支持永久动态设置,也可以直接用下面语句进行设置。
mysql> SET PERSIST password_history = 6;
mysql> SET PERSIST password_reuse_interval = 180;
四、密码3种检验策略
mysql对于密码有3种检验策略,默认validate_password_policy为MEDIUM。
LOW :仅仅验证密码长度,至少8个字符。
MEDIUM 在low基础上,密码必须至少包含1个数字字符、1个小写和大写字符以及1个特殊(非字母数字)字符。
STRONG :长度为4或更长的密码子字符串不能与单词匹配。
如果需要密码校验,需要安装插件:
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
检验密码复杂度
mysql> select VALIDATE_PASSWORD_STRENGTH('abc1235jeme');
+-------------------------------------------+
| VALIDATE_PASSWORD_STRENGTH('abc1235jeme') |
+-------------------------------------------+
| 50 |
+-------------------------------------------+
修改密码策略:
SHOW VARIABLES LIKE 'validate_password%';
validate_password_number_count 参数是密码中至少含有的数字个数,当密码策略是MEDIUM或以上时生效。
validate_password_special_char_count 参数是密码中非英文数字等特殊字符的个数,当密码策略是MEDIUM或以上时生效。
validate_password_mixed_case_count 参数是密码中英文字符大小写的个数,当密码策略是MEDIUM或以上时生效。
validate_password_length 参数是密码的长度,这个参数由下面的公式生成
validate_password_number_count+ validate_password_special_char_count+ (2 * validate_password_mixed_case_count)
validate_password_dictionary_file 参数是指定密码验证的字典文件路径。
validate_password_policy 这个参数可以设为0、1、2,分别代表从低到高的密码强度,此参数的默认值为1,如果想将密码强度改弱,则更改此参数为0。
更改密码策略为LOW
mysql> set global validate_password_policy=0;
更改密码长度
mysql> set global validate_password_length=0;
/etc/my.cnf配置文件中也可开启或关闭相关密码策略
[mysqld]
validate_password=off
五、MySQL支持的权限
ALL或ALL PRIVILEGES 代表指定权限等级的所有权限。
ALTER 允许使用ALTER TABLE来改变表的结构,ALTER TABLE同时也需要CREATE和INSERT权限。
重命名一个表需要对旧表具有ALTER和DROP权限,对新表具有CREATE和INSERT权限。
ALTER ROUTINE 允许改变和删除存储过程和函数
CREATE 允许创建新的数据库和表
CREATE ROUTINE 允许创建存储过程和包
CREATE TABLESPACE 允许创建、更改和删除表空间和日志文件组
CREATE TEMPORARY TABLES 允许创建临时表
CREATE USER 允许更改、创建、删除、重命名用户和收回所有权限
CREATE VIEW 允许创建视图
DELETE 允许从数据库的表中删除行
DROP 允许删除数据库、表和视图
EVENT 允许在事件调度里面创建、更改、删除和查看事件
EXECUETE 允许执行存储过程和包
FILE 允许在服务器的主机上通过LOAD DATA INFILE、SELECT ... INTO OUTFILE和LOAD_FILE()函数读写文件
GRANT OPTION 允许向其他用户授予或移除权限
INDEX 允许创建和删除索引
INSERT 允许向数据库的表中插入行
LOCK TABLE 允许执行LOCK TABLES语句来锁定表
PROCESS 允许显示在服务器上执行的线程信息,即被会话所执行的语句信息。
这个权限允许你执行SHOW PROCESSLIST和mysqladmin processlist命令来查看线程,同时这个权限也允许你执行SHOW ENGINE命令。
PROXY 允许用户冒充成为另外一个用户
REFERENCES 允许创建外键
RELOAD 允许使用FLUSH语句
REPLICATION CLIENT 允许执行SHOW MASTER STATUS,SHOW SLAVE STATUS和SHOW BINARY LOGS命令
REPLICATION SLAVE 允许SLAVE服务器连接到当前服务器来作为他们的主服务器。
SELECT 允许从数据库中查询表
SHOW DATABASES 允许账户执行SHOW DATABASE语句来查看数据库。没有这个权限的账户只能看到他们具有权限的数据库。
SHOW VIEW 允许执行SHOW CREATE VIEW语句
SHUTDOWN 允许执行SHUTDOWN语句和mysqladmin shutdown已经mysql_shutdown() C API函数
SUPER 允许用户执行CHANGE MASTER TO,KILL或mysqladmin kill命令来杀掉其他用户的线程,允许执行PURGE BINARY LOGS命令,
通过SET GLOBAL来设置系统参数,执行mysqladmin debug命令,开启和关闭日志,即使read_only参数开启也可以执行update语句,
打开和关闭从服务器上面的复制,允许在连接数达到max_connections的情况下连接到服务器。super权限可以对全局变量更改。
TRIGGER 允许操作触发器
UPDATE 允许更新数据库中的表
USAGE 代表没有任何权限,只能登陆
标签:8.0,权限,角色,GRANT,MySQL5.7,密码,mysql,password From: https://www.cnblogs.com/rcsy/p/18280563