MySQL用戶權限管理學習筆記

用戶權限管理

grant 語句在執行時候,如果權限表中不存在賬號,則創建賬號,如果已經存在,則執行權限的新增

創建用戶z1@localhost並賦予所有數據庫的select權限

grant select on *.* to 'z1'@'localhost'

revoke select,insert, on *.* from 'user'@'localhost'

空host等價於%,host列值可使用%和_,以最具體的Hos值排序,主機名和IP號是最具體的

host值爲*或者空表示所有外部IP都可以連接,但是不包括本機,如果要包括本地服務器,必須單獨爲localhost賦予權限

grant super,process,file on *.* to 'user'@'%',這幾個權限屬於管理權限,不能夠指定某個數據庫,on後面必須指定 *.*。usage 權限只能用於數據庫登錄,不能執行任何操作,不能收回,Revoke 並不能刪除用戶。

查看賬戶權限:show grants for 'user'@'host'或select * from schema_privileges where grantee='user'@'host'

刪除賬號:drop user 'user'@'host'

例如:grant select on *.* to 'z1'@'localhost' with max_user_connections 5。清除設置只需要將 grant usage on *.* to 'user'@'host' with max_user_connectons 0;

資源限制是對某一個賬號累加的,清除相關累加值使用root賬號執行 flush user_resources/ flush privileges/ mysqladmin reload這三個命令中的任何一個。

修改用戶密碼示例:

mysqladmin -u user_name -h host_name password 'newpwd'

set password for 'user'@'host'=password('123456');

如果是更新自己密碼,則可以省略for

set password=password('123456');

還可以使用grant usage 在 *.*來指定賬戶密碼,而不影響當前賬戶權限

grant usage on *.* to 'user'@'host' identified by password('123456');

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';

use mysql;

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密碼';

FLUSH PRIVILEGES;

創建用戶:

create user 'root'@'%' identified by '123456';這條語句做了兩個動作,往mysql.user表裏插入一行,但沒有指定權限,在內存裏,往數組acl_users裏插入一個acl_user對象。

grant all privileges on *.* to 'root'@'%' with grant option;這是給用戶root賦一個最高的權限,在磁盤上,將mysql.user表裏權限字段的值都修改爲Y,內存裏,數組acl_users中找到這個用戶對應的對象,將access值修改爲二進制的全1。如要有新的客戶端用此用戶root登錄,mysql會爲新連接維護一個線程對象,然後從acl_user數組裏到這個用戶的權限,並將權限拷貝到這個線程的對象中。所有全局權限的判斷都直接使用線程對象內部保存的權限位。

grant命令對於全局權限,同時更新磁盤和內存,命令完成即時生效,接下來新創建的連接會使用新的權限,對於已經存在的連接,它的全局權限不受grant命令影響。

全局權限作於整個mysql實例,並不是指某個特定的數據庫或表。即on *.*

基於庫的權限記錄在mysql.db表中,grant all privileges on db1.* to user@host with grant option;該語句做了兩個動作,一是在mysql.db表中插入一條記錄並記爲Y,另一個是在acl_dbs表中增加一個對象且權限爲1;

grant 對於已經存在連接影響,在全局權限和基於db的權限的效果是不同的。

對於super權限的,這個權限信息是在當前的連接線程中的,而revoke操作不影響到這個線程對象。

如果當前會話已經處於一個db裏面,即執行了use db,那麼此時拿到這個庫的權限會保存在會話變量中的,在切換出db之前該會話對db庫一直擁有權限。

除了db級別的還表級別和列級別的權限。這兩類權限組合起來放在內存的hash結構的column_pri_hash中。

賦於列級別的權限 grant select(id),insert(id,a) on mydb.table to user@host with grant option;

對這兩類的權限操作也會立即修改數據表和內存。

 

flush privileges;

綜上grant 語句都是即時生效的,即同時將數據寫到數據表中並更新內存。

如果sessionA在未選定當前數據庫的情況下,對權限操作,則同樣隻影響在未選定的數據庫操作的會話,而不影響已執行use db的會話,因爲執行過use db的會話,已將權限對象保存在線程內存中了。也不影響全局權限super,process,file,grant,revoke。

如果會話已執行了use db情況下,則後續的在此會話中對此數據庫表的權限操作都會時實生效,但是如果對其他數據庫表的操作不影響其他已執行了相應的use db的會話。

 

