首页 > 代码库 > MySQL用户及数据安全专题

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 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 改动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 simple@‘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 simple@‘localhost‘;
mysql> drop user simple@‘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 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 授予用户数据库级别权限

    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.授予用户全局级别权限

    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 查看权限

    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

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 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)

11 限制权限

    能够对用户授予使用限制,如:每小时能够查询数据库的次数为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,则表示没有限制。

12 回收权限

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)。

13视图与安全

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


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

MySQL用户及数据安全专题