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

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

Mysql權(quán)限系統(tǒng)工作原理

2024-07-24 12:56:16
字體:
供稿:網(wǎng)友
權(quán)限系統(tǒng)工作原理
mysql權(quán)限系統(tǒng)保證所有的用戶可以嚴(yán)格地做他們假定被允許做的事情。當(dāng)你連接一個mysql服務(wù)器時, 你的身份由你從那連接的主機和你指定的用戶名來決定,系統(tǒng)根據(jù)你的身份和你想做什么來授予權(quán)限。

mysql在認(rèn)定身份中考慮你的主機名和用戶名字,是因為有很小的原因假定一個給定的用戶在因特網(wǎng)上屬于同一個人。例如,用戶從whitehouse.gov連接的bill不必和從mosoft.com連接bill是同一個人。 mysql通過允許你區(qū)分在不同的主機上碰巧有同樣名字用戶來處理它:你可以對從whitehouse.gov連接授與bill一個權(quán)限集,而為從microsoft.com的連接授予一個不同的權(quán)限集。

mysql存取控制包含2個階段:

階段1:服務(wù)器檢查你是否允許連接。
階段2:假定你能連接,服務(wù)器檢查你發(fā)出的每個請求。看你是否有足夠的權(quán)限實施它。例如,如果你從數(shù)據(jù)庫中一個表精選(select)行或從數(shù)據(jù)庫拋棄一個表,服務(wù)器確定你對表有select權(quán)限或?qū)?shù)據(jù)庫有drop權(quán)限。
服務(wù)器在存取控制的兩個階段使用在mysql的數(shù)據(jù)庫中的user、db和host表,在這些授權(quán)表中字段如下:

表名稱  user  db  host  
范圍字段  host  host  host  
user  db  db  
password  user   
權(quán)限字段  select_priv  select_priv  select_priv  
insert_priv  insert_priv  insert_priv  
update_priv  update_priv  update_priv  
delete_priv  delete_priv  delete_priv  
index_priv  index_priv  index_priv  
alter_priv  alter_priv  alter_priv  
create_priv  create_priv  create_priv  
drop_priv  drop_priv  drop_priv  
grant_priv  grant_priv  grant_priv  
reload_priv    
shutdown_priv    
process_priv    
file_priv    

對存取控制的第二階段(請求證實),如果請求涉及表,服務(wù)器可以另外參考tables_priv和columns_priv表。這些表的字段如下:

表名稱 tables_priv  columns_priv  
范圍字段  host  host  
db  db  
user  user  
table_name  table_name  
  column_name  
權(quán)限字段  table_priv  column_priv  
column_priv   
其他字段  timestamp  timestamp  
grantor   

每個授權(quán)表包含范圍字段和權(quán)限字段。

范圍字段決定表中每個條目的范圍,即,條目適用的上下文。例如, 一個user表條目的host和user值為'thomas.loc.gov'和'bob'將被用于證實來自主機thomas.loc.gov的bob對服務(wù)器的連接。同樣,一個db表條目的host、user和db字段的值是'thomas.loc.gov'、'bob'和'reports'將用在bob從主機聯(lián)接thomas.loc.gov存取reports數(shù)據(jù)庫的時候。 tables_priv和columns_priv表包含范圍字段,指出每個條目適用的表或表/列的組合。

對于檢查存取的用途,比較host值是忽略大小寫的。user、password、db和table_name值是區(qū)分大小寫的。column_name值在mysql3.22.12或以后版本是忽略大小寫的。

權(quán)限字段指出由一個表條目授予的權(quán)限,即,可實施什么操作。服務(wù)器組合各種的授權(quán)表的信息形成一個用戶權(quán)限的完整描述。為此使用的規(guī)則在6.8 存取控制, 階段2:請求證實描述。

范圍字段是字符串,如下所述;每個字段的缺省值是空字符串:

字段名  類型  
host  char(60)  
user  char(16)  
password  char(16)  
db  char(64)  (tables_priv和columns_priv表為char(60))

在user、db和host表中,所有權(quán)限字段被聲明為enum('n','y')--每一個都可有值'n'或'y',并且缺省值是'n'.

