1、mysql的權限是,從某處來的用戶對某對象的權限。
2、mysql的權限采用白名單策略,指定用戶能做什么,沒有指定的都不能做。
3、權限校驗分成兩個步驟:
a、能不能連接,檢查從哪里來,用戶名和密碼,常見錯誤 ERROR 1045 (28000): Access denied for user ...
b、能不能執行操作,粒度從粗到細,分別為:mysql.user, mysql.db, msql.tables_priv, mysql.columns_priv, mysql.proc_priv。需要注意的是,這些表各有分工,但是在權限分配上有一定的重合。可以這樣理解,mysql 先檢查對大范圍是否有權限,如果沒有再到小范圍里去檢查。比如:先檢查對這個數據庫是否有select權限,如果有,就允許執行。如果沒有,再檢查對表是否有select權限,一直到最細粒度,也沒有權限,就拒絕執行。舉例來說:要檢查張三能否控制一個團,我只要先檢查張三能否控制一個軍,如果可以,就是有權限,如果不行,再檢查張三能否控制一個師。。。。因此,粒度控制越細,權限校驗的步驟越多,性能越差,需要考慮。
4、mysql服務啟動之后,就會把權限有關的表的數據讀到內存中,對權限做的修改,是否會即時生效?要看情況,手動修改表數據,需要 flush privileges
5、創建用戶 create user,修改密碼 set password,注意 alter user只是設置密碼過期,可以登錄,但是不能執行任何操作,必須從新設置密碼,刪除用戶 drop user
6、host+user 標示唯一的一個用戶,也就是說都叫張三,從不同地方來的張三是兩個用戶,他們有不同的權限。
7、那么問題來了,表中有兩條記錄:'root'@'192.168.1.101' 和 'root'@'%', 現在root來登錄,mysql 怎么匹配呢?認為是哪個root呢?
mysql 對用戶進行了排序,先對host排序,再對user排序,小范圍在前面,大范圍在后面,從上往下匹配。
8、權限授予,grant 權限 on 對象 to 用戶@哪里來 identified by 密碼
9、收回權限,revoke 權限 on 對象 from 用戶@哪里來,注意revoke 必須要與grant 對應,也就是說,只能收回授予的權限。
10、那么問題來了,我授予張三 select的權限,現在revoke all privileges 也不能收回張三select的權限,因為沒有對張三 grant all privileges,怎么解決這個問題?
使用 revoke all privileges,grant option from user
11、權限級別:從某台主機來的某個用戶,對某個數據庫中某個表的某些列的某部分記錄,是否有權限。
12、全局:對象是mysql服務的所有數據庫,包含服務級的管理權限,比如showdown
13、數據庫:對象是某一個數據庫
14、表:對象是數據庫中某個表
15、列:對象是表中的某個列,比如:grant select (name) on xxx to xxx
16、程序:對象是存儲過程和方法。
17、information_scheme,數據庫和表是存放數據的,那么誰來存放 數據庫和表這些信息呢? information_scheme 就是記錄數據庫和表的,需要注意的是,infromation_scheme沒有對應的物理文件,它是mysql在內存中維護的。
18、權限設定原則:
a、盡量縮小權限
b、按業務,分離用戶,不同的業務對應不同的用戶
c、避免權限粒度太細,因為mysql權限檢查,會影響性能。
19、文件泄密,linux下mysql客戶端執行的操作記錄在文件 ~/.mysql_history中,輸出重定向/dev/null
20、密碼丟失怎么辦?
a、mysql啟動,增加選項重置密碼
b、mysql啟動,增加選項不檢查權限,登陸后修改密碼,退出重啟啟動。