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

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

作 者: 晏子


2.1.3 資料庫和表許可權
下列許可權運用於資料庫和表上的操作。

ALTER
允許你使用ALTER TABLE語句,這其實是一個簡單的第一級許可權,你必須由其他許可權,這看你想對資料庫實施什麼操作。
CREATE
允許你建立資料庫和表,但不允許建立索引。
DELETE
允許你從表中刪除現有記錄。
DROP
允許你刪除(拋棄)資料庫和表,但不允許刪除索引。
INDEX
允許你建立並刪除索引。
REFERENCES
目前不用。
SELECT
允許你使用SELECT語句從表中檢索資料。對不涉及表的SELECT語句就不必要,如SELECT NOW()或SELECT 4/2。
UPDATE
允許你修改表中的已有的記錄。
2.1.4 系統管理權限
下列許可權運用於控制伺服器或使用者授權能力的操作的管理性操作。

FILE
允許你告訴伺服器讀或寫伺服器主機上的檔案。該許可權不應該隨便授予,它很危險,見“迴避授權表風險”。伺服器確實較謹慎地保持在一定範圍內使用該許可權。你只能讀任何人都能讀的檔案。你正在寫的檔案必須不是現存的檔案,這防止你迫使伺服器重寫重要檔案,如/etc/passwd或屬於別人的資料庫的資料目錄。
如果你授權FILE許可權,確保你不以UNIX的root使用者運行伺服器,因為root可在檔案系統的任何地方建立新檔案。如果你以一個非特權使用者運行伺服器,伺服器只能在給使用者能訪問的目錄中建立檔案。

GRANT
允許你將你自己的許可權授予別人,包括GRANT。
PROCESS
允許你通過使用SHOW PROCESS語句或mysqladmin process命令查看伺服器內正在啟動並執行線程(進程)的資訊。這個許可權也允許你用KILL語句或mysqladmin kill命令殺死線程。
你總是能看到或殺死你自己的線程。PROCESS許可權賦予你對任何線程做這些事情的能力。

RELOAD
允許你執行大量的伺服器管理操作。你可以發出FLUSH語句,你也能指性mysqladmin的reload、refresh、flush-hosts、flush-logs、flush-privileges和flush-tables等命令。
SHUTDOWN
允許你用mysqladmin shutdown關閉伺服器。
在user、db和host表中,每一個許可權以一個單獨的列指定。這些列全部聲明為一個ENUM("N","Y")類型,所以每個權的預設值是“N”。在tables_priv和columns_priv中的許可權以一個SET表示,它允許許可權用一個單個列以任何組合指定。這兩個表比其他三個表更新,這就是為什麼它們使用更有效表示方式的原因。(有可能在未來,user、db和host表也用一個SET類型表示。)

在tables_priv表中的Table_priv列被定義成:

SET('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter')
在coloums_priv表中的Column_priv列被定義成: 

SET('Select','Insert','Update','References')
列許可權比表許可權少,因為列級較少的許可權有意義。例如你能建立一個表,但你不能建立一個孤立的列。

user表包含某些在其他授權表不存在的許可權的列:File_priv、Process_priv、Reload_priv和Shutdown_priv。這些許可權運用於你讓伺服器執行的與任何特定資料庫或表不相關的操作。如允許一個使用者根據當前資料庫是什麼來關閉資料庫是毫無意義的。

2.2 伺服器如何控制客戶訪問
在你使用MySQL時,客戶存取控制有兩個階段。第一階段發生在你試圖串連伺服器時。伺服器尋找user表看它是否能找到一個條目匹配你的名字、你正在從那兒串連的主機和你提供的口令。如果沒有匹配,你就不能串連。如果有一個匹配,建立串連並繼續第二階段。在這個階段,對於每一個你發出的查詢,伺服器檢查授權表看你是否有足夠的許可權執行查詢,第二階段持續到你與伺服器對話的結束。

本小節詳細介紹MySQL伺服器用於將授權表條目匹配到來的串連請求或查詢的原則,這包括在授權表範圍列中合法的值的類型、結合授權表中的許可權資訊的方式和表中條目被檢查的次序。

2.2.1 範圍列內容
一些範圍列要求文字值,但它們大多數允許萬用字元或其他特殊值。

Host
一個Host列值可以是一個主機名稱或一個IP地址。值localhost意味著本地主機,但它只在你用一個localhost主機名稱時才匹配,而不是你在使用主機名稱時。假如你的本地主機名稱是pit.snake.net並且在user表中有對你的兩條記錄,一個有一個Host值或localhost,而另一個有pit.snake.net,有localhost的記錄將只當你串連localhost時匹配,其他在只在串連pit.snake.net時才匹配。如果你想讓客戶能以兩種方式串連,你需要在user表中有兩條記錄。

