MySQL安全性指南(3)(轉)

來源:互聯網
上載者:User
mysql|安全|安全性 MySQL安全性指南(3)

作 者: 晏子



2.4 不用GRANT設定使用者
如果你有一個早於3.22.11的MySQL版本,你不能使用GRANT(或REVOKE)語句設定使用者及其存取權限,但你可以直接修改授權表的內容。如果你理解GRANT語句如何修改授權表,這很容易。那麼你通過手工發出INSERT語句就能自己做同樣的事情。

當你發出一條GRANT語句時,你指定一個使用者名稱和主機名稱,可能還有口令。對該使用者產生一個user表記錄,並且這些值記錄在User、Host和Password列中。如果你在GRANT語句中指定全域許可權,這些許可權記錄在記錄的許可權列中。其中要留神的是GRANT語句為你加密口令,而INSERT不是,你需要在INSERT中使用PASSWORD()函數加密口令。

如果你指定資料庫級許可權,使用者名稱和主機名稱被記錄在db表的User和Host列。你為其授權的資料庫記錄在Db列中,你授與權限記錄在許可權列中。

對於表級和列級許可權,效果是類似的。在tables_priv和columns_priv表中建立記錄以記錄使用者名稱、主機名稱和資料庫,還有相關的表和列。授與權限記錄在許可權列中。

如果你還記得前面的介紹,你應該能即使不用GRANT語句也能做GRANT做的事情。記住在你直接修改授權表時,你將通知伺服器重載授權表,否則他不知道你的改變。你可以執行一個mysqladmin flush-privileges或mysqladmin reload命令強迫一個重載。如果你忘記做這個,你會疑惑為什麼伺服器不做你想做的事情。

下列GRANT語句建立一個擁有所有權的超級使用者。包括授權給別人的能力:

GRANT ALL ON *.* TO anyname@localhost IDENTIFIED BY "passwd"
WITH GRANT OPTION
該語句將在user表中為anyname@localhost建立一個記錄,開啟所有許可權,因為這裡是超級使用者(全域)許可權儲存的地方,要用INSERT語句做同樣的事情,語句是:

INSERT INTO user VALUES("localhost","anyname",PASSWORD("passwd"),
"Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y")
你可能發現它不工作,這要看你的MySQL版本。授權表的結構已經改變而且你在你的user表可能沒有14個許可權列。用SHOW COLUMNS找出你的授權表包含的每個許可權列,相應地調整你的INSERT語句。 下列GRANT語句也建立一個擁有超級使用者身份的使用者,但是只有一個單個的許可權:

GRANT RELOAD ON *.* TO flush@localhost IDENTIFIED BY "flushpass"
本例的INSERT語句比前一個簡單,它很容易列出列名並只指定一個許可權列。所有其它列將設定為預設的"N":

INSERT INTO user (Host,Password,Reload) VALUES("localhost","flush",PASSWORD("flushpass"),"Y")
資料庫級許可權用一個ON db_name.*子句而不是ON *.*進行授權:

GRANT ALL ON sample.* TO boris@localhost IDENTIFIED BY "ruby"
這些許可權不是全域的,所以它們不儲存在user表中,我們仍然需要在user表中建立一條記錄(使得使用者能串連),但我們也需要建立一個db表記錄記錄資料庫集許可權:

INSERT INTO user (Host,User,Password) VALUES("localhost","boris",PASSWORD("ruby"))

INSERT INTO db VALUES("localhost","sample_db","boris","Y","Y","Y","Y","Y","Y","N","Y","Y","Y")

"N"列是為GRANT許可權;對末尾的一個資料庫級具有WITH GRANT OPTION的GRANT語句,你要設定該列為"Y"。

要設定表級或列級許可權,你對tables_priv或columns_priv使用INSERT語句。當然,如果你沒有GRANT語句,你將沒有這些表,因為它們在MySQL中同時出現。如果你確實有這些表並且為了某些原因想要手工操作它們,要知道你不能用單獨的列啟用許可權。

你設定tables_priv.Table_priv或columns_priv.Column_priv列來設定包含你想啟用的許可權值。例如,要對一個表啟用SELECT和INSERT許可權,你要在相關的tables_priv的記錄中設定Table_priv為"Select,Insert"。

如果你想對一個擁有MySQL帳號的使用者修改許可權,使用UPDATE而不是INSERT,不管你增加或撤銷許可權都是這樣。要完全刪除一個使用者,從使用者使用的每個表中刪除記錄。

如果你願意避免發一個查詢來直接修改全權表,你可以看一下MySQL內建的mysqlaccess和mysql_setpermissions指令碼。



附錄1 小測驗
在你剛剛新安裝了一個MySQL伺服器,在你增加了一個允許串連MySQL的使用者,用下列語句:

GRANT ALL ON samp_db.* TO fred@*.snake.net IDENTIFIED "cocoa"

而fred碰巧在伺服器主機上有個帳號,所以他試圖串連伺服器:

%mysql -u fred -pcocoa samp_db
ERROR 1045: Access denied for user: 'fred@localhost' (Using password: YES)

為什嗎?

原因是:

先考慮一下mysql_install_db如何建立初始許可權表和伺服器如何使用user表記錄匹配客戶串連。在你用mysql_install_db初始化你的資料庫時,它建立類似這樣的user表:

Host User
localhost
pit.snake.net
localhost
pit.snake.net root
root



頭兩個記錄允許root指定localhost或主機名稱串連本機伺服器,後兩個允許匿名使用者從本地串連。當增加fred使用者後,

Host User
localhost
pit.snake.net
localhost
pit.snake.net
%.snake.net root
root


fred

在伺服器啟動時,它讀取記錄並排序它們(首先按主機,然後按主機上的使用者),越具體越排在前面:

Host User
localhost
localhost
pit.snake.net
pit.snake.net
%.snake.net root

root

fred

有localhost的兩個記錄排在一起,而對root的記錄排在第一,因為它比空值更具體。pit.snake.net的記錄也類似。所有這些均是沒有任何萬用字元的字面上的Host值,所以它們排在對fred記錄的前面,特別是匿名使用者排在fred之前。

結果是在fred試圖從localhost串連時,Host列中的一個空使用者名稱的記錄在包含%.snake.net的記錄前匹配。該記錄的口令是空的,因為預設的匿名使用者沒有口令。因為在fred串連時指定了一個口令,由一個錯配且串連失敗。

這裡要記住的是,雖然用萬用字元指定使用者可以從其串連的主機是很方便。但你從本地主機串連時會有問題,只要你在table表中保留匿名使用者記錄。

一般地,建議你刪除匿名使用者記錄:

mysql> DELETE FROM user WHERE User="";

更進一步,同時刪除其他授權表中的任何匿名使用者,有User列的表有db、tables_priv和columns_priv。

附錄2 使一個新的MySQL安裝更安全
在你自己安裝了一個新的MySQL伺服器後,你需要為MySQL的root使用者指定一個目錄(預設無口令),否則如果你忘記這點,你將你的MySQL處於極不安全的狀態(至少在一段時間內)。

在Unix(Linux)上,在按照手冊的指令安裝好MySQL後,你必須運行mysql_install_db指令碼建立包含授權表的mysql資料庫和初始許可權。在Windows上,運行分發中的Setup程式初始化資料目錄和mysql資料庫。假定伺服器也在運行。

當你第一次在機器上安裝MySQL時,mysql資料庫中的授權表是這樣初始化的:



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。