国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

MySQL安全性指南(2)

2024-07-24 12:55:20
字體:
供稿:網(wǎng)友

mysql安全性指南(3)    

作 者: 晏子



2.4 不用grant設(shè)置用戶
如果你有一個早于3.22.11的mysql版本,你不能使用grant(或revoke)語句設(shè)置用戶及其訪問權(quán)限,但你可以直接修改授權(quán)表的內(nèi)容。如果你理解grant語句如何修改授權(quán)表,這很容易。那么你通過手工發(fā)出insert語句就能自己做同樣的事情。

當(dāng)你發(fā)出一條grant語句時,你指定一個用戶名和主機(jī)名,可能還有口令。對該用戶生成一個user表記錄,并且這些值記錄在user、host和password列中。如果你在grant語句中指定全局權(quán)限,這些權(quán)限記錄在記錄的權(quán)限列中。其中要留神的是grant語句為你加密口令,而insert不是,你需要在insert中使用password()函數(shù)加密口令。

如果你指定數(shù)據(jù)庫級權(quán)限,用戶名和主機(jī)名被記錄在db表的user和host列。你為其授權(quán)的數(shù)據(jù)庫記錄在db列中,你授予的權(quán)限記錄在權(quán)限列中。

對于表級和列級權(quán)限,效果是類似的。在tables_priv和columns_priv表中創(chuàng)建記錄以記錄用戶名、主機(jī)名和數(shù)據(jù)庫,還有相關(guān)的表和列。授予的權(quán)限記錄在權(quán)限列中。

如果你還記得前面的介紹,你應(yīng)該能即使不用grant語句也能做grant做的事情。記住在你直接修改授權(quán)表時,你將通知服務(wù)器重載授權(quán)表,否則他不知道你的改變。你可以執(zhí)行一個mysqladmin flush-privileges或mysqladmin reload命令強(qiáng)迫一個重載。如果你忘記做這個,你會疑惑為什么服務(wù)器不做你想做的事情。

下列g(shù)rant語句創(chuàng)建一個擁有所有權(quán)的超級用戶。包括授權(quán)給別人的能力:

grant all on *.* to [email protected] identified by "passwd"
    with grant option
該語句將在user表中為[email protected]創(chuàng)建一個記錄,打開所有權(quán)限,因?yàn)檫@里是超級用戶(全局)權(quán)限存儲的地方,要用insert語句做同樣的事情,語句是:

insert into user  values("localhost","anyname",password("passwd"),
    "y","y","y","y","y","y","y","y","y","y","y","y","y","y")
你可能發(fā)現(xiàn)它不工作,這要看你的mysql版本。授權(quán)表的結(jié)構(gòu)已經(jīng)改變而且你在你的user表可能沒有14個權(quán)限列。用show columns找出你的授權(quán)表包含的每個權(quán)限列,相應(yīng)地調(diào)整你的insert語句。 下列g(shù)rant語句也創(chuàng)建一個擁有超級用戶身份的用戶,但是只有一個單個的權(quán)限:

grant reload on *.* to [email protected] identified by "flushpass"
本例的insert語句比前一個簡單,它很容易列出列名并只指定一個權(quán)限列。所有其它列將設(shè)置為缺省的"n":

insert into user (host,password,reload) values("localhost","flush",password("flushpass"),"y")
數(shù)據(jù)庫級權(quán)限用一個on db_name.*子句而不是on *.*進(jìn)行授權(quán):

grant all on sample.* to [email protected] identified by "ruby"
這些權(quán)限不是全局的,所以它們不存儲在user表中,我們?nèi)匀恍枰趗ser表中創(chuàng)建一條記錄(使得用戶能連接),但我們也需要創(chuàng)建一個db表記錄記錄數(shù)據(jù)庫集權(quán)限:

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權(quán)限;對末尾的一個數(shù)據(jù)庫級具有with grant option的grant語句,你要設(shè)置該列為"y"。

要設(shè)置表級或列級權(quán)限,你對tables_priv或columns_priv使用insert語句。當(dāng)然,如果你沒有g(shù)rant語句,你將沒有這些表,因?yàn)樗鼈冊趍ysql中同時出現(xiàn)。如果你確實(shí)有這些表并且為了某些原因想要手工操作它們,要知道你不能用單獨(dú)的列啟用權(quán)限。

你設(shè)置tables_priv.table_priv或columns_priv.column_priv列來設(shè)置包含你想啟用的權(quán)限值。例如,要對一個表啟用select和insert權(quán)限,你要在相關(guān)的tables_priv的記錄中設(shè)置table_priv為"select,insert"。

如果你想對一個擁有mysql賬號的用戶修改權(quán)限,使用update而不是insert,不管你增加或撤銷權(quán)限都是這樣。要完全刪除一個用戶,從用戶使用的每個表中刪除記錄。

如果你愿意避免發(fā)一個查詢來直接修改全權(quán)表,你可以看一下mysql自帶的mysqlaccess和mysql_setpermissions腳本。



附錄1 小測驗(yàn)
在你剛剛新安裝了一個mysql服務(wù)器,在你增加了一個允許連接mysql的用戶,用下列語句:

grant all on samp_db.* to [email protected]*.snake.net identified "cocoa"

而fred碰巧在服務(wù)器主機(jī)上有個賬號,所以他試圖連接服務(wù)器:

