我创建了一个用户并授予了“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
。你知道原因,还是有办法解决它?
答案 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/
这只是一个想法。