MySQL Show Grants for ... отличается от mysql.db и information_schema.schema_privileges - PullRequest
1 голос
/ 09 февраля 2012

Я обнаружил разницу между грантами show для user @ host и таблицей mysql.db. Почему это?

Как я могу решить это? Мы беспокоимся о безопасности.

Я запустил шоу-гранты против пользователей в mysql.users. В mysql.users пользователь user@xxx.xxx.xxx.xx и когда я запускаю show grants, он говорит GRANT USAGE TO user@xxx.xxx.xxx.xx

Это беспокоит меня, так как этот пользователь, похоже, также может получить доступ к базе данных.

Когда я смотрю в mysql.db и information_schema.schema_privileges, я вижу того же пользователя, что и пользователь с узлом xxx.xxx.% С полным доступом к этой базе данных.

Что дает?

Редактировать - Более подробное объяснение:

Вот что у меня есть:

show grants for 'myuser'@'xxx.xxx.xxx.xxx';

Возвращает:

GRANT USAGE ON *.* TO 'myuser'@'xxx.xxx.xxx.xxx' IDENTIFIED BY PASSWORD 'xxxxxxxxxxxxxxxxx'

Если я бегу:

select host,db,user from mysql.db where user='myuser';

Я получаю:

+----------+------------+------------+
| host     | db         | user       |
+----------+------------+------------+
|xxx.xxx.% | somedb     | myuser     |
+----------+------------+------------+

1 Ответ

3 голосов
/ 09 февраля 2012

Не волнуйтесь.

Таблица mysql.user смягчает определенные глобальные привилегии для всех баз данных.

Если пользователь ограничен определенной базой данных, вы увидите только специальные разрешения для базы данных в таблице mysql.db. Пользователь, ограниченный базой данных, не нуждается в SUPER, PROCESS, SHUTDOWN и подобных привилегиях.

Если вы создаете пользователя с глобальными привилегиями (таким образом, добавляя пользователя в mysql.user), вы не можете отозвать глобальные привилегии только для того, чтобы понизить пользователя до конкретной базы данных. Если вы попытаетесь сделать это с помощью команд REVOKE, вы увидите пользователя в mysql.user с исходными значениями Y во всех столбцах и того же пользователя в mysql.db со значениями Y в привилегиях для конкретной базы данных.

Вы должны полностью удалить пользователя и создать пользователя заново с более низкими привилегиями.

Вот пример, основанный на комментариях

mysql> show grants for advdb@'%';
+-----------------------------------------------------------------------------+
| Grants for advdb@%                                                          |
+-----------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'advdb'@'%' IDENTIFIED BY PASSWORD '................' |
| GRANT ALL PRIVILEGES ON `advertpro`.* TO 'advdb'@'%'                        |
+-----------------------------------------------------------------------------+

GRANT USAGE просто позволяет вам узнать, какой пароль MD5 связан с аутентификацией (если пароль не пустой). Обратите внимание, что advdb может войти с любого IP-адреса и получить доступ только к базе данных advertpro.

Пользователю не нужны привилегии PROCESS , если вы не хотите, чтобы пользователь видел все процессы в списке процессов, даже те, которые принадлежат другим.

Пользователю не нужны привилегии SUPER , если вы не хотите, чтобы пользователь записывал в доступный только для чтения экземпляр mysql, запускал и останавливал репликацию, записывал двоичные журналы и тому подобное .

Пользователю не нужны привилегии SHUTDOWN , если только вы не хотите, чтобы пользователь отключил mysql от пользователя командной строки ОС клиентской программы mysqladmin.

Чтобы скопировать интересующую вас привилегию,

  • SHOW GRANTS FOR 'user'@'xxx.xxx.xxx.%';
  • Скопировать вывод в текстовый файл
  • Изменить хост на xxx.xxx.xxx.xx
  • Добавить точку с запятой
  • Вставьте это на другой сервер

Хорошо, давайте взломаем это:

UPDATE mysql.db
    SET host='xxx.xxx.xxx.xxx'
    WHERE user='myuser'
    AND host='xxx.xxx.%'
    AND db='somedb';
FLUSH PRIVILEGES;

Это должно быть !!!

Чтобы вывести MySQL Grants в SQL, вы можете сделать pt-show-grants Гораздо лучше перенести гранты mysql, используя pt-show-grants .

Вот мое личное подражание тому, что делает pt-show-grants

mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql
...