重新分配主机访问权限给 MySQL 用户

我有几千个 MySQL 用户都设置为允许从特定的主机访问。问题是现在我将有两台机器(将来还会有) ,它们需要使用相同的帐户来访问它们的每个数据库。

我希望有一种快速、简单(尽可能自动化)的方法来遍历和修改每个用户帐户的主机部分,以适应内部网络通配符。例如:

“ bugsy”@“ interalfoo”可以访问“ bugsy”数据库。

现在我想允许从内部网络的任何地方进行繁忙的访问

“ bugsy”@“10.0.0.%”可以访问“ bugsy”数据库。

133553 次浏览

我从来没有这样做过,所以对此持保留态度,并且“测试,测试,测试”。

如果(在一个安全控制的测试环境中)您直接修改 mysql.user和可能是 mysql.db表中的 Host列,会发生什么情况?(例如,带有 update语句)我不认为 MySQL 使用用户的主机作为密码编码的一部分(PASSWORD函数并不建议这样做) ,但是您必须尝试一下才能确定。您可能需要发出 FLUSH PRIVILEGES命令(或停止并重新启动服务器)。

对于某些存储引擎(例如,MyISAM) ,您可能还需要检查/修改用户创建的任何视图的 .frm文件。.frm文件存储定义器,包括定义器的主机。(在错误配置导致记录错误主机的主机之间移动数据库时,我 必须这样做...)

作为参考,解决方案是:

UPDATE mysql.user SET host = '10.0.0.%' WHERE host = 'internalfoo' AND user != 'root';
UPDATE mysql.db SET host = '10.0.0.%' WHERE host = 'internalfoo' AND user != 'root';
FLUSH PRIVILEGES;

更笼统的答案是

UPDATE mysql.user SET host = {newhost} WHERE user = {youruser}

接受的答案只是重命名了用户,但是留下了特权。

我建议使用:

RENAME USER 'foo'@'1.2.3.4' TO 'foo'@'1.2.3.5';

根据 MySQL 文档:

RENAME USER 使旧用户拥有的权限与新用户拥有的权限相同。

类似的问题,我获取权限失败。在我的设置,我 SSH 只。所以我纠正这个问题的方法是

sudo MySQL
SELECT User, Host FROM mysql.user WHERE Host <> '%';
MariaDB [(none)]> SELECT User, Host FROM mysql.user WHERE Host <> '%';
+-------+-------------+
| User  | Host        |
+-------+-------------+
| root  | 169.254.0.% |
| foo   | 192.168.0.% |
| bar   | 192.168.0.% |
+-------+-------------+
4 rows in set (0.00 sec)

我需要这些用户移动到“ localhost”:

UPDATE mysql.user SET host = 'localhost' WHERE user = 'foo';
UPDATE mysql.user SET host = 'localhost' WHERE user = 'bar';

再次运行 SELECT User,Host FROM mysql.User WHERE Host < >’%’; 我们看到:

MariaDB [(none)]> SELECT User, Host FROM mysql.user WHERE Host <> '%';
+-------+-------------+
| User  | Host        |
+-------+-------------+
| root  | 169.254.0.% |
| foo   | localhost   |
| bar   | localhost   |
+-------+-------------+
4 rows in set (0.00 sec)

然后我又可以正常工作了,希望这对某些人有帮助。

$ mysql -u foo -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 74
Server version: 10.1.23-MariaDB-9+deb9u1 Raspbian 9.0


Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


MariaDB [(none)]>

我在 RENAME USER中收到了同样的错误,当前接受的解决方案不包括 Grant:

最可靠的方法似乎是为老用户运行 SHOW GRANTS,找到/替换您想要更改的关于用户名和/或主机的内容,然后运行它们,最后为老用户运行 DROP USER。不要忘记运行 FLUSH PRIVILEGES(最好在添加新用户的授权之后运行它,测试新用户,然后删除旧用户并再次刷新以获得更好的效果)。

> SHOW GRANTS FOR 'olduser'@'oldhost';
+-----------------------------------------------------------------------------------+
| Grants for olduser@oldhost                                                        |
+-----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'olduser'@'oldhost' IDENTIFIED BY PASSWORD '*PASSHASH'      |
| GRANT SELECT ON `db`.* TO 'olduser'@'oldhost'                                     |
+-----------------------------------------------------------------------------------+
2 rows in set (0.000 sec)


> GRANT USAGE ON *.* TO 'newuser'@'newhost' IDENTIFIED BY PASSWORD '*SAME_PASSHASH';
Query OK, 0 rows affected (0.006 sec)


> GRANT SELECT ON `db`.* TO 'newuser'@'newhost';
Query OK, 0 rows affected (0.007 sec)


> DROP USER 'olduser'@'oldhost';
Query OK, 0 rows affected (0.016 sec)