你也可以用萬用字元指定Host值。可以使用SQL的模式字元“%”和“_”並具有當你在一個查詢中使用LIKE算符同樣的含義(不允許regex算符)。 SQL模式字元都能用於主機名稱和IP地址。如%wisc.edu匹配任何wisc.edu域內的主機,而%.edu匹配任何教育學院的主機。類似地,192.168.%匹配任何在192.168 B類子網的主機,而192.168.3.%匹配任何在192.168.3 C類子網的主機。

%值匹配所有主機,並可用於允許一個使用者從任何地方串連。一個空白的Host值等同於%。(例外:在db表中,一個空白Host值含義是“進一步檢查host表”,該過程在“查詢訪問驗證”中介紹。)

從MySQL 3.23起,你也可以指定帶一個表明那些為用於網路地址的網路遮罩的IP地址,如192.168.128.0/17指定一個17位網路地址並匹配其IP地址是192.168128前17位的任何主機。

User
使用者名稱必須是文字的或空白。一個空白值匹配任何使用者。%作為一個User值不意味著空白,相反它匹配一個字面上的%名字,這可能不是你想要的。

當一個到來的串連通過user表被驗證而匹配的記錄包含一個空白的User值,客戶被認為是一個匿名使用者。

Password
口令值可以是空或非空,不允許用萬用字元。一個空口令不意味著匹配任何口令,它意味著使用者必須不指定口令。

口令以一個加密過的值儲存,不是一個字面上的文本。如果你在Password列中儲存一個照字面上的口令,使用者將不能串連!GRANT語句和mysqladmin password命令為你自動加密口令,但是如果你用諸如INSERT、REPLACE、UPDATE或SET PASSWORD等命令,一定要用PASSWORD("new_password")而不是簡單的"new_password"來指定口令。

Db
在columns_priv和tables_priv表中,Db值必須是真正的資料庫名(照字面上),不允許模式和空白。在db和host中,Db值可以以字面意義指定或使用SQL模式字元'%'或'_'指定一個萬用字元。一個'%'或空白匹配任何資料庫。
Table_name,Column_name
這些列中的值必須是照字面意思的表或列名,不允許模式和空白。
某些範圍列被伺服器視為大小寫敏感的,其餘不是。這些原則總結在下表中。特別注意Table_name值總是被看作大小寫敏感的,即使在查詢中的表名的大小寫敏感性對待視伺服器啟動並執行主機的檔案系統而定(UNIX下是大小寫敏感,而Windows不是)。

表3 授權表範圍列的大小寫敏感性

Host
User
Password
Db
Table_name
Column_name
大小寫敏感性
No
Yes
Yes
Yes
Yes
No


2.2.2 查詢訪問驗證
每次你發出一個查詢,伺服器檢查你是否有足夠的許可權執行它,它以user、db、tables_priv和columns_priv的順序檢查,知道它確定你有適當的存取權限或已搜尋所有表而一無所獲。更具體的說:

伺服器檢查user表匹配你開始串連的記錄以查看你有什麼全域許可權。如果你有並且它們對查詢足夠了,伺服器則執行它。
如果你的全域許可權不夠,伺服器為你在db表中尋找並將該記錄中的許可權加到你的全域許可權中。如果結果對查詢足夠,伺服器執行它。
如果你的全域和資料庫級組合的許可權不夠,伺服器繼續尋找,首先在tables_priv表,然後columns_priv表。
如果你在檢查了所有表之後仍無許可權,伺服器拒絕你執行查詢的企圖。
用布爾運算的術語,授權表中的許可權被伺服器這樣使用:

user OR tables_priv OR columns_priv

你可能疑惑為什麼前面的描述只引用4個授權表,而實際上有5個。實際上伺服器是這樣檢查存取權限:

user OR (db AND host) OR tables_priv OR columns_priv

第一個較簡單的運算式是因為host表不受GRANT和REVOKE語句影響。如果你總是用GRANT和REVOKE系統管理使用者許可權,你絕不需要考慮host表。但是其工作原理你用該知道:

當伺服器檢查資料庫級許可權時,它對於客戶尋找db表。如果Host列是空的,它意味著“檢查host表以找出哪一個主機能訪問資料庫”。
伺服器在host表中尋找有與來自db表的記錄相同的Db列值。如果沒有host記錄匹配客戶主機,則沒有授予資料庫級許可權。如果這些記錄的任何一個的確有一個匹配串連的客戶主機的Host



相關文章

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 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。