首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MySQL中限制其他用户drop root用户?

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

Stack Overflow用户
提问于 2015-08-21 17:54:01
回答 3查看 856关注 0票数 1

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

实际上,我们将Mysql作为服务来实现,就像AWS的RDS一样。我们将创建一个超级用户,供系统管理使用。我们的客户将有另一个用户,其中包括“创建用户”的大部分特权,以便他们可以管理自己的帐户。我想找出一种不同于Mysql普通权限的方法来实现这一点

如果您有AWS RDS,您会发现RDS有一个'rdsadmin‘用户帐户。如果对'rdsadmin'@'localhost‘运行DROP USER 'rdsadmin'@'localhost’,则会收到错误: ERROR 1396 (HY000):Operation DROP USER failed for‘rdsadmin’@‘localhost’。我很好奇如何实现这一点。

我尝试在mysq.user表上添加触发器,以便在用户从表中删除'rdsadmin‘时抛出错误。但是触发器只适用于DELETE FROM USER ... sql,而不适用于DROP USER。你知道原因吗,或者有什么方法可以解决它?

EN

回答 3

Stack Overflow用户

发布于 2015-08-21 19:20:24

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

例如,我建议您将MySQL用户分开--其中可能有一些:用于管理(具有根权限)、用于开发人员(用于访问和更改数据库对象和表数据)等等……

票数 1
EN

Stack Overflow用户

发布于 2015-08-21 22:02:23

您可以通过创建数据库API来解决此问题。SQL代码应该会对您有所帮助。

代码语言:javascript
复制
CREATE TABLE mysql.`created_users` (
  `user_name` varchar(255) DEFAULT NULL,
  `owner` varchar(255) DEFAULT NULL
)

该表保存用户名以及创建它们的用户。注意:使用根帐户创建过程

创建mysql用户的过程。

代码语言:javascript
复制
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表的with检查,以确保用户存在并进行delete权限检查。

代码语言:javascript
复制
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 ;

并赋予执行这些命令的权限

代码语言:javascript
复制
GRANT EXECUTE ON PROCEDURE mysql.createUser TO '[user]'@'localhost';
GRANT EXECUTE ON PROCEDURE mysql.dropUser TO '[user]'@'localhost';

您可能想让用户在mysql.proc上选择priv,这样他们就可以看到过程背后的源代码并知道参数

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

代码语言:javascript
复制
CALL mysql.createUser('user', 'password');
CALL mysql.dropUser('user');

根帐户请注意,根帐户只能删除具有mysql.dropUser且其所有者为root @的用户

票数 1
EN

Stack Overflow用户

发布于 2015-08-21 22:09:09

正如Devart所说,您不能更改CREATE USER的权限。

但是,看起来您正在做的就是将mysql实例提供给用户,让他们自己控制。为此,我们来看看服务器管理工具。有很多,包括froxlor服务器管理工作室(免费和开源):https://www.froxlor.org/

这只是一个想法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32137462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档