1. 程式人生 > >MySQL用戶及數據安全專題

MySQL用戶及數據安全專題

require int auth 0.00 刪除索引 文件 新建 change database

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 [email protected]%‘ 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 [email protected]%‘ to [email protected]%‘;
mysql> rename user ‘simple‘ to [email protected]%‘;
註:這條語句僅僅能改動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] = 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];
mysql> drop user [email protected]%‘;
註:若僅指定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] 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 root@%                                                                                                              |
+--------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO [email protected]%‘ IDENTIFIED BY PASSWORD ‘*8F5FD68DB2095E8C849C884A05EC8E2B75C418B2‘ WITH GRANT OPTION |
+--------------------------------------------------------------------------------------------------------------------------------+
9.2 查看指定用戶權限:

方法1:

mysql> show grants for [email protected]%‘;
+-----------------------------------------------------------------------------------------------------------+
| Grants for user_alter@%                                                                                   |
+-----------------------------------------------------------------------------------------------------------+
| GRANT ALTER ON *.* TO [email protected]%‘ 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 [email protected]%‘ (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
**************************************************************************************************

MySQL用戶及數據安全專題