賬戶權限安全配置需要的常用命令 

1. 新建一個用戶並給予相應數據庫的權限 grant select,insert,update,delete,create,drop privileges on database.* to user@localhost identified by 'passwd'; grant all privileges on database.* to user@localhost identified by 'passwd';

grant create on testdb.* to developer@'192.168.0.%'; grant alter on testdb.* to developer@'192.168.0.%'; grant drop on testdb.* to developer@'192.168.0.%';

grant references on testdb.* to developer@'192.168.0.%'; --外鍵操作權限

grant create temporary tables on testdb.* to developer@'192.168.0.%'; --臨時表權限

grant index on testdb.* to developer@'192.168.0.%'; --索引操作權限

grant create view on testdb.* to developer@'192.168.0.%'; 創建視圖 grant show view on testdb.* to developer@'192.168.0.%'; 查看視圖源代碼權限:

 

grant create routine on testdb.* to developer@'192.168.0.%'; -- now, can show procedure status grant alter routine on testdb.* to developer@'192.168.0.%'; -- now, you can drop a procedure grant execute on testdb.* to developer@'192.168.0.%';

grant execute on procedure testdb.pr_add to 'dba'@'localhost' --作用在存儲過程上 grant execute on function testdb.fn_add to 'dba'@'localhost' --作用在函數上

 

這裏在給一個用戶授權多張表時,可以多次執行以下語句。例如:

grant select(user_id,username) on smp.users to mo_user@'%' identified by '123345'; grant select on smp.mo_sms to mo_user@'%' identified by '123345';

grant select(id, se, rank) on testdb.apache_log to dba@localhost; --作用在列上

 

all privileges 不包括 grant 權限,所以在後面要跟with grant option 

2. 刷新權限 flush privileges;

3. 顯示授權 show grants;

4. 移除授權 revoke delete on *.* from 'user'@'localhost';

5. 刪除用戶 drop user 'user'@'localhost';

6. 給用戶改名 rename user 'jack'@'%' to 'jim'@'%';

7. 給用戶改密碼 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');

mysql 5.6 默認root用戶,只能從本機

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B' WITH GRANT OPTION

| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION

 

mysql 5.7默認root用戶,任何主機

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION

 

在創建用戶時,如果指定域名,如果域名的ip被惡意修改,則數據庫就會被惡意的IP訪問,導致安全隱患。例如:

grant select on test1.* to 'user'@'www.xxx.com'

編輯hosts文件,增加此域名和ip的對應關係

192.168.3.33 www.xxx.com

如果將此域名對應的ip修改,則連接失敗。

刪除匿名賬號:

drop user ''@'localhost';

給root賬號設置密碼:set password=password('123456');

可以將密碼寫入my.cnf

[client]

user=username

password=password

對文件進行嚴格權限限制:chmod +600 /etc/my.cnf

不要把 file、process、或super權限賦予管理員以外的權限。

file權限可以通過select .... into outfile ..寫到服務器上具有寫權限的目錄;

可以通過load data infile '/usr/local/mysql/backup/db1' into table t1 命令寫入數據庫

Proecess可以被用來執行 show processlist命令,從而可以看到執行的sql語句。例如:

1、打開第一個session lock table ser read;

2、打開另一個session 用root執行密碼修改操作,因user被鎖定,所以sql被掛起。

3、打開第三個session 用具有process權限的賬號登錄執行show processlist

super 權限能執行kill命令,終止其他用戶進程。kill 掉 show processlist查出來的進程。

load data 默認讀的是服務器上文件,但是加上local後,可將本地具有訪問權限的文件加載到數據庫中,解決辦法是,可以用--local-infile=0選項啓動mysqld從服務端禁用load data local命令。類似,對於mysqlimport --local或 -L選項啓用本地數據文件裝載。

drop table 時不收回以前的相關訪問授權,在刪除表時要同時取消其他用戶在此表上的相應的權限

revoke命令漏洞

在一個數據庫上多次賦予權限,權限會自動合併,但是在多個數據庫上多次賦予權限,每個數據庫都會認爲是單獨的一組權限,必須在數據庫上用revoke命令來單獨進行權限收回,而revoke all privileges on *.* 並不會替用戶自動完成。例如:

grant select ,insert on test1.* to 'user'@'host'

grant all privileges on *.* to 'user'@'host'

root賬戶的權限不能被收回

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章