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'));
    注:如果用户名或主机名包含特殊字符,必须在其前后使用单引号,若不包含特殊字符,单引号可省略。

            用户名后面主机名为localhost表示允许本地用户连接到mysql,主机名为%表示允许所有外部主机连接到mysql。

            创建用户名时不指定主机名,默认为%。

            创建用户名相同,主机名不同,mysql认为这是两个不同用户。
            创建用户不指定密码,则允许相关用户不用通过密码访问。
    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 修改用户名及密码

    3.1 修改用户名语法:

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.%';
    注:这条语句只能修改用户名字或主机名,不能修改用户密码。

             实例1修改了用户名,实例2修改了主机名。

    3.3 修改用户密码语法:

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默认为远程用户(如%),若要修改本地用户需要在用户名后指定localhost(如实例2)。

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

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.%';
    注:若仅指定用户名,未指定主机名,则主机名默认为‘%’。

            删除用户后,用户所建的表,索引或者其他数据库对象保留,因为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全局使用户能够查找主从服务器
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会自动创建这个用户,默认主机位‘%’,且没有指定密码。所以授权时最好明确指定。

            对于几个权限如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 
**************************************************************************************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值