MySQL用户及数据安全专题

1 简单介绍

1.1 概要

1.2 权限分类

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 [email protected] 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 改动username及password

    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 [email protected]‘localhost‘ = password(‘simple1‘);

注:[FOR user]中user默觉得远程用户(如%),若要改动本地用户须要在username后指定localhost(如实例2)。

若用户没有设定password不能通过此命令加入password。否则会报错,提示没有匹配的行。

4 删除用户

    4.1 删除用户语法:

DROP USER user [, user] ...

    4.2 实例:

mysql> drop user remote1;
mysql> drop user [email protected]‘localhost‘;
mysql> drop user [email protected]‘10.186.18.%‘;

注:若仅指定username,未指定主机名,则主机名默觉得‘%’。

删除用户后,用户所建的表,索引或者其它数据库对象保留,由于mysql并没有记录谁创建了这些对象。

5 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 授予用户表与列级别权限

    6.1 创建測试用户

create user [email protected]‘%‘ 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 [email protected]‘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 授予用户数据库级别权限

    7.1 创建測试用户

create user [email protected]‘%‘ identified by ‘user_db_delete‘;
create user [email protected]‘%‘ 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.授予用户全局级别权限

    8.1 创建測试用户

create user [email protected]‘%‘ identified by ‘user_alter‘;
create user [email protected]‘%‘ identified by ‘user_all‘;

    8.2 授权实例

grant alter on *.* to user_alter;
grant all on *.* to user_all;

9 查看权限

    9.1 查看当前用户权限:

mysql> show grants;
+--------------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                                              |
+--------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY PASSWORD ‘*8F5FD68DB2095E8C849C884A05EC8E2B75C418B2‘ WITH GRANT OPTION |
+--------------------------------------------------------------------------------------------------------------------------------+

    9.2 查看指定用户权限:

方法1:

mysql> show grants for [email protected]‘%‘;
+-----------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                   |
+-----------------------------------------------------------------------------------------------------------+
| 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

10 权限传递

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 [email protected]‘%‘,[email protected]‘%‘;
mysql> grant select on *.* to [email protected]‘%‘ 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 [email protected]‘%‘ 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 [email protected]‘%‘,[email protected]‘%‘;
mysql> grant select on *.* to [email protected]‘%‘;

通过select_grant1用户登录到mysql,并为select_grant2授权

/mysql-5.5.28/bin/mysql -uselect_no_grant1 -h10.186.18.108 -P3355
mysql> grant select on *.* to [email protected]‘%‘;
ERROR 1045 (28000): Access denied for user ‘select_no_grant1‘@‘%‘ (using password: NO)

11 限制权限

能够对用户授予使用限制,如:每小时能够查询数据库的次数为5次。

mysql> grant select on test.* to [email protected]‘%‘ with MAX_QUERIES_PER_HOUR 5;

还有其他3个參数MAX_UPDATES_PER_HOUR, MAX_CONNECTIONS_PER_HOUR, MAX_USER_CONNECTIONS分别表示每小时更新mysql的次数,每小时连接mysql的次数及每小时的最大用户数,假设为0,则表示没有限制。

12 回收权限

revoke select on *.* from [email protected]‘%‘;

revoke select on *.* from [email protected]‘%‘;
revoke grant option on *.* from [email protected]‘%‘;

用户授予权限时没有使用with grant option。直接revoke就可以(演示样例1)。

使用with grant option的话,回收完权限还要grant option(演示样例2,3)。

13视图与安全

grant语句不仅能够引用表,也能够引用视图。表权限的全部类型都能够在视图上授予。

**************************************************************************************************

原文地址:http://blog.csdn.net/jesseyoung/article/details/38052519

**************************************************************************************************

时间: 2024-10-03 13:45:49

MySQL用户及数据安全专题的相关文章

详解nginx、php-fpm和mysql用户权限

通常情况下,我们运行web应用的服务器有CentOS.Ubuntu.Debian等等的Linux发行版本.这时候,构成服务架构所必须的Nginx.php和MySQL等应用的权限控制就显得非常重要,各个服务对代码目录的权限要求各不相同,缺少某些权限会造成服务无法读写或运行的错误,降低了权限要求又会存在被入侵修改的隐患.这里我们就来总结一下nginx.php-fpm和mysql等等这些服务的权限划分. 一.web服务器Nginx权限 PHP的运行框架通常都是结合Nginx组成LNMP或者结合Apac

