MySQL的許可權排序問題

2021-09-23 17:37:31 字數 2814 閱讀 5504

實驗:因許可權表具有萬用字元,對許可權進行排序後,匹配時引來的問題。

授權表中的萬用字元

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...