2008-12-03 115 views
18

對於Web應用程序,當創建將連接到MySQL數據庫的用戶時,您可以選擇特權。假設該用戶想要完成的唯一動作是SELECT/INSERT/UPDATE/DELETE,似乎只提供這些特權是有意義的,但是我從來沒有在任何地方看到推薦 - 推薦和反對的原因是什麼方法?爲MySQL用戶提供最低權限

回答

7

有用戶可能一個普通的應用過程中所需要的,例如其他特權:

  • CREATE TEMPORARY TABLE
  • EXECUTE(存儲過程)
  • 文件(SELECT INTO和LOAD DATA)
  • LOCK TABLES

還有的可能性,最低權限可能僅表示某些表上的SELECT,以及其他表上的SELECT和UPDATE,等等。隨着應用程序功能的增強,這可隨時更改。還有一些奇怪的情況,例如需要在永遠不會查詢的表上具有SELECT特權,因爲它是由UPDATE表中的外鍵引用的。所以跟蹤最小特權是一種皇室的痛苦。

你想通過使用SQL特權來限制什麼?你是編寫所有代碼的人,所以不需要以精細的粒度管理SQL特權。坦率地說,如果你的用戶能夠上傳和運行,你有沒有經過審覈的SQL語句,你有更大的問題:

SELECT * FROM mytable, mytable, mytable, mytable, mytable ORDER BY 1; 

要治理真正的任務不是在數據庫級別,他們是在應用程序業務級別。例如,CMS具有創建頁面,編輯頁面,管理註釋等操作。這些任務的級別高於SQL權限。你可以用SQL角色(它們是特權組)來模擬它們,但是SQL角色並沒有得到廣泛的支持。

我不知道誰他們的應用程序的用戶映射到不同的MySQL用戶。他們是您在應用程序中進行身份驗證的用戶,之後應用程序已連接到數據庫(用戶只是數據庫中的數據行)。

所以你最好讓你的web應用程序使用一個MySQL用戶具有完全權限關閉。

+5

有趣......但似乎瘋了,你應該只給一個用戶完全權限。我在這裏錯過了什麼嗎?爲什麼沒有一個擁有所有數據庫讀寫權限的「Web用戶」?也許不會分鐘。特權,但肯定不是完整的。爲什麼甚至邀請用戶做一個「DROP MyDatabase」的可能性?命令?當然,你的代碼不應該允許執行原始sql ......但會犯錯,而這只是一個較低的級別。 – Armstrongest 2010-01-29 19:03:49

+0

@Atomiton:沒問題,但這意味着需要DDL命令的實際管理任務必須使用不同的DB憑證或至少是不同的角色。但是人們希望將管理界面集成到同一個Web應用程序中。那麼你的應用程序應該使用不同的憑據重新連接到數據庫嗎?還是應該授予WebUser該應用程序的任何用戶所需的權限的聯合,甚至是管理員?我認爲大多數人選擇後者,好或壞。 – 2010-01-29 19:25:25

+0

@ Bill:我想我的管理員用戶只需要一個不同的連接字符串。如果他們以管理員身份登錄,則可以使用更多權限。也許我只是偏執狂。通過管理應用中的權限,我明白你的意思,而且你是對的......它不應該讓用戶受到傷害。但我想這有點像是因爲你鎖上了門而讓你的保險箱解鎖了。有時候,你想念你打開的窗戶。但是,如果保險箱被鎖定,重要的東西仍然是安全的。同樣,鎖定數據庫似乎...好...更安全。請原諒雙關語。 :) – Armstrongest 2010-02-01 07:51:59

3

網絡應用程序通常只使用一個用戶訪問數據庫,而不是按實際用戶帳戶的用戶。應用最小的特權是一種很好的做法。用戶名和密碼將被編碼到您的腳本中(是否有人對此進行了混淆?),因此如果您的腳本管理不當,還是有妥協的餘地。

以我的經驗,我非常,非常很少有應用程序刪除行 - 爲刪除,你就必須進行審計,以標誌好得多一排還有什麼,而不是不知道什麼在那裏!這種方法還有助於優化表和索引。

因此,我建議只允許INSERT,UPDATE和SELECT - 它很快變得明顯,如果需要放鬆了一下你的應用程序的部分!

允許更多的權限只能通過發出資源密集的命令,或允許惡意數據攻擊拓寬了DoS攻擊的可能性。

22

我與比爾不同意在這裏和ATOMIX的思想路線更適合。除非另有說明,否則Bill的答案會極大地增加數據庫受到威脅的風險。

也許對於非常有經驗的開發人員來說,還有其他的安全措施,但是對於其他開發人員而言,如果腳本完全不受限制地訪問數據庫,則無需任何操作。

最小特權原則應該是在這裏使用。對於MySQL,擁有一個具有用於創建表,刪除數據庫等所有權限的超級用戶。理想情況下,在任何PHP文件或Web服務器上的任何文件中都不會看到此用戶名和密碼。 (我使用PHP作爲示例,但它適用於其他Web應用程序)。你只能使用這個用戶名和密碼,像PHPMyAdmin或MySQL Workbench。

然後,PHP腳本,有一個與所需的最低限度,如剛剛INSERT,SELECT,UPDATE,也許不是甚至刪除,這取決於你的PHP腳本。這將在PHP文件中,也就是說,實際上只有一個文件根外的文件,正如大多數人所推薦的那樣。

的原因是這樣的:是的,你並不需要一個MySQL用戶爲每個Web應用程序的用戶。但是最小特權原則(http://en.wikipedia.org/wiki/Principle_of_least_privilege)應該適用。如果您的MySQL超級用戶因爲意外地將您的MySQL連接腳本命名爲.txt而不是.php,或者某人獲得了對Web服務器文件的訪問權限而損害了MySQL超級用戶,至少他們可以執行的操作是「SELECT,UPDATE和INSERT」。 ..儘管可能會導致大問題,但並不像給DROP DATABASE,DROP TABLES和更糟糕的事情那樣糟糕。一個或兩個「非技術」團隊成員直接使用PHPMyAdmin對MySQL數據庫進行直接更改,因此,在我當前的項目中,由於敏捷開發實踐(我不工作,但推薦使用http://www.agilealliance.org/)。這是因爲不需要創建用於簡單直接數據輸入的CMS。在這種情況下,第三個MySQL用戶具有合理的但又一次「恰到好處」的權限適合他們。我們不想用太少的特權來削弱團隊成員,但他們當然不應該意外刪除或改變事情。

由於MySQL沒有角色(如時間原來有人問,每條例草案),則允許任何web腳本只是訪問MySQL只有一個超級用戶是非常危險的。