30.5. MySQL用户,权限,服务器配置,查询缓存及优化,索引等

MySQL用户和权限管理 元数据数据库:mysql系统授权表:db, host, usercolumns_priv, tables_priv, procs_priv, proxies_priv 用户账号:'USERNAME'@'HOST' @'HOST': 主机名 IP地址或Network可用通配符: % _示例:172.16.%.% 用户管理 创建用户:CREATE USERCREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password']:默认权

mysql用户权限

mysql> show grants for [email protected]'localhost';+----------------------------------------------------------------------------------------------------------------------------------------+| Grants for [email protected] |+---------------------------

第15章 mysql 用户、权限管理

2015-10-24 目录 参考资料 [1] 唐汉明.深入浅出MySQL 数据库开发.优化与管理维护(第2版)[M].北京:人民邮电出版社,2014 [2] Schwartz.高性能MySQL(第3版)[M].北京:电子工业出版社,2013 [3] 范德兰斯.MySQL开发者SQL权威指南 [M].北京:机械工业出版社,2008 [4] Forta.MySQL必知必会 [M].北京:人民邮电出版社,2009 [5] Chapter 6 Security [6] 5.7. MySQL访问权限系统

nginx、php-fpm、mysql用户权限解析

这篇文章我们就特别来讲解下,nginx.php-fpm以及mysql运行在各个用户下的配置. 先来做个说明:nginx本身不能处理PHP,它只是个web服务器.当接收到客户端请求后,如果是php请求,则转发给php解释器处理,并把结果返回给客户端.如果是静态页面的话,nginx自身处理,然后把结果返回给客户端. Nginx下php解释器使用最多的就是fastcgi.一般情况nginx把php请求转发给fastcgi管理进程处理,fastcgi管理进程选择cgi子进程进行处理,然后把处理结果返回给

烂泥:nginx、php-fpm、mysql用户权限解析

本文首发于烂泥行天下. 前几天学习了,在nginx下搭建wordpress博客.在<烂泥:使用nginx利用虚拟主机搭建WordPress博客>文章中,我们特别提到了有关程序运行在哪个用户下面. 这篇文章我们就特别来讲解下,nginx.php-fpm以及mysql运行在各个用户下的配置. 先来做个说明:nginx本身不能处理PHP,它只是个web服务器.当接收到客户端请求后,如果是php请求,则转发给php解释器处理,并把结果返回给客户端.如果是静态页面的话,nginx自身处理,然后把结果返回

创建MySQL用户及赋予用户权限

创建MySQL用户及赋予用户权限 1.通过help查看grant命令帮助 -- CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'; GRANT ALL ON db1.* TO 'jeffrey'@'localhost'; GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost'; GRANT USAGE ON *.* TO 'jeffrey'@'localhost' WITH MAX_

mysql用户权限管理

mysql数据在实际生产环境中大量被使用,那平时在做好服务器上防火墙策略以外平时,对mysql下的用户权限也要严格管理,mysql的用户权限都是放在mysql.user这张表里,平时的用户权限管理都是隐式使用着这张表的,先说下权限: 权限 意义 select 查询 insert 插入 update 更新 delete 删除记录,一般用于清空表或者某一条记录 create 创建 drop 删除,从表空间里删除 grant 授予,一般用于给用户授权 references 引用 index 索引 al

MySQL 用户权限详细汇总(转)

1,MySQL权限体系 MySQL 的权限体系大致分为5个层级: 全局层级: 全局权限适用于一个给定服务器中的所有数据库.这些权限存储在mysql.user表中.GRANT ALL ON .和REVOKE ALL ON .只授予和撤销全局权限. 数据库层级: 数据库权限适用于一个给定数据库中的所有目标.这些权限存储在mysql.db表中.GRANT ALL ON db_name.和REVOKE ALL ON db_name.只授予和撤销数据库权限. 表层级: 表权限适用于一个给定表中的所有列.这