MySQL用户及数据安全专题
1.1 概要
1.2 权限分类
2.1 语法例如以下:
CREATE USER user_specification [, user_specification] ... user_specification:
user
[
| IDENTIFIED WITH auth_plugin [AS 'auth_string']
IDENTIFIED BY [PASSWORD] 'password'
]
2.2 实例:
mysql> create user local@localhost identified by 'local';
mysql> create user simple;
mysql> create user 'remote'@'%' identified by 'remote';
mysql> insert into mysql.user (Host, User, Password) values ('localhost', 'simple', password('simple'));
注:假设username或主机名包括特殊字符。必须在其前后使用单引號。若不包括特殊字符。单引號可省略。
username后面主机名为localhost表示同意本地用户连接到mysql,主机名为%表示同意全部外部主机连接到mysql。
创建username时不指定主机名,默觉得%。
创建username同样。主机名不同。mysql觉得这是两个不同用户。
创建用户不指定password,则同意相关用户不用通过password訪问。
2.3 查看用户权限:
mysql> select * from mysql.user where USER='remote' \G
*************************** 1. row ***************************
Host: %
User: remote
Password: *123DD712CFDED6313E0DDD2A6E0D62F12E580A6F
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Create_user_priv: N
Event_priv: N
Trigger_priv: N
Create_tablespace_priv: N
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin:
authentication_string: NULL
权限均为N,表示此时用户还没有太多权限,他们仅仅能使用show语句查询全部存储引擎和字符集的列表。它们能够看到数据库information_schema,并可对表进行查询操作。不能使用ddl及dml语句。
3.1 改动username语法:
RENAME USER old_user TO new_user
[, old_user TO new_user] ...
3.2 实例:
mysql> rename user 'remote'@'%' to 'remote1'@'%';
mysql> rename user 'simple' to 'simple'@'10.186.18.%';
注:这条语句仅仅能改动username字或主机名。不能改动用户password。
实例1改动了username,实例2改动了主机名。
3.3 改动用户password语法:
SET PASSWORD [FOR user] =
{
PASSWORD('cleartext password')
| OLD_PASSWORD('cleartext password')
| 'encrypted password'
}
3.4 实例:
mysql> set password for remote1 = password('remote1');
mysql> set password for simple@'localhost' = password('simple1');
注:[FOR user]中user默觉得远程用户(如%),若要改动本地用户须要在username后指定localhost(如实例2)。
若用户没有设定password不能通过此命令加入password。否则会报错,提示没有匹配的行。
4.1 删除用户语法:
DROP USER user [, user] ...
4.2 实例:
mysql> drop user remote1;
mysql> drop user simple@'localhost';
mysql> drop user simple@'10.186.18.%';
注:若仅指定username,未指定主机名,则主机名默觉得‘%’。
删除用户后,用户所建的表,索引或者其它数据库对象保留,由于mysql并没有记录谁创建了这些对象。
注:库级别对库中全部表起作用,表级别仅仅针对库中特定表起作用。
5.1 授权分类列表
权限类型 | 作用域 | 简单介绍 |
SELECT | 全局,库,表。列 | 使用户能使用SELECT訪问特定表 |
INSERT | 全局,库,表,列 | 使用户能使用INSERT在特定表中加入行 |
UPDATE | 全局,库,表,列 | 使用户能使用UPDATE改动特定表中的值 |
DELETE | 全局,库。表 | 使用户能使用DELETE删除特定表中的行 |
CREATE | 全局,库,表 | 使用户能使用CREATE创建数据库及表 |
ALTER | 全局,库,表 | 使用户能使用ALTEER TABLE改动数据库中特定表 |
DROP | 全局,库。表 | 使用户能使用DROP删除库,表及视图 |
INDEX | 全局。库,表 | 使用户具有在表上创建。删除索引的能力 |
REFERENCES | 全局。库。表 | 使用户具有在表上创建外键的能力 |
ALL [ALL PRIVILEGES] | 全局,库。表,过程。proxy | 全部权限名的缩写(除了GRANT OPTION) |
CREATE VIEW | 全局。库,表 | 使用户具有创建和改动视图的权利 |
EXECUTE | 全局,库。表 | 使用户具有运行存储过程的权利 |
GRANT OPTION | 全局,库,表,过程,proxy | 使用户具有超级权限(可对其它用户授权或回收权利) |
SHOW VIEW | 全局,库,表 | 使用户具有SHOW CREATE VIEW的权限 |
TRIGGER | 全局,库,表 | 使用户具有操作trigger的全部权限 |
ALTER ROUTINE | 全局。库。过程 | 使用户具有改动和删除特定数据库中存储过程及存储函数的能力 |
CREATE ROUTINE | 全局,库 | 使用户具有在特定数据库中新建存储过程及存储函数的能力 |
CREATE TABLESPACE | 全局 | 使用户可以创建,改动,删除tablespaces and log file groups |
CREATE TEMPORARY TABLES | 全局,库 | 使用户可以CREATE TEMPORARY TABLE |
CREATE USER | 全局 | 使用户可以CREATE,RENAME,DROP USER及REVOKE ALL PRIVILEGES |
EVENT | 全局。库 | 使用户可以使用事件调度 |
FILE | 全局 | 使用户可以触发数据库读或写文件 |
LOCK TABLES | 全局。库 | 使用户在有SELECT权限的表上有锁表权限 |
PROCESS | 全局 | 使用户可以使用SHOW PROCESSLIST查看全部线程 |
PROXY | 用户到用户 | 使用户可以使用代理 |
RELOAD | 全局 | 使用户可以进行FLUSH操作 |
REPLICATION CLIENT | 全局 | 使用户可以查找主从server |
REPLICATION SLAVE | 全局 | 使从机可以从主机读取binlog |
SHOW DATABASES | 全局 | 使用SHOW DATABASES查看全部数据库 |
SHUTDOWN | 全局 | 使用户可以使用mysqladmin shutdown停止数据库服务 |
SUPER | 全局 | 同意使用其它管理命令,如: CHANGE MASTER TO, KILL, PURGE BINARY LOGS, SET GLOBAL, 及mysqladmin debug |
USAGE | no privileges 的同义词 |
5.2 授权语法
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user_specification [, user_specification] ...
[REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
[WITH with_option ...] GRANT PROXY ON user_specification
TO user_specification [, user_specification] ...
[WITH GRANT OPTION] object_type:
TABLE
| FUNCTION
| PROCEDURE priv_level:
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name user_specification:
user
[
| IDENTIFIED WITH auth_plugin [AS 'auth_string']
IDENTIFIED BY [PASSWORD] 'password'
] ssl_option:
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject' with_option:
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
5.3 创建測试表及数据
mysql> use test;
mysql> create table pri_test(c1 int(10), c2 varchar(20));
mysql> insert into pri_test values (1, 'test1'), (2, 'test2');
6.1 创建測试用户
create user user_tab_insert@'%' identified by 'user_tab_insert';
6.2 授权实例
grant insert on test.pri_test to user_tab_insert;
grant update (c1) on test.pri_test to user_tab_update@'localhost' identified by 'user_tab_update';
注:授权后用户user_tab_insert能够对表pri_test进行数据插入,用户user_tab_update能够对表pri_test进行更新。而无论是谁创建了这张表。
假设授权一个不存在的用户。如user_tab_update。mysql会自己主动创建这个用户,默认主机位‘%’,且没有指定password。
所以授权时最好明白指定。
对于几个权限如update,reference能够指明权限所使用的列,如表pri_test的c1列。
7.1 创建測试用户
create user user_db_delete@'%' identified by 'user_db_delete';
create user user_db_alter@'%' identified by 'user_db_alter';
7.2 授权实例
grant delete on test.* to user_db_delete;
grant alter on test.* to user_db_alter;
注:授予数据库权限与表权限类似,授予一个权限不意味着拥有还有一个权限。如:授予用户delete和alter权限,不意味着用户能select查询数据库中的表。
8.1 创建測试用户
create user user_alter@'%' identified by 'user_alter';
create user user_all@'%' identified by 'user_all';
8.2 授权实例
grant alter on *.* to user_alter;
grant all on *.* to user_all;
9.1 查看当前用户权限:
mysql> show grants;
+--------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@% |
+--------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD '*8F5FD68DB2095E8C849C884A05EC8E2B75C418B2' WITH GRANT OPTION |
+--------------------------------------------------------------------------------------------------------------------------------+
9.2 查看指定用户权限:
方法1:
mysql> show grants for user_alter@'%';
+-----------------------------------------------------------------------------------------------------------+
| Grants for user_alter@% |
+-----------------------------------------------------------------------------------------------------------+
| GRANT ALTER ON *.* TO 'user_alter'@'%' IDENTIFIED BY PASSWORD '*C0D3F7283734BF5F77E41352ADFC9A307AC8A344' |
+-----------------------------------------------------------------------------------------------------------+
方法2:
mysql> select * from mysql.user where user='user_all' \G
*************************** 1. row ***************************
Host: %
User: user_all
Password: *F02C912C68B67B7097BAEC8FE76BA6F50357895C
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin:
authentication_string: NULL
grant语句最后能够跟with grant option,同意被授权用户将所获得权限传递给第三方用户,而无论其他用户是否具有该权限。
对照1:使用with grant option
通过root用户登录到mysql,创建用户select_grant1,select_grant2并为select_grant1授权
/mysql-5.5.28/bin/mysql -uroot -pjesse -h10.186.18.108 -P3355
mysql> create user select_grant1@'%',select_grant2@'%';
mysql> grant select on *.* to select_grant1@'%' with grant option;
通过select_grant1用户登录到mysql,并为select_grant2授权
/mysql-5.5.28/bin/mysql -uselect_grant1 -h10.186.18.108 -P3355
mysql> grant select on *.* to select_grant2@'%' with grant option;
Query OK, 0 rows affected (0.00 sec)
授权成功!
对照2:未使用with grant option
通过root用户登录到mysql,创建用户select_grant1,select_grant2并为select_grant1授权
/mysql-5.5.28/bin/mysql -uroot -pjesse -h10.186.18.108 -P3355
mysql> create user select_no_grant1@'%',select_no_grant2@'%';
mysql> grant select on *.* to select_no_grant1@'%';
通过select_grant1用户登录到mysql,并为select_grant2授权
/mysql-5.5.28/bin/mysql -uselect_no_grant1 -h10.186.18.108 -P3355
mysql> grant select on *.* to select_no_grant2@'%';
ERROR 1045 (28000): Access denied for user 'select_no_grant1'@'%' (using password: NO)
能够对用户授予使用限制,如:每小时能够查询数据库的次数为5次。
mysql> grant select on test.* to limit_select@'%' with MAX_QUERIES_PER_HOUR 5;
还有其他3个參数MAX_UPDATES_PER_HOUR, MAX_CONNECTIONS_PER_HOUR, MAX_USER_CONNECTIONS分别表示每小时更新mysql的次数,每小时连接mysql的次数及每小时的最大用户数,假设为0,则表示没有限制。
revoke select on *.* from select_no_grant1@'%'; revoke select on *.* from select_grant1@'%';
revoke grant option on *.* from select_grant1@'%';
用户授予权限时没有使用with grant option。直接revoke就可以(演示样例1)。
使用with grant option的话,回收完权限还要grant option(演示样例2,3)。
grant语句不仅能够引用表,也能够引用视图。表权限的全部类型都能够在视图上授予。
**************************************************************************************************
原文地址:http://blog.csdn.net/jesseyoung/article/details/38052519
**************************************************************************************************
MySQL用户及数据安全专题的更多相关文章
- 详解nginx、php-fpm和mysql用户权限
通常情况下,我们运行web应用的服务器有CentOS.Ubuntu.Debian等等的Linux发行版本.这时候,构成服务架构所必须的Nginx.php和MySQL等应用的权限控制就显得非常重要,各个 ...
- 烂泥:nginx、php-fpm、mysql用户权限解析
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ilanni.blog.51cto.com/526870/1561097 本文首发 ...
- mysql用户密码修改,用户添加、删除及设置权限
一下的示例所用用户名和密码为:test,111111 Mysql密码修改: Mysql修改密码需要root的权限,先执行mysql -uroot -p(密码); 1)使用set password方式来 ...
- 如何通过命令行创建和设置一个MySQL用户
我想要在MySQL服务器上创建一个新的用户帐号,并且赋予他适当的权限和资源限制.如何通过命令行的方式来创建并且设置一个MySQL用户呢? 要访问一个MySQL服务器,你需要使用一个用户帐号登录其中方可 ...
- MySQL用户与权限管理
执行mysql select 查询报错: SELECT command denied to user 'root'@'localhost' for table "xxx" 问题原因 ...
- mysql用户权限
mysql> show grants for root@'localhost';+-------------------------------------------------------- ...
- MySQL 用户与授权管理详解
大纲 一.前言 二.创建用户并授权 三.GRANT语句的种类 四.撤权并删除用户 一.前言 做为Mysql数据库管理员管理用户账户,是一件很重要的事,指出哪个用户可以连接服务器,从哪里连接,连接后能做 ...
- 创建MySQL用户 赋予某指定库表的权限 flush privileges才能生效!!!!;@'localhost'授权本地,@'%'授权远程
update ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value 建议使用GRANT语句进行授权,语句如下: gra ...
- MySql 用户 及权限操作
bin/msyql -h host -u user -p bin/mysql -u mysql -p 本地登录 如无密码按回车直接进入mySql bin/mysqladmin -u roo ...
随机推荐
- Android OKHttp网络框架
好久没逛简书了.这周公司的项目也已经愉快的迭代了新版本,对于之前一直存留的东西一直没怎么梳理,今天想说说这两年特别火的网络框架.okhttp我想大部分Android开发者都不陌生,因为它的到来.是我们 ...
- POJ_1163_The triangle
The Triangle Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 40079 Accepted: 24144 De ...
- 04JavaScript程序语句
JavaScript程序语句 2.6程序控制流程 2.6.1选择结构 if <逻辑表达式> 语句 else 语句 if <逻辑表达式> { 语句组 } else { 语句组} ...
- BZOJ5314: [Jsoi2018]潜入行动 (树形DP)
题意:一棵树选择恰好k个结点放置监听器 每个监听器只能监听相邻的节点 问能使得所有节点被监听的种类数 题解:反正就是很well-known的树形DP了 至于时间复杂度为什么是nk 不会不学 很好想到四 ...
- vuex与redux,我们都一样
vuex与redux的主要区别: redux:生成的全局数据流是通过每个组件的props逐层传递到各个子组件的,通过@connect装饰器绑定在this.props上面. vuex :生成的全局数据则 ...
- Go:变量、常量、枚举
一.变量 package main import "fmt" func variableZeroValue() { // 变量声明 var a int var b string f ...
- pipreqs(找当前项目依赖的包)
pipreqs pipreqs可以帮你找到当前项目的所有组件及其版本.就是当别人给你一个程序的时候,你要在自己电脑上运行起来,就需要安装程序所依赖的组件,总不能自己一个一个找吧. # 安装 pip3 ...
- Python学习第二阶段,Day2,import导入模块方法和内部原理
怎样导入模块和导入包?? 1.模块定义:代码越来越多的时候,所有代码放在一个py文件无法维护.而将代码拆分成多个py文件,同一个名字的变量互不影响,模块本质上是一个.py文件或者".py&q ...
- Effective C++ 一些记录和思考
Effective C++ Iter 3 - 尽可能使用 const 一个反逻辑的 bitwise const class Text { ... char& operator[](std::s ...
- [bzoj2461][BeiJing2011][符环] (括号配对+记忆化搜索+高维dp)
Description 在可以炼制魔力强大的法杖的同时,Magic Land 上的人们渐渐意识到,魔力强大并不一定能给人们带来好处——反而,由此产生的破坏性的高魔力释放,给整个大陆蒙上了恐怖的阴影. ...