%mysql -u fred -pcocoa samp_db
error 1045: access denied for user: '[email protected]' (using password: yes)

為什么?

原因是:

先考慮一下mysql_install_db如何建立初始權(quán)限表和服務(wù)器如何使用user表記錄匹配客戶連接。在你用mysql_install_db初始化你的數(shù)據(jù)庫時,它創(chuàng)建類似這樣的user表:

host user
localhost
pit.snake.net
localhost
pit.snake.net root
root



頭兩個記錄允許root指定localhost或主機(jī)名連接本地服務(wù)器,后兩個允許匿名用戶從本地連接。當(dāng)增加fred用戶后,

host user
localhost
pit.snake.net
localhost
pit.snake.net
%.snake.net root
root


fred

在服務(wù)器啟動時,它讀取記錄并排序它們(首先按主機(jī),然后按主機(jī)上的用戶),越具體越排在前面:

host user
localhost
localhost
pit.snake.net
pit.snake.net
%.snake.net root

root

fred

有l(wèi)ocalhost的兩個記錄排在一起,而對root的記錄排在第一,因?yàn)樗瓤罩蹈唧w。pit.snake.net的記錄也類似。所有這些均是沒有任何通配符的字面上的host值,所以它們排在對fred記錄的前面,特別是匿名用戶排在fred之前。

結(jié)果是在fred試圖從localhost連接時,host列中的一個空用戶名的記錄在包含%.snake.net的記錄前匹配。該記錄的口令是空的,因?yàn)槿笔〉哪涿脩魶]有口令。因?yàn)樵趂red連接時指定了一個口令,由一個錯配且連接失敗。

這里要記住的是,雖然用通配符指定用戶可以從其連接的主機(jī)是很方便。但你從本地主機(jī)連接時會有問題,只要你在table表中保留匿名用戶記錄。

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

mysql> delete from user where user="";

更進(jìn)一步,同時刪除其他授權(quán)表中的任何匿名用戶,有user列的表有db、tables_priv和columns_priv。

附錄2 使一個新的mysql安裝更安全
在你自己安裝了一個新的mysql服務(wù)器后,你需要為mysql的root用戶指定一個目錄(缺省無口令),否則如果你忘記這點(diǎn),你將你的mysql處于極不安全的狀態(tài)(至少在一段時間內(nèi))。

在unix(linux)上,在按照手冊的指令安裝好mysql后,你必須運(yùn)行mysql_install_db腳本建立包含授權(quán)表的mysql數(shù)據(jù)庫和初始權(quán)限。在windows上,運(yùn)行分發(fā)中的setup程序初始化數(shù)據(jù)目錄和mysql數(shù)據(jù)庫。假定服務(wù)器也在運(yùn)行。

當(dāng)你第一次在機(jī)器上安裝mysql時,mysql數(shù)據(jù)庫中的授權(quán)表是這樣初始化的:

你可以從本地主機(jī)(localhost)上以root連接而不指定口令。root用戶擁有所有權(quán)限(包括管理權(quán)限)并可做任何事情。(順便說明,mysql超級用戶與unix超級用戶有相同的名字,他們彼此毫無關(guān)系。)
匿名訪問被授予用戶可從本地連接名為test和任何名字以test_開始的數(shù)據(jù)庫。匿名用戶可對數(shù)據(jù)庫做任何事情,但無管理權(quán)限。
從本地主機(jī)多服務(wù)器的連接是允許的,不管連接的用戶使用一個localhost主機(jī)名或真實(shí)主機(jī)名。如:

% mysql -h localhost test

% mysql -h pit.snake.net test

你以root連接mysql甚至不指定口令的事實(shí)只是意味著初始安裝不安全,所以作為管理員的你首先要做的應(yīng)該是設(shè)置root口令,然后根據(jù)你設(shè)置口令使用的方法,你也可以告訴服務(wù)器重載授權(quán)表是它知道這個改變。(在服務(wù)器啟動時,它重載表到內(nèi)存中而可能不知道你已經(jīng)修改了它們。)

對mysql 3.22和以上版本,你可以用mysqladmin設(shè)置口令:

% mysqladmin -u root password yourpassword

對于mysql的任何版本,你可以用mysql程序并直接修改mysql數(shù)據(jù)庫中的user授權(quán)表:

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

如果你有mysql的老版本,使用mysql和update。

在你設(shè)置完口令后,通過運(yùn)行下列命令檢查你是否需要告訴服務(wù)器重載授權(quán)表:

% mysqladmin -u root status

如果服務(wù)器仍然讓你以root而不指定口令而連接服務(wù)器,重載授權(quán)表:

% mysqladmin -u root reload

在你設(shè)置了root的口令后(并且如果需要重載了授權(quán)表),你將需要在任何時候以root連接服務(wù)器時指定口令。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 松潘县| 大关县| 普宁市| 郧西县| 普宁市| 瓦房店市| 南川市| 灵石县| 临潭县| 长治市| 建瓯市| 凤阳县| 望都县| 岳阳市| 深圳市| 建阳市| 六枝特区| 新安县| 襄汾县| 偃师市| 石首市| 广德县| 五华县| 南康市| 钦州市| 万载县| 徐州市| 永安市| 鄂托克前旗| 万山特区| 凯里市| 顺平县| 天等县| 高邮市| 蓬溪县| 抚顺市| 平和县| 广宁县| 弋阳县| 呼和浩特市| 乌拉特中旗|