實驗:因許可權表具有萬用字元,對許可權進行排序後,匹配時引來的問題。
授權表中的萬用字元
user表中user為空值表示匹配任意user name,也表示匿名使用者。
user表中host部分使用者可以使用萬用字元」%」和」_」在host name或者ip位址中,這些具有和模式匹配like相同的意義。
db表中,host、user與user表中表示方法一致,同時db列也可以具有萬用字元。
tables_priv、columns_priv和procs_priv表中,只有host列可以具有萬用字元。
由於具有萬用字元,這就會發生乙個使用者連線server可以匹配多個賬戶的事情發生。例如建立了賬戶』』@localhost和』yz』@』%』,當使用者』yz』@localhost登入時兩個賬戶都可以匹配。這樣就面臨著選擇哪乙個賬戶作為登入賬戶的問題。mysql為解決這個問題,對user表中的記錄做了排序。排序方法如下:
先按最具體的(most-specific)host值排序。原義的host_name和ip位址算是最具體的(ip位址的具體級別specificity是不受子網掩碼影響的,192.168.1.13和192.168.1.0/255.255.255.0被認為是同一具體級別)。匹配符』%』算是最不具體的級別。空字元』』也表明任意host,但排在』%』後面。有相同host值的行首先以最具體的user值排序(空user值意味著「任何使用者」並且是最不具體的)。對於具有相同具體級別的host和user值,排序是不確定。
採用上述方法,當』yz』@localhost登入時,匹配的就是賬號』』@localhost。如果用用賬戶』yz』@』%』的密碼試圖登入,可能會被告知access denied for user 'yz'@'localhost',因為mysql選取的登入賬戶是』』@localhost。
不過mysql也比較奇怪,登入後使用select user()發現
| user() |
| yz@localhost |
使用show grants;可以看到下面結果,賬戶是』』@localhost。
| grants for @localhost |
| grant usage on *.* to ''@'localhost' |
| grant create on `privtest`.* to ''@'localhost' |
賬戶行為還好,不會引起太大的坑。db中的排序不注意可能就會導致mysql結果不一致,使用者許可權可能『丟失』,導致使用者無法正常工作,服務故障。
db表在host、db和user範圍列上排序,也是按照具體到不具體排序,而且匹配到第一條符合的記錄後,就返回。首先其排序是不穩定排序,這會導致插入一條不相關的記錄,導致其他記錄排序變化,許可權表現變化,部分原有許可權『丟失』。即使是穩定排序,也會導致邏輯上應該有的許可權沒有,例如
grant select on aaa.* to yz@localhost;
grant create on `aa%` to yz@localhost;
grant insert on `aaa%` to yz@localhost;
mysql在做許可權檢查時,只會返回匹配到的第一條記錄,即使用者yz@localhost對aaa資料庫只有select許可權,不會有create和insert許可權。從這個角度講即使排序穩定,插入新的許可權資訊也可能會導致之前的許可權『丟失』。
1、mysql的許可權驗證有global,db,table,column多個緯度。
2、在global和db緯度中,mysql按內部權重,從大到小讀取所有授權,獲取第乙個匹配(權重最大的)的作為內部授權驗證。
3、db緯度的權重計算方法如下:
3.1 分別按照hostname,dbname,username計算。
3.2 單個字串若不存在萬用字元權重為0x80,若存在萬用字元,則權重為第乙個萬用字元出現的位置,最大為0x7f
3.3 舉例 grant create on `tt_`.* to 'tt'@『%』 這條授權的權重為0x010380,其中』%』為0x01 』tt_』為0x03 』tt』為0x80
4、當前mysql內部大部分排序採用快速排序,這是一種不穩定的排序演算法。
實驗:mysql在db層驗證許可權時,是否會對db中所有賬戶許可權資訊都做逐一匹配。
結論:從效果上mysql會逐一匹配db表中的資訊,遇到能匹配的就返回,導致擁護show grants的許可權資訊可能與實際許可權不一致。(table層也是這樣)
mysql排序先後為host、db、user,前面user表在匹配時會發生匹配多條記錄,那麼在db層匹配時,同時可匹配的賬戶是否也會在db層發生匹配。實驗:
同時建立
』yz』@』%』和』yz』@localhost賬號。
對』yz』@』%』賦予許可權:
grant create on yzdb to 'yz'@'%';
登入yz@localhost,執行下面語句,可以看到許可權資訊僅usage。這個時候試著建立database yzdb,會發現其具有建立yzdb的許可權。
mysql> show grants;
| grants for yz@localhost |
| grant usage on *.* to 'yz'@'localhost' |
mysql> create database yzdb;
query ok, 1 row affected (0.02 sec)
當撤銷'yz'@'%'的建立yzdb許可權,'yz'@'localhost'也會失去該許可權。
在測試中,』』@localhost賬戶不會擁有'yz'@'%'的上述許可權。在這裡匹配時,』yz』不等同於』』。
上述情況也會產生許可權『丟失』問題,show grants中有的許可權可能因為其他賬戶授權資訊引發『丟失』。
mysql 許可權 無效 mysql許可權問題
mysql資料庫許可權問題 root 擁有所有許可權 可以幹任何事情 許可權賬戶,只擁有部分許可權 curd 例如,只能操作某個資料庫的某張表 修改mysql 初始root賬戶密碼 first 在mysql資料庫中查詢 user 使用者配置表內含密碼 select from user 此時在表中的密...
MySQL許可權問題
1 修改mysql使用者密碼 1 先來看乙個password 函式,mysql使用md5加密 select password root 2 使用mysql資料庫,檢視使用者表 use mysql select from user 3 修改密碼 update user set password pas...
mysql的詭異問題,許可權問題
今天倒騰各種運營中的專案到新的伺服器,centos 6.3系統,mysql5.5 mysql配置的時候google到乙份貌似不錯的my.cnf配置,就隨手貼過來了,結果悲劇開始了。首先是各種起不來,折騰了半天發現日誌裡面各種引數不是過期就是錯誤,改了五六個引數才讓mysql跑起來。然後挪了datad...