如何在MySQL中限制其他用户drop root用户?

时间:2015-08-21 09:54:01

标签: mysql privilege

我创建了一个用户并授予了“CREATE USER”权限。我发现用户可以删除任何其他用户包含root。我怎样才能防止这种情况发生?

实际上,我们正在像AWS的RDS一样实现Mysql即服务。我们将创建一个将由系统管理使用的超级用户。我们的客户将拥有另一个拥有大部分权限的用户,包括“创建用户”,以便他们自己管理帐户。我想找出除Mysql正常权限之外的其他方法来获取

如果您有AWS RDS,您会发现RDS有一个'rdsadmin'用户帐户。如果您运行DROP USER'rdsadmin'@'localhost',您将收到错误:ERROR 1396(HY000):对于'rdsadmin'@'localhost',操作DROP USER失败。我很好奇如何实现它。

我尝试在mysq.user表上添加一个触发器,当用户从表中删除'rdsadmin'时抛出错误。但触发器仅适用于DELETE FROM USER ... sql而不适用于DROP USER。你知道原因,还是有办法解决它?

3 个答案:

答案 0 :(得分:0)

无法向指定用户授予权限,CREATE USER是全局权限。

我建议你将MySQL用户分开 - 例如 - 可以有一些:用于管理(具有root权限),用于开发人员(用于访问和更改数据库对象和表数据),等等。 ..

答案 1 :(得分: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上选择priv,这样他们就可以看到程序背后的源代码了解参数

您可以像这样使用数据库API。

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

请注意,root帐户只能删除拥有所有者root @ localhost

的mysql.dropUser的用户

答案 2 :(得分:0)

正如Devart所说,你不能改变CREATE USER的特权。

然而,您似乎正在做的是将mysql实例配置给用户以自行控制。为此,服务器管理工​​具如何。还有很多,包括froxlor Server Management Studio(免费和开源):https://www.froxlor.org/

这只是一个想法。