mysql 網路安全性 MySQL安全性指南(3)

2021-10-18 02:20:46 字數 4845 閱讀 2801

2.4 不用grant設定使用者

當你發出一條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資料庫中的授權表是這樣初始化的:

你可以從本地主機(localhost)上以root連線而不指定口令。root使用者擁有所有許可權(包括管理許可權)並可做任何事情。(順便說明,mysql超級使用者與unix超級使用者有相同的名字,他們彼此毫無關係。)

匿名訪問被授予使用者可從本地連線名為test和任何名字以test_開始的資料庫。匿名使用者可對資料庫做任何事情,但無管理許可權。

從本地主機多伺服器的連線是允許的,不管連線的使用者使用乙個localhost主機名或真實主機名。如:

% mysql -h localhost test

% mysql -h pit.snake.net test

你以root連線mysql甚至不指定口令的事實只是意味著初始安裝不安全,所以作為管理員的你首先要做的應該是設定root口令,然後根據你設定口令使用的方法,你也可以告訴伺服器過載授權表是它知道這個改變。(在伺服器啟動時,它過載表到記憶體中而可能不知道你已經修改了它們。)

對mysql 3.22和以上版本,你可以用mysqladmin設定口令:

% mysqladmin -u root password yourpassword

對於mysql的任何版本,你可以用mysql程式並直接修改mysql資料庫中的user授權表:

% mysql -u root mysql

mysql>update user set password=password("yourpassword") where user="root";

在你設定完口令後,通過執行下列命令檢查你是否需要告訴伺服器過載授權表:

% mysqladmin -u root status

如果伺服器仍然讓你以root而不指定口令而連線伺服器,過載授權表:

% mysqladmin -u root reload

在你設定了root的口令後(並且如果需要過載了授權表),你將需要在任何時候以root連線伺服器時指定口令。

mysql 網路安全性 MySQL安全性指南(1)

作為乙個mysql的系統管理員,你有責任維護你的mysql資料庫系統的資料安全性和完整性。本文主要主要介紹如何建立乙個安全的mysql系統,從系統內部和外部網路兩個角度,為你提供乙個指南。為什麼安全性很重要,你應該防範那些攻擊?伺服器面臨的風險 內部安全性 如何處理?連線伺服器的客戶端風險 外部安全...

mysql安全性試驗 Mysql安全性測試

一 沒有進行預處理的sql語句 1.連線資料庫 conn mysql connect 127.0.0.1 3306 root 518666 if conn die could not connect mysql error 2.選擇資料庫 mysql select db mysql safe con...

mysql 安全性語言實驗 MySQL安全性語言

實驗2 安全性語言 安全性實驗包含兩個實驗專案,其中1個為必修,1個為選修。自主訪問控制實驗為設計型實驗專案,審計實驗為驗證型實驗專案,選做乙個即可。實驗2.1自主訪問控制實驗 1 實驗目的 掌握自主訪問控制許可權的定義和維護方法。2 實驗內容和要求 定義使用者 角色,分配許可權給使用者 角色,許可...