2016-05-12 151 views
1

我們最近從SQL Server切換到MySQL用於新項目,並且我仍然努力爭取讓自己的頭腦安全模型。具有清除權限的MySQL用戶仍然可以訪問數據庫

我們的應用程序中有一個名爲MyApplicationUser的MySQL用戶。爲了方便起見,當我第一次開發這個應用程序時,我給了用戶我認爲是必需的特權。

GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON MyApplication.* TO 'MyApplicationUser'@'%'; 

而且它似乎工作,所以我沒有想到更多關於它。在某些時候,我調整了這個列表,這樣用戶也可以創建索引,儘管我不能再記得我曾經這樣做過的代碼。

作爲安全審計的一部分,我認爲將這些權限僅限於用戶實際需要的權限是明智的。所以我查了一下它的運行情況:

select * from information_schema.user_privileges where grantee like '%MyApplicationUser%'; 

其中有一個相當長的名單。然後,我跑到下面的代碼:

REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'MyApplicationUser'@'%'; 
GRANT SELECT, INSERT, EXECUTE, UPDATE ON MyApplication.* TO 'MyApplicationUser'@'%';  
FLUSH PRIVILEGES; 

現在,當我從user_privileges運行選擇我只得到一個行 - 用法。文檔說這只是基本的使用權限。所以看起來我的GRANT命令沒有起作用。更令人震驚的是,當我運行應用程序時,它似乎仍然具有讀取和更改數據的能力 - 表明該帳戶擁有除user_privileges中列出的權限以外的權限。

我試過重新啓動MySQL服務以確保它「新鮮」,但用戶仍然有權限訪問應用程序。

試圖爲「MyApplicationUser」運行秀補助@「%」似乎表明先前執行GRANT語句列表,不包括我的初步GRANT:

GRANT USAGE ON *.* TO 'MyApplicationUser'@'%' 
GRANT SELECT, INSERT, UPDATE, EXECUTE ON `dataportal`.* TO 'MyApplicationUser'@'%' 

所以:我怎麼能找出什麼特權我的MyApplicationUser帳戶實際上有?如果它真的只是用法,那麼應用程序如何繼續工作?顯示授權與user_privileges有什麼不同?

回答

1

首先,您必須確保您的應用程序不再連接到數據庫服務器。

檢查以確保您的應用程序已停止。 要確信,請將您的服務器與網絡斷開連接。 另外,請確保您在執行這些操作時使用root帳戶。

然後執行以下步驟:

  • 重啓MySQL服務
  • 執行取消所有權限,然後FLUSH
  • 授予相應的權限,以您的用戶然後刷新一次
  • 運行SELECT * FROM mysql.user

檢查priv標有'Y'的斜角,然後與您得到的結果進行比較 SELECT * FROM INFORMATION_SCHEMA.USER_PRIVILEGES WHERE GRANTEE LIKE '%MYAPPLICATIONUSER%';

作爲最後的手段,您可能必須刪除用戶並使用適當的權限重新創建它。

1

所以:我如何知道MyApplicationUser帳戶實際上擁有哪些權限?

我認爲你可以使用這個

use mysql 
select * from user where user = 'username';