MySQL приоритет пользователя и хоста - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть два пользователя, давайте назовем их foo для двух разных баз данных:

Database_A:

mysql> select user,host from user where user = 'foo';
+-----------+-----------+
| user      | host      |
+-----------+-----------+
| foo | %         |
| foo | 10.%      |
| foo | localhost |
+-----------+-----------+
3 rows in set (0.01 sec)

Database_B:

mysql> select user,host from user where user = 'foo';
+-----------+-----------+
| user      | host      |
+-----------+-----------+
| foo | %         |
| foo | 10.%      |
| foo | localhost |
+-----------+-----------+
3 rows in set (0.00 sec)

Теперь проблема у меняпри попытке запускается сценарий SQL с командой DROP.Когда я подключаюсь к базе данных на Database_A, я получаю сообщение об ошибке при попытке подключения:

mysql -A -hdatabase_1.foo.bar.domain.com -ufoo -pbar Database_A <dbtables.sql
Warning: Using a password on the command line interface can be insecure.
ERROR 1142 (42000) at line 22: DROP command denied to user 'foo'@'ip-10-128-0-143.ec2.internal' for table 'bar_table'

Я могу запустить это на Database_B без проблем.До сих пор я проверил с правами доступа обоих пользователей и вошел в оболочку MySQL с одним и тем же пользователем и правами доступа (foo@'10.% '), но не могу запустить сценарий SQL для database_1.Вот как выглядят гранты для Database_A и Database_B:

mysql> show grants for foo;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for foo@%                                                                                                                                                                         |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, RELOAD ON *.* TO 'foo'@'%' IDENTIFIED BY PASSWORD '<redacted>' REQUIRE SSL                                                                  |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `reference`.* TO 'foo'@'%' |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> show grants for foo@'10.%';
+------------------------------------------------------------------------------------------------------------+
| Grants for foo@10.%                                                                                  |
+------------------------------------------------------------------------------------------------------------+
| GRANT FILE ON *.* TO 'foo'@'10.%' IDENTIFIED BY PASSWORD '<redacted>' |
+------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Теперь я не могу понять, почему один сервер баз данных будет работать по сравнению с другим (оба настроены одинаково/ пользователь и в my.cnf).Есть ли способ, где я могу войти в систему как foo @ '%'?Я пытаюсь запустить это из удаленного экземпляра EC2 (тот же VPC):

mysql -A -hdatabase_1.foo.bar.domain.com -ufoo -pbar Database_A <dbtables.sql

1 Ответ

0 голосов
/ 05 декабря 2018

Нет, вы не можете принудительно установить соединение как определенный профиль пользователя.MySQL использует первый соответствующий профиль в соответствии с порядком сортировки.

Чтение https://dev.mysql.com/doc/refman/8.0/en/connection-access.html:

Если возможно несколько совпадений, сервер должен определить, какое из них использовать.Эта проблема решается следующим образом:

  • Всякий раз, когда сервер считывает таблицу пользователя в память, он сортирует строки.

  • Когда клиент пытаетсядля подключения сервер просматривает строки в отсортированном порядке.

  • Сервер использует первую строку, соответствующую имени хоста клиента и имени пользователя.

Сервер использует правила сортировки, которые сначала упорядочивают строки с наиболее конкретными значениями хоста.Буквенные имена хостов и IP-адреса являются наиболее конкретными.(Специфика буквального IP-адреса не зависит от того, имеет ли он маску сети, поэтому 198.51.100.13 и 198.51.100.0/255.255.255.0 считаются одинаково специфичными.) Шаблон «%» означает «любой хост» и является наименее специфичным,Пустая строка '' также означает «любой хост», но сортирует после «%».Строки с одним и тем же значением Host упорядочиваются в первую очередь по наиболее специфичным пользовательским значениям (пустое пользовательское значение означает «любой пользователь» и наименее специфично).Для строк с одинаково определенными значениями Host и User порядок недетерминирован.

Я бы не стал давать разные привилегии для одного и того же имени пользователя, отличающиеся только именем хоста.

Несмотря на то, что MySQL позволяет вам определять различные привилегии в зависимости от хоста клиента, управление вашими полномочиями таким образом сбивает с толку.Я никогда не видел веских причин для этого.

Если вам нужен отдельный набор привилегий, определите отдельное имя пользователя.

...