MySQL创建用户和数据库权限

MySQL创建用户和数据库权限

我正在尝试编写一个简单的 shell 脚本来为该用户创建新的 mysql 用户和数据库。由于我不想使用 mysql root 帐户,因此我创建了一个新用户(我们称他为“创建者”)。我授予了他INSERT, SELECT, UPDATE, CREATE, CREATE USER, GRANT权限,但我无法授予新用户创建数据库的权限。

脚本看起来是这样的:

myuser=creator
mypass=xxxx
dbuser=newuser
dbname=newdb

mysql -u$myuser -p$mypass -rs -e "CREATE USER '$dbuser'@'localhost' IDENTIFIED BY '$dbpass';";
mysql -u$myuser -p$mypass -rs -e "GRANT USAGE ON * . * TO '$dbuser'@'localhost' IDENTIFIED BY '$dbpass' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;";
mysql -u$myuser -p$mypass -rs -e "CREATE DATABASE IF NOT EXISTS $dbname ;";
mysql -u$myuser -p$mypass -rs -e "GRANT ALL PRIVILEGES ON $dbname . * TO '$dbuser'@'localhost';";
mysql -u$myuser -p$mypass -rs -e "FLUSH PRIVILEGES ;";

我得到了ERROR 1044 (42000) at line 1: Access denied for user 'creator'@'localhost' to database 'newdb'。当我以“creator”身份登录时,我得到了相同的错误,这很奇怪,因为“creator”具有 GRANT 权限。那么,“creator”缺少什么权限?我希望他拥有尽可能少的权限。

答案1

这里的问题很简单。看一下事情的顺序:

mysql -u$myuser -p$mypass -rs -e "CREATE USER '$dbuser'@'localhost' IDENTIFIED BY '$dbpass';";
mysql -u$myuser -p$mypass -rs -e "GRANT USAGE ON *. * TO '$dbuser'@'localhost' IDENTIFIED BY '$dbpass' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;";
mysql -u$myuser -p$mypass -rs -e "CREATE DATABASE IF NOT EXISTS $dbname ;";
mysql -u$myuser -p$mypass -rs -e "GRANT ALL PRIVILEGES ON $dbname . * TO '$dbuser'@'localhost';";
mysql -u$myuser -p$mypass -rs -e "FLUSH PRIVILEGES ;";

前三(3)行无法通过 执行,$myuser因为 。必须由超级用户(例如root@localhost)执行前三行。

这里有一些补充:仅root@localhost可以执行FLUSH PRIVILEGES;。但是,这甚至没有必要,因为GRANT命令内部执行FLUSH PRIVILEGES;

考虑到这些因素,您可以按照以下方式创建具有自己的数据库的新用户:

rootuser=root
rootpass=rootpassword
myuser=creator
mypass=xxxx
dbuser=newuser
dbname=newdb

mysql -u$rootuser -p$rootpass -rs -e "CREATE USER '$dbuser'@'localhost' IDENTIFIED BY '$dbpass';";
mysql -u$rootuser -p$rootpass -rs -e "GRANT USAGE ON *.* TO '$dbuser'@'localhost' IDENTIFIED BY '$dbpass' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;";
mysql -u$rootuser -p$rootpass -rs -e "CREATE DATABASE IF NOT EXISTS $dbname ;";
mysql -u$rootuser -p$rootpass -e "GRANT ALL PRIVILEGES ON $dbname . * TO '$dbuser'@'localhost';";

如果您确实不想使用用户root@localhost,请按如下方式创建用户:

步骤 01)root@localhost登录 mysql 并运行

SELECT PASSWORD('creatorpassword');

这将返回一个 41 个字符的类似 MD5 的字符串。

步骤 02)root@localhost登录 mysql 并运行

SET SQL_LOG_BIN=0;
GRANT ALL PRIVILEGES ON *.* to creator@localhost IDENTIFIED BY PASSWORD '41-character MD5-like string';

这将创建用户并设置其密码。第一行SET SQL_LOG_BIN=0只是阻止命令被记录在二进制日志中(如果您启用了二进制日志)。

步骤 03)从 mysql 的审计历史记录中删除命令。

每次登录 mysql 时,命令都会记录在名为的文件中.mysql_history。运行

cd
vi .mysql_history

进入 后vi,运行/SELECT PASSWORD,按回车键。这将使您处于执行从文本打印 PASSWORD 函数的命令的行。只需按ddZZ,您就完成了。

接下来,您可以使用与 root@localhost 相同的权限来使用 creator@localhost,并且您已经很好地隐藏了密码。您只需保持其完整性即可。

答案2

目前,根据以下评论,我认为问题在于用户creator没有尝试授予帐户的权限newuser

根据文档

您不能授予其他用户您自己没有的权限

因此,我理解您希望帐户拥有creator尽可能少的权限,但这不是 MySQL 权限模型的工作方式;要将 newdb 上的 ALL 授予 newuser,创建者还需要 newdb 上的 ALL,以及 GRANT 权限。

相关内容