標籤:
許可權管理
MySQL許可權系統通過下面兩個階段進行認證:
- 對串連的使用者進行身份認證,合法的使用者通過認證,不合法的使用者拒絕串連。
對通過認證的合法使用者授予相應的許可權,使用者可以通過再這些許可權範圍內對資料庫做相應的操作。
在許可權存取過程中,主要涉及到mysql資料庫下user表和db表。user表的資料結構如下:
db表資料結構如下:
表的說明:其中包含使用者列、許可權列、安全列和資源控制列。用的最頻繁的是使用者列和許可權列,許可權分為普通許可權和系統管理權限。普通許可權使用者資料庫的操作如select_priv、insert_priv等。系統管理權限主要用來對資料庫進行管理的操作,比如process_priv、super_priv等。
使用者進行串連的時候,許可權表的存取過程:
先從user表中的host、user和password這三個欄位中判斷串連的ip、使用者名稱以及密碼是否存在表中,如果存在,則通過驗證,否則拒絕串連。
- 通過身分識別驗證之後,按照以下許可權表的順序得到資料庫許可權:user->db->tables->priv->columns_priv。全域許可權,覆蓋局部許可權。比如一個使用者在user表中擁有選擇許可權,那麼他將對所有資料中的所有表所有的列都有選擇許可權。
許可權尋找詳細描述:當使用者通過許可權認證之後,進行許可權分配時候,按照user->db->tables_priv->columns_priv的順序進行許可權分配,即先檢查許可權表user,如果user表中對應的許可權為Y,此時使用者對應所有的資料庫許可權為Y,將不再檢查db、tables_priv、columns_priv;如果為N,則到db表中進行尋找使用者對於具體資料庫許可權,如果得到db中的Y許可權,則不在尋找,否則檢查tables_priv,看該資料庫對應的具體表許可權,如果為Y,則不在尋找,否則檢查columns_priv表,查看對應的具體列許可權。這一點對於我們授予使用者權限很重要。
帳號管理建立使用者
建立使用者,可以使用grant文法建立或者直接操作user表。
方法一:
直接操作use表
insert into user(Host,User,Password) values(“127.0.0.1”,”test”,password(“51testit”));
方法二:
格式 CREATE USER ‘username’@’host’ IDENTIFIED BY ‘password’;
eg:CREATE USER ‘test’@’127.0.0.1’ IDENTIFIED BY ‘51testit’;
建立之後,登入如下:
MySQL加密方式: MYSQL323加密中產生的是16位字串,而在MySQLSHA1中生存的是41位字串,其中是不加入實際的密碼運算中,通過觀察在很多使用者中都攜帶了”“,在實際破解過程中去掉”*”,也就是說MySQLSHA1加密的密碼的實際位元是40位。
Host欄位描述
- Host值可以是主機名稱或者IP號,或者locahost代表本地主機。
- 可以再host列值前面使用萬用字元”%”和”_”,”%”代表匹配任何主機,空的Host值等於”%”。如”%.myweb.com”,匹配所有mysql.com域的所有主機。案例如下:
| Host |
User |
解析 |
| myweb.wang |
pps |
pps,從myweb.wang串連 |
| % |
pps |
pps,從任何主機串連 |
| % |
” |
任何使用者,從任何主機串連 |
| 122.164.35.127 |
pps |
pps,從122.164.35.127串連 |
| 122.164.35.% |
pps |
pps,從122.164.35.類型子網的任何主機串連 |
查看使用者權限
對於上面建立的test,我沒有進行任何授權操作,當我使用test使用者去操作資料庫時候,發現:
沒有資料庫操作許可權,怎樣才能查看使用者擁有的許可權呢?
查看許可權
方法一:
show grants for [email protected];
方法二:
查看user表中記錄的許可權。
select * from mysql.user where user=’test’ and host=’127.0.0.1’ \G;
授予許可權
文法格式如下:
grant [privilege1|privilege2|all privileges] on dbName|.tableName 或 to [email protected] ;
當給test使用者授予xxpt選擇許可權時候:
grant select On xxpt.* to test.127.0.0.1;
db表發生了變化,新增加一條記錄。但是user表並沒有改變。如下:
此時,可以使用test使用者進行資料查詢操作,但是不能進行增、刪、改。於是授予其關於xxpt資料庫的所有許可權。
grant all privileges on xxpt.* to [email protected];
使用者test許可權如下:
此時可以更新資料
系統管理權限sueper、process、file授予
grant sueper,process,file On . to ‘test’@’127.0.0.1’;
語句中on後面只能是.
備忘:usage 許可權用於登入,不能進行任何操作。
刪除許可權
使用grant新增許可權,使用revoke進行許可權回收。當然回收許可權,也可以直接對user、db、tables_priv和columns_priv表進行操作。但是usage許可權是沒法收回的。
如回收test對所有資料庫的讀寫權限:
revoke select ,insert on . from [email protected];
修改密碼
1.使用mysqladmin
2.使用set password for [email protected] =password(‘isayhello’);
3.通過grant usage
grant usage on . to ‘test’@’127.0.0.1’ identified by ‘isayhello’;
4.直接修改user表
update user set Password=password(“newpassword”) where ***;
補充mysql中許可權
| 許可權 |
權限等級 |
許可權說明 |
| CREATE |
資料庫、表或索引 |
建立資料庫、表或索引許可權 |
| DROP |
資料庫或表 |
刪除資料庫或表許可權 |
| GRANT OPTION |
資料庫、表或儲存的程式 |
賦予許可權選項 |
| REFERENCES |
資料庫或表 |
|
| ALTER |
表 |
更改表,比如添加欄位、索引等 |
| DELETE |
表 |
刪除資料許可權 |
| INDEX |
表 |
索引許可權 |
| INSERT |
表 |
插入許可權 |
| SELECT |
表 |
查詢許可權 |
| UPDATE |
表 |
更新許可權 |
| CREATE VIEW |
視圖 |
建立視圖許可權 |
| SHOW VIEW |
視圖 |
查看視圖許可權 |
| ALTER ROUTINE |
預存程序 |
更改預存程序許可權 |
| CREATE ROUTINE |
預存程序 |
建立預存程序許可權 |
| EXECUTE |
預存程序 |
執行預存程序許可權 |
| FILE |
伺服器主機上的檔案訪問 |
檔案存取權限 |
| CREATE TEMPORARY TABLES |
伺服器管理 |
建立暫存資料表許可權 |
| LOCK TABLES |
伺服器管理 |
鎖表許可權 |
| CREATE USER |
伺服器管理 |
建立使用者權限 |
| PROCESS |
伺服器管理 |
查看進程許可權 |
| RELOAD |
伺服器管理 |
執行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload等命令的許可權 |
| REPLICATION CLIENT |
伺服器管理 |
複製許可權 |
| REPLICATION SLAVE |
伺服器管理 |
複製許可權 |
| SHOW DATABASES |
伺服器管理 |
查看資料庫許可權 |
| SHUTDOWN |
伺服器管理 |
關閉資料庫許可權 |
| SUPER |
伺服器管理 |
執行kill線程許可權 |
MYSQL的許可權如何分布,就是針對錶可以設定什麼許可權,針對列可以設定什麼許可權等等,這個可以從官方文檔中的一個表來說明:
| 許可權分布 |
可能的設定的許可權 |
| 表許可權 |
‘Select’, ‘Insert’, ‘Update’, ‘Delete’, ‘Create’, ‘Drop’, ‘Grant’, ‘References’, ‘Index’, ‘Alter’ |
| 列許可權 |
‘Select’, ‘Insert’, ‘Update’, ‘References’ |
| 過程許可權 |
‘Execute’, ‘Alter Routine’, ‘Grant’ |
MySQL中許可權管理