我创建了一个用户并授予了"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。你知道原因吗,或者有什么方法可以解决它?
发布于 2015-08-21 19:20:24
无法向指定用户授予权限,CREATE USER是全局权限。
例如,我建议您将MySQL用户分开--其中可能有一些:用于管理(具有根权限)、用于开发人员(用于访问和更改数据库对象和表数据)等等……
发布于 2015-08-21 22:02:23
您可以通过创建数据库API来解决此问题。SQL代码应该会对您有所帮助。
CREATE TABLE mysql.`created_users` (
`user_name` varchar(255) DEFAULT NULL,
`owner` varchar(255) DEFAULT NULL
)该表保存用户名以及创建它们的用户。注意:使用根帐户创建过程
创建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表的with检查,以确保用户存在并进行delete权限检查。
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');根帐户请注意,根帐户只能删除具有mysql.dropUser且其所有者为root @的用户
发布于 2015-08-21 22:09:09
正如Devart所说,您不能更改CREATE USER的权限。
但是,看起来您正在做的就是将mysql实例提供给用户,让他们自己控制。为此,我们来看看服务器管理工具。有很多,包括froxlor服务器管理工作室(免费和开源):https://www.froxlor.org/
这只是一个想法。
https://stackoverflow.com/questions/32137462
复制相似问题