在tables_priv和columns_priv表中,權(quán)限字段被聲明為set字段:

表名  字段名  可能的集合成員  
tables_priv  table_priv  'select', 'insert', 'update', 'delete', 'create', 'drop', 'grant', 'references', 'index', 'alter'  
tables_priv  column_priv  'select', 'insert', 'update', 'references'  
columns_priv  column_priv  'select', 'insert', 'update', 'references'  

簡單地說,服務(wù)器使用這樣的授權(quán)表:

user表范圍字段決定是否允許或拒絕到來的連接。對于允許的連接,權(quán)限字段指出用戶的全局(超級用戶)權(quán)限。
db和host表一起使用:
db表范圍字段決定用戶能從哪個主機存取哪個數(shù)據(jù)庫。權(quán)限字段決定允許哪個操作。
當(dāng)你想要一個給定的db條目應(yīng)用于若干主機時,host表作為db表的擴展被使用。例如,如果你想要一個用戶能在你的網(wǎng)絡(luò)從若干主機使用一個數(shù)據(jù)庫,在用戶的db表的host條目設(shè)為空值,然后將那些主機的每一個移入host表。這個機制詳細(xì)描述在6.8 存取控制, 階段2:請求證實。
tables_priv和columns_priv表類似于db表,但是更精致:他們在表和列級應(yīng)用而非在數(shù)據(jù)庫級。
注意管理權(quán)限(reload, shutdown, 等等)僅在user表中被指定。這是因為管理性操作是服務(wù)器本身的操作并且不是特定數(shù)據(jù)庫,因此沒有理由在其他授權(quán)表中列出這樣的權(quán)限。事實上,只需要請教user表來決定你是否執(zhí)行一個管理操作。

file權(quán)限也僅在user表中指定。它不是管理性權(quán)限,但你讀或謝在服務(wù)器主機上的文件的的能力獨立于你正在存取的數(shù)據(jù)庫。

當(dāng)mysqld服務(wù)器啟動時,讀取一次授權(quán)表內(nèi)容。對授權(quán)表的更改生效在6.9 權(quán)限更改何時生效描述。

當(dāng)你修改授權(quán)表的內(nèi)容時,確保你按你想要的方式更改權(quán)限設(shè)置是一個好主意。為幫助診斷問題,見6.13 “存取拒絕引起”錯誤的原因。對于安全問題上的忠告,見6.14 怎么對使mysql安全對抗解密高手。

一個有用的診斷工具是mysqlaccess腳本,由carlier yves 提供給mysql分發(fā)。使用--help選項調(diào)用mysqlaccess查明它怎樣工作。注意:mysqlaccess僅用user、db和host表僅檢查存取。它不檢查表或列級權(quán)限。

6.7 存取控制, 階段1:連接證實
當(dāng)你試圖聯(lián)接一個mysql服務(wù)器時,服務(wù)器基于你的身份和你是否能通過供應(yīng)正確的口令驗證身份來接受或拒絕連接。如果不是,服務(wù)器完全具結(jié)你的存取,否則,服務(wù)器接受連接,然后進(jìn)入階段2并且等待請求。

你的身份基于2個信息:

你從那個主機連接
你的mysql用戶名
身份檢查使用3個user表(host, user和password)范圍字段執(zhí)行。服務(wù)器只有在一個user表條目匹配你的主機名和用戶名并且你提供了正確的口令時才接受連接。

在user表范圍字段可以如下被指定:

一個host值可以是主機名或一個ip數(shù)字,或'localhost'指出本地主機。
你可以在host字段里使用通配符字符“%”和“_”。
一個host值'%'匹配任何主機名,一個空白host值等價于'%'。注意這些值匹配能創(chuàng)建一個連接到你的服務(wù)器的任何主機!
通配符字符在user字段中不允許,但是你能指定空白的值,它匹配任何名字。如果user表匹配到來的連接的條目有一個空白的用戶名,用戶被認(rèn)為是匿名用戶(沒有名字的用戶),而非客戶實際指定的名字。這意味著一個空白的用戶名被用于在連接期間的進(jìn)一步的存取檢查(即,在階段2期間)。
password字段可以是空白的。這不意味著匹配任何口令,它意味著用戶必須不指定一個口令進(jìn)行連接。
非空白password值代表加密的口令。 mysql不以任何人可以看的純文本格式存儲口令,相反,正在試圖聯(lián)接的一個用戶提供的口令被加密(使用password()函數(shù)),并且與存儲了user表中的已經(jīng)加密的版本比較。如果他們匹配,口令是正確的。

