2015-08-21 57 views
0

我創建了一個用戶並授予了「CREATE USER」權限。我發現用戶可以刪除任何其他用戶包括根。我如何防止這種情況發生?如何限制其他用戶在MySQL中刪除root用戶?

其實我們正在實施MySQL作爲就像AWS的RDS服務。我們將創建一個超級用戶,供系統管理人員使用。我們的客戶將擁有擁有大部分權限的其他用戶,包括「創建用戶」,以便他們可以自行管理帳戶。我想找出比MySQL正常權限之外的方法來獲取

如果你有AWS RDS,你會發現RDS有一個「rdsadmin」用戶帳戶。如果您運行DROP USER'rdsadmin'@'localhost',您將收到錯誤:錯誤1396(HY000):操作DROP USER'rdsadmin'@'localhost'失敗。我很好奇如何實現這一點。

我試過mysq.user表中添加觸發器拋出一個錯誤,當用戶從表中刪除「rdsadmin」。但觸發器只適用於DELETE FROM USER ... sql不適用於DROP USER。你知道原因嗎,還是有什麼辦法解決它?

+0

這可能會幫助你。 https://dev.mysql.com/doc/refman/5.1/en/grant.html –

+0

我知道「CREATE USER」是一個全局特權。實際上,我們正在像AWS的RDS一樣實施Mysql作爲服務。我們將創建一個超級用戶,供系統管理人員使用。我們的客戶將擁有擁有大部分權限的其他用戶,包括「創建用戶」,以便他們可以自行管理帳戶。我想找到一種除了Mysql普通特權以外的方法來獲取它。 – user3752700

+0

如果您有AWS RDS,您會發現RDS具有'rdsadmin'用戶帳戶。如果你運行'DROP USER'rdsadmin'@'localhost'',你會得到一個錯誤:'ERROR 1396(HY000):DROP USER操作'rdsadmin'@'localhost''操作失敗。我很好奇如何實現這一點。 – user3752700

回答

0

這是不可能的權限授予指定的用戶,CREATE USER是一個全球性的特權。我建議你分開MySQL用戶,例如 - 可以有一些:用於管理(具有root權限),用於開發人員(用於訪問和更改數據庫對象和表數據),等等...

+0

是的,我知道「CREATE USER」是一個全局特權。實際上,我們正在像AWS的RDS一樣實施Mysql作爲服務。我們將創建一個超級用戶,供系統管理人員使用。我們的客戶將擁有擁有大部分權限的其他用戶,包括「創建用戶」,以便他們可以自行管理帳戶。我想找到一種除了Mysql普通特權以外的方法來獲取它。 – user3752700

+1

也許你可以在你的應用程序中這樣做,如果你不允許用戶訪問MySQL並且只能從你的工具管理服務器。 – Devart

+0

@ user3752700:我相信你應該編輯問題以包含剛剛提供的場景描述。我同意Devart的建議 - 使用儀表板來管理用戶是有意義的,因此您不需要將CREATE/DROP USER權限授予任何其他人。 – jweyrich

0

您可以通過創建一個數據庫API周圍使用本作品。 SQL代碼應該可以幫到你。

CREATE TABLE mysql.`created_users` (
    `user_name` varchar(255) DEFAULT NULL, 
    `owner` varchar(255) DEFAULT NULL 
) 

該表保存用戶名和用戶創建它們。 注意使用您的root帳戶創建過程

創建mysql用戶的過程。

DROP PROCEDURE IF EXISTS mysql.createUser; 

DELIMITER // 
CREATE PROCEDURE mysql.createUser(IN userName VARCHAR(255), IN userPassword VARCHAR(255)) 
BEGIN 

    SET @createUserQuery = CONCAT(' 
     CREATE USER "',userName,'"@"localhost" IDENTIFIED BY "',userPassword,'" ' 
     ); 
    PREPARE stmt FROM @createUserQuery; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 


    SET @createcreatedUserQuery = CONCAT(' 
     INSERT INTO mysql.created_users (user_name, owner) VALUE("',userName,'", "',USER(),'")' 
     ); 
    PREPARE stmt FROM @createcreatedUserQuery; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

END // 
DELIMITER ; 

程序丟棄並檢查created_users表以確保用戶存在並刪除權限檢查。

DROP PROCEDURE IF EXISTS mysql.dropUser; 

DELIMITER // 
CREATE PROCEDURE mysql.dropUser(IN userName VARCHAR(255)) 
BEGIN 

    SET @canDeleteUser = 0; 

    SET @createCountUserQuery = CONCAT(' 
     SELECT COUNT(*) FROM mysql.created_users WHERE user_name = "',userName,'" AND owner = "',USER(),'" INTO @canDeleteUser' 
     ); 

    PREPARE stmt FROM @createCountUserQuery; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 

    IF @canDeleteUser = 0 THEN 

     SIGNAL SQLSTATE '45000' 
     SET MESSAGE_TEXT = 'The user is not known on the server or you dont have rights to delete this user'; 
    END IF; 

    IF @canDeleteUser = 1 THEN 
     SET @createDropUserQuery = CONCAT(' 
     DROP USER "',userName,'"@"localhost"' 
     ); 
     PREPARE stmt FROM @createDropUserQuery; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 

     SET @createDeleteUserQuery = CONCAT(' 
     DELETE FROM created_users WHERE user_name = "',userName,'" AND owner = "',USER(),'"' 
     ); 
     PREPARE stmt FROM @createDeleteUserQuery; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt;  
    END IF; 

END // 
DELIMITER ; 

並賦予權利執行這些

GRANT EXECUTE ON PROCEDURE mysql.createUser TO '[user]'@'localhost'; 
GRANT EXECUTE ON PROCEDURE mysql.dropUser TO '[user]'@'localhost'; 

而且你可能想給用戶選擇上mysql.proc的私法這樣他們就可以看到後面的程序源代碼,並知道參數

您可以像這樣使用數據庫API。

CALL mysql.createUser('user', 'password'); 
CALL mysql.dropUser('user'); 

需要注意的是root帳戶只能刪除用戶有業主根@本地

+0

謝謝。這是一種方式。但是我希望我的客戶通過標準SQL「DROP USER」和「DROP USER」管理數據庫。如果您有AWS RDS,您會發現數據庫中存在'rdsadmin'。您可以創建或刪除任何用戶。但是,如果您運行DROP USER'rdsadmin'@'localhost'',您會看到一個錯誤:'ERROR 1396(HY000):DROP USER'rdsadmin'@'localhost''操作失敗。我很好奇如何實現這一點。 – user3752700

0

作爲Devart說mysql.dropUser,你不能改變CREATE USER特權。

然而,看起來像什麼,你正在做的是供應的MySQL實例展現給用戶,以控制自己。爲此,服務器管理工​​具如何?有很多,包括froxlor服務器管理工​​作室(這是免費和開源):https://www.froxlor.org/

這只是一個想法。

相關問題