Назад | Перейти на главную страницу

Как я могу изменить своего пользователя mysql, у которого есть все привилегии в базе данных, чтобы иметь только привилегии выбора для одной конкретной таблицы?

Я дал своему пользователю mysql режим «ПРЕДОСТАВИТЬ ВСЕ ПРИВИЛЕГИИ НА имя_базы_данных. * Для my_user @ localhost». Теперь я хотел бы быть более детальным, начиная с снижения привилегий для конкретной таблицы.

Я надеюсь, что mysql имеет или может быть настроен так, чтобы следовать политике «наименьшего количества привилегий», поэтому я могу сохранить текущую настройку и уменьшить ее для одной таблицы. Но я не видел ничего подобного ни в документации, ни в Интернете.

Есть ли способ получить тот же результат, добавив другое правило, кроме удаления предоставления уровня БД и повторного предоставления на уровне таблицы?

Все привилегии в MySQL аддитивны; нет понятия субтрактивной привилегии.

Вы должны удалить GRANT ALL ON db.* ... и назначьте требуемые разрешения на уровне детализированной таблицы.

Имейте в виду, что у вас очень широкий набор привилегий доступный вам в MySQL. Возможно, вы могли бы начать с уровня базы данных GRANT SELECT который предоставит вашему пользователю доступ только для чтения. Затем вы можете выборочно добавлять деструктивные привилегии для каждой таблицы в соответствии с вашими потребностями.

К сожалению, если у пользователя уже есть привилегии уровня базы данных, запускается revoke all on db.table from user@host; не создает для вас все существующие привилегии на уровне таблицы (кроме той, которую вы отменяете).

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

MySQL сохраняет свои привилегии в разных таблицах в mysql база данных в зависимости от того, для какого контекста предназначена привилегия.

  • Если вы предоставите привилегию на *.* это идет в mysql.User стол.
  • Если вы предоставите привилегию на db.* это идет в mysql.db стол.
  • Если вы предоставите привилегию на db.table это идет в mysql.tables_priv стол.
  • Если вы предоставите привилегии столбца на db.table это идет в mysql.columns_priv стол.

Таким образом, выполнение последнего отзыва ниже удаляет только записи из db таблицу и оставляет все, что уже было в tables_priv стол.

Пример: у пользователя уже есть это:

mysql> grant all on db.* to user@host;

Вы запускаете это:

mysql> grant all on db.table1 to user@host;
mysql> grant all on db.table2 to user@host;
mysql> grant all on db.table3 to user@host;
mysql> grant all on db.table4 to user@host;
mysql> revoke all on db.* from user@host;

Пользователь сможет получить доступ db.table5 прямо до тех пор, пока вы не запустите эту команду revoke. У пользователя будет доступ к четырем другим таблицам как до, так и после отзыва.

Исключением из этого правила (всегда есть исключение) являются привилегии столбца. Если вы предоставите привилегии столбца пользователю, у которого уже есть привилегии уровня таблицы в той же таблице, они будут существовать в columns_priv таблица, но не будет отображаться в show grants команда и исчезнет, ​​если вы запустите revoke ... on db.table from user@host; команда.

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