Переназначить права доступа к хосту пользователю MySQL
У меня есть несколько тысяч пользователей MySQL, настроенных для разрешения доступа с определенного хоста. Проблема в том, что теперь у меня будет две машины (в будущем будет больше), которым потребуется доступ к одной и той же учетной записи для доступа к каждой из их баз данных.
Мне нужен быстрый и простой (как можно более автоматизированный) способ просмотра и изменения части узла каждой учетной записи пользователя в соответствии с подстановочным знаком внутренней сети. Например:
"bugsy" @ "internalfoo" имеет доступ к базе данных "bugsy".
Я хочу теперь разрешить ошибочный доступ из любой точки внутренней сети
'bugsy'@'10.0.0.%' имеет доступ к базе данных 'bugsy'.
5 ответов
Для справки, решение:
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;
Принятый ответ только переименовал пользователя, но привилегии остались позади.
Я бы порекомендовал использовать:
RENAME USER 'foo'@'1.2.3.4' TO 'foo'@'1.2.3.5';
Согласно документации MySQL:
RENAME USER приводит к тому, что привилегии, принадлежащие старому пользователю, будут теми привилегиями, которые принадлежат новому пользователю.
Более общий ответ
UPDATE mysql.user SET host = {newhost} WHERE user = {youruser}
Подобная проблема, где я получаю разрешения не удалось. На моей установке я только в 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)
Мне нужно, чтобы эти пользователи были перемещены в "lo calhost". Поэтому я выпустил следующее:
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)]>
Я не должен был этого делать, так что возьмите это с крошкой соли и большой помощью "тест, тест, тест".
Что произойдет, если (в безопасной контролируемой тестовой среде) вы напрямую измените Host
столбец в mysql.user
и, вероятно, mysql.db
таблицы? (Например, с update
заявление.) Я не думаю, что MySQL использует хост пользователя как часть кодировки пароля (PASSWORD
функция не предлагает это), но вам придется попробовать это, чтобы быть уверенным. Вам может понадобиться оформить FLUSH PRIVILEGES
команда (или остановите и перезапустите сервер).
Для некоторых механизмов хранения (например, MyISAM) вам может потребоваться проверить / изменить .frm
сохраните любые виды, созданные пользователем. .frm
В файле хранится определитель, включая хост определителя. (Я должен был сделать это при перемещении баз данных между хостами, где произошла неправильная конфигурация, в результате которой был записан неправильный хост...)
Я получил ту же ошибку с RENAME USER
и ГРАНТЫ не охватываются принятым в настоящее время решением:
Самый надежный способ - бежать SHOW GRANTS
для старого пользователя найдите / замените то, что вы хотите изменить в отношении имени пользователя и / или хоста, и запустите их, а затем, наконец, DROP USER
старый пользователь. Не забывая бежать FLUSH PRIVILEGES
(лучше всего запускать это после добавления грантов новых пользователей, протестировать нового пользователя, затем удалить старого пользователя и сбросить его для правильной оценки).
> ПОКАЗАТЬ ГРАНТЫ ДЛЯ 'olduser'@'oldhost'; +-----------------------------------------------------------------------------------+ | Гранты для olduser@oldhost | +-----------------------------------------------------------------------------------+ | ИСПОЛЬЗОВАНИЕ ПОЛЬЗОВАТЕЛЯ НА *.* ДЛЯ 'olduser' @ 'oldhost', ОПРЕДЕЛЯЕМОГО ПАРОЛЕМ * *PASSHASH' | | GRANT SELECT ON `db`.* TO 'olduser'@'oldhost' | +-----------------------------------------------------------------------------------+ 2 ряда в наборе (0,000 с) > GRANT USAGE ON *.* TO 'newuser'@'newhost' ИДЕНТИФИЦИРОВАНО ПАРОЛЕМ * *SAME_PASSHASH'; Запрос в порядке, затронуто 0 строк (0,006 с) > GRANT SELECT ON `db`.* TO 'newuser'@'newhost'; Запрос в порядке, затронуто 0 строк (0,007 с) > DROP USER 'olduser'@'oldhost'; Запрос в порядке, затронуто 0 строк (0,016 с)