1

Я устанавливаю mysql на Ubuntu. Я поставил пользователя root как администратор и создал нового пользователя для не-администратора.

CREATE USER 'user'@'localhost' IDENTIFIED BY '';
GRANT ALTER,CREATE,CREATE VIEW,DELETE,DROP,INDEX,INSERT,REFERENCES,RELOAD,SELECT,SHOW DATABASES,SHOW VIEW,TRIGGER,UPDATE ON *.* TO 'user'@'localhost';

Но, оказывается, этот обычный пользователь имеет доступ (буквально) к базе данных mysql . Который содержит пользовательскую таблицу. Таким образом, я могу изменять других пользователей, даже используя не-администратора.

mysql> DELETE FROM mysql.user WHERE User = "otheruser";
Query OK, 1 row affected (0,03 sec)

Как запретить пользователю без прав администратора изменять таблицы mysql.* ? Мое разрешение неверно?

Добавить

Я администратор компьютерных лабораторий по предметам базы данных, где каждый студент может создавать свои собственные. Так что, теоретически, отказывать в привилегиях базе данных mysql - единственный путь, верно? Как я могу это сделать? Является ли это возможным?

2 ответа2

0

Мое разрешение неверно?

Да, вы предоставляете учетной записи больше, чем нужно, поэтому ваше заявление GRANT неверно.

Как запретить пользователю без прав администратора изменять таблицы mysql. *?

Когда вы ПРЕДОСТАВЛЯЕТЕ разрешения для создаваемой локальной учетной записи SQL, предоставляйте ей только те разрешения, которые необходимы ей для доступа к записям БД или объектам БД, к которым он должен получить доступ, и ничего более.

Наиболее безопасный способ - предоставить ему только те явные разрешения, которые ему необходимы для явных объектов БД, таких как SELECT для конкретной таблицы или EXECUTE для конкретной хранимой процедуры, например.

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

Как только вы поймете, как работает каждая привилегия в отношении прав доступа к объектам БД и т.д., Вы можете определить безопасность для создаваемой вами учетной записи SQL.

Когда вы говорите, что не хотите разрешать изменение таблиц mysql, просто помните, что вы можете изменять данные в таблице, где DELETE и UPDATE позволили бы это. Разрешение DROP с другой стороны, позволило бы удалить всю таблицу, или разрешение ALTER позволило бы изменить схему таблицы, определения столбцов или другие объекты, существующие в таблице.

пример

Вы можете использовать нижеприведенное, чтобы предоставить учетной записи SELECT доступ ко всем таблицам и EXECUTE доступ ко всем хранимым процедурам в конкретной БД:

GRANT CREATE, SELECT, EXECUTE ON 'DatabaseName'
TO 'user'@'localhost'

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

Нет, я проверил и подтвердил, что приведенное ниже решение работает. По сути, вы разрешаете student учетные записи MYSQL GRANT ALL PRIVILEGES но только БД, соответствующие определенному шаблону именования.

Это означает, что когда вы заставляете учеников выполнять упражнения, вам необходимо убедиться, что у созданных ими БД есть имя, соответствующее этому шаблону. Это также означает, что выбранный вами шаблон соглашения об именах НЕ должен соответствовать шаблону, как другие БД, к которым вы не хотите, чтобы они обращались.

Опять же, я проверил и подтвердил, что это решение работает и является довольно простым решением, чем явное использование разрешений DENY что может быть опасно, поскольку вы можете легко пропустить или не протестировать каждый возможный сценарий, и это является причиной, по которой вы DENY всего и только GRANT что Вы хотите, чтобы безопасность была мудрой.

пример

GRANT ALL PRIVILEGES ON `student\_%` .  * TO 'student'@'%';

Источник кредита

Теперь пользователь с именем student может создать любую базу данных на экземпляре MYSQL, если она имеет имя или начинается с student_ . Обратная косая черта является escape-символом для символа подчеркивания.

0

Часть *.* В вашем выражении GRANT - «получается, что этот обычный пользователь имеет доступ (буквально) к базе данных mysql». Укажите только ту базу данных, к которой пользователь имеет доступ как

CREATE USER 'user'@'localhost' IDENTIFIED BY '';
GRANT ALTER,CREATE,CREATE VIEW,DELETE,DROP,INDEX,INSERT,SELECT,SHOW VIEW,TRIGGER,UPDATE ON AllowedDatabaseName.* TO 'user'@'localhost';

PS

И я полностью согласен с @Walmart: не давайте пользователю слишком много прав, если он действительно в этом не нуждается (например, ССЫЛКИ, ПЕРЕГРУЗКА, ПОКАЗАТЬ БАЗЫ ДАННЫХ ....)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .