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]
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
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用戶及數據安全專題