下面的例子顯示出各種user表中host和user條目的值的組合如何應(yīng)用于到來的連接:

host 值  user 值  被條目匹配的連接  
'thomas.loc.gov'  'fred'  fred, 從thomas.loc.gov 連接
'thomas.loc.gov'  ''  任何用戶, 從thomas.loc.gov連接  
'%'  'fred'  fred, 從任何主機連接
'%'  ''  任何用戶, 從任何主機連接
'%.loc.gov'  'fred'  fred, 從在loc.gov域的任何主機連接
'x.y.%'  'fred'  fred, 從x.y.net、x.y.com,x.y.edu等聯(lián)接。(這或許無用)
'144.155.166.177'  'fred'  fred, 從有144.155.166.177 ip 地址的主機連接
'144.155.166.%'  'fred'  fred, 從144.155.166 c類子網(wǎng)的任何主機連接

既然你能在host字段使用ip通配符值(例如,'144.155.166.%'匹配在一個子網(wǎng)上的每臺主機),有可能某人可能企圖探究這種能力,通過命名一臺主機為144.155.166.somewhere.com。為了阻止這樣的企圖,mysql不允許匹配以數(shù)字和一個點起始的主機名,這樣,如果你用一個命名為類似1.2.foo.com的主機,它的名字決不會匹配授權(quán)表中host列。只有一個ip數(shù)字能匹配ip通配符值。

一個到來的連接可以被在user表中的超過一個條目匹配。例如,一個由fred從thomas.loc.gov的連接匹配多個條目如上所述。如果超過一個匹配,服務(wù)器怎么選擇使用哪個條目呢?服務(wù)器在啟動時讀入user表后通過排序來解決這個問題,然后當(dāng)一個用戶試圖連接時,以排序的順序瀏覽條目,第一個匹配的條目被使用。

user表排序工作如下,假定user表看起來像這樣:

+-----------+----------+-
| host      | user     | ...
+-----------+----------+-
| %         | root     | ...
| %         | jeffrey  | ...
| localhost | root     | ...
| localhost |          | ...
+-----------+----------+-

當(dāng)服務(wù)器在表中讀取時,它以最特定的host值為先的次序排列('%'在host列里意味著“任何主機”并且是最不特定的)。有相同host值的條目以最特定的user值為先的次序排列(一個空白user值意味著“任何用戶”并且是最不特定的)。最終排序的user表看起來像這樣:

+-----------+----------+-
| host      | user     | ...
+-----------+----------+-
| localhost | root     | ...
| localhost |          | ...
| %         | jeffrey  | ...
| %         | root     | ...
+-----------+----------+-

當(dāng)一個連接被嘗試時,服務(wù)器瀏覽排序的條目并使用找到的第一個匹配。對于由jeffrey從localhost的一個連接,在host列的'localhost'條目首先匹配。那些有空白用戶名的條目匹配連接的主機名和用戶名。('%'/'jeffrey'條目也將匹配,但是它不是在表中的第一匹配。)

這是另外一個例子。假定user桌子看起來像這樣:

+----------------+----------+-
| host           | user     | ...
+----------------+----------+-
| %              | jeffrey  | ...
| thomas.loc.gov |          | ...
+----------------+----------+-

排序后的表看起來像這樣:

+----------------+----------+-
| host           | user     | ...
+----------------+----------+-
| thomas.loc.gov |          | ...
| %              | jeffrey  | ...
+----------------+----------+-

一個由jeffrey從thomas.loc.gov的連接被第一個條目匹配,而一個由jeffrey從whitehouse.gov的連接被第二個匹配。

