Я дал своему пользователю 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;
команда.
У вас должна быть возможность создать сценарий для добавления всех привилегий на уровне таблицы, а не создавать их все вручную.