普遍的誤解是認(rèn)為,對一個給定的用戶名,當(dāng)服務(wù)器試圖對連接尋找匹配時,明確命名那個用戶的所有條目將首先被使用。這明顯不是事實。先前的例子說明了這點,在那里一個由jeffrey從thomas.loc.gov的連接沒被包含'jeffrey'作為user字段值的條目匹配,但是由沒有用戶名的題目匹配!

如果你有服務(wù)器連接的問題,打印出user表并且手工排序它看看第一個匹配在哪兒進(jìn)行。

6.8 存取控制,階段2:請求證實
一旦你建立了一個連接,服務(wù)器進(jìn)入階段2。對在此連接上進(jìn)來的每個請求,服務(wù)器檢查你是否有足夠的權(quán)限來執(zhí)行它,它基于你希望執(zhí)行的操作類型。這正是在授權(quán)表中的權(quán)限字段發(fā)揮作用的地方。這些權(quán)限可以來子user、db、host、tables_priv或columns_priv表的任何一個。授權(quán)表用grant和revoke命令操作。見7.26 grant和revoke 句法。(你可以發(fā)覺參考6.6 權(quán)限系統(tǒng)怎樣工作很有幫助,它列出了在每個權(quán)限表中呈現(xiàn)的字段。)

user表在一個全局基礎(chǔ)上授予賦予你的權(quán)限,該權(quán)限不管當(dāng)前的數(shù)據(jù)庫是什么均適用。例如,如果user表授予你delete權(quán)限, 你可以刪除在服務(wù)器主機上從任何數(shù)據(jù)庫刪除行!換句話說,user表權(quán)限是超級用戶權(quán)限。只把user表的權(quán)限授予超級用戶如服務(wù)器或數(shù)據(jù)庫主管是明智的。對其他用戶,你應(yīng)該把在user表中的權(quán)限設(shè)成'n'并且僅在一個特定數(shù)據(jù)庫的基礎(chǔ)上授權(quán), 使用db和host表。

db和host表授予數(shù)據(jù)庫特定的權(quán)限。在范圍字段的值可以如下被指定:

通配符字符“%”和“_”可被用于兩個表的host和db字段。
在db表的'%'host值意味著“任何主機”,在db表中一個空白host值意味著“對進(jìn)一步的信息咨詢host表”。
在host表的一個'%'或空白host值意味著“任何主機”。
在兩個表中的一個'%'或空白db值意味著“任何數(shù)據(jù)庫”。
在兩個表中的一個空白user值匹配匿名用戶。
db和host表在服務(wù)器啟動時被讀取和排序(同時它讀user表)。db表在host、db和user范圍字段上排序,并且host表在host和db范圍字段上排序。對于user表,排序首先放置最特定的值然后最后最不特定的值,并且當(dāng)服務(wù)器尋找匹配入條目時,它使用它找到的第一個匹配。

tables_priv和columns_priv表授予表和列特定的權(quán)限。在范圍字段的值可以如下被指定:

通配符“%”和“_”可用在使用在兩個表的host字段。
在兩個表中的一個'%'或空白host意味著“任何主機”。
在兩個表中的db、table_name和column_name字段不能包含通配符或空白。
tables_priv和columns_priv表在host、db和user字段上被排序。這類似于db表的排序,盡管因為只有host字段可以包含通配符,但排序更簡單。

請求證實進(jìn)程在下面描述。(如果你熟悉存取檢查的源代碼,你會注意到這里的描述與在代碼使用的算法略有不同。描述等價于代碼實際做的東西;它只是不同于使解釋更簡單。)

對管理請求(shutdown、reload等等),服務(wù)器僅檢查user表條目,因為那是唯一指定管理權(quán)限的表。如果條目許可請求的操作,存取被授權(quán)了,否則拒絕。例如,如果你想要執(zhí)行mysqladmin shutdown,但是你的user表條目沒有為你授予shutdown權(quán)限,存取甚至不用檢查db或host表就被拒絕。(因為他們不包含shutdown_priv行列,沒有這樣做的必要。)

對數(shù)據(jù)庫有關(guān)的請求(insert、update等等),服務(wù)器首先通過查找user表條目來檢查用戶的全局(超級用戶)權(quán)限。如果條目允許請求的操作,存取被授權(quán)。如果在user表中全局權(quán)限不夠,服務(wù)器通過檢查db和host表確定特定的用戶數(shù)據(jù)庫權(quán)限:

服務(wù)器在db表的host、db和user字段上查找一個匹配。 host和user對應(yīng)連接用戶的主機名和mysql用戶名。db字段對應(yīng)用戶想要存取的數(shù)據(jù)庫。如果沒有host和user的條目,存取被拒絕。
如果db表中的條目有一個匹配而且它的host字段不是空白的,該條目定義用戶的數(shù)據(jù)庫特定的權(quán)限。
如果匹配的db表的條目的host字段是空白的,它表示host表列舉主機應(yīng)該被允許存取數(shù)據(jù)庫的主機。在這種情況下,在host表中作進(jìn)一步查找以發(fā)現(xiàn)host和db字段上的匹配。如果沒有host表條目匹配,存取被拒絕。如果有匹配,用戶數(shù)據(jù)庫特定的權(quán)限以在db和host表的條目的權(quán)限,即在兩個條目都是'y'的權(quán)限的交集(而不是并集!)計算。(這樣你可以授予在db表條目中的一般權(quán)限,然后用host表條目按一個主機一個主機為基礎(chǔ)地有選擇地限制它們。)
在確定了由db和host表條目授予的數(shù)據(jù)庫特定的權(quán)限后,服務(wù)器把他們加到由user表授予的全局權(quán)限中。如果結(jié)果允許請求的操作,存取被授權(quán)。否則,服務(wù)器檢查在tables_priv和columns_priv表中的用戶的表和列權(quán)限并把它們加到用戶權(quán)限中。基于此結(jié)果允許或拒絕存取。

用布爾術(shù)語表示,前面關(guān)于一個用戶權(quán)限如何計算的描述可以這樣總結(jié):

global privileges
or (database privileges and host privileges)
or table privileges
or column privileges

它可能不明顯,為什么呢,如果全局user條目的權(quán)限最初發(fā)現(xiàn)對請求的操作不夠,服務(wù)器以后把這些權(quán)限加到數(shù)據(jù)庫、表和列的特定權(quán)限。原因是一個請求可能要求超過一種類型的權(quán)限。例如,如果你執(zhí)行一個insert ... select語句,你就都要insert和select權(quán)限。你的權(quán)限必須如此以便user表條目授予一個權(quán)限而db表條目授予另一個。在這種情況下,你有必要的權(quán)限執(zhí)行請求,但是服務(wù)器不能自己把兩個表區(qū)別開來;兩個條目授予的權(quán)限必須組合起來。

host表能被用來維護(hù)一個“安全”服務(wù)器列表。在tcx,host表包含一個在本地的網(wǎng)絡(luò)上所有的機器的表,這些被授予所有的權(quán)限。

你也可以使用host表指定不安全的主機。假定你有一臺機器public.your.domain,它位于你不認(rèn)為是安全的一個公共區(qū)域,你可以用下列的host表條目子允許除了那臺機器外的網(wǎng)絡(luò)上所有主機的存取:

+--------------------+----+-
| host               | db | ...
+--------------------+----+-
| public.your.domain | %  | ... (所有權(quán)限設(shè)為 'n')
| %.your.domain      | %  | ... (所有權(quán)限設(shè)為 'y')
+--------------------+----+-

當(dāng)然,你應(yīng)該總是測試你在授權(quán)表中的條目(例如,使用mysqlaccess)讓你確保你的存取權(quán)限實際上以你認(rèn)為的方式被設(shè)置。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 隆安县| 凤冈县| 长阳| 揭阳市| 大化| 筠连县| 沙坪坝区| 读书| 南充市| 淳安县| 桂林市| 潜江市| 大连市| 炉霍县| 潼南县| 井陉县| 桐城市| 大同县| 镇安县| 华容县| 沛县| 阿图什市| 开江县| 疏勒县| 平乐县| 高雄县| 湖州市| 眉山市| 宁津县| 耒阳市| 平南县| 梨树县| 响水县| 庄河市| 古丈县| 司法| 滨海县| 谷城县| 平安县| 高邑县| 阳信县|