#mysql #permissions #mariadb #database-permissions
#mysql #разрешения #mariadb #база данных-разрешения
Вопрос:
При настройке базы данных я обычно создаю пользователя с:
CREATE USER myuser@localhost IDENTIFIED BY 'pa$$w0rd';
а затем предоставить пользователю некоторые разрешения для базы данных:
GRANT SELECT, INSERT, UPDATE ON dbname.* TO 'myuser'@'localhost' IDENTIFIED BY 'pa$$w0rd';
Я вижу эту последовательность из двух команд повсюду как способ сделать это. Однако я замечаю, что если я пропущу CREATE USER
команду и начну с GRANT
, пользователь, похоже, создается автоматически и работает нормально.
Есть ли причина, по которой CREATE USER
все еще следует использовать раньше GRANT
? Или это просто старое соглашение, возможно, для обратной совместимости?
Ответ №1:
MySQL раньше поддерживал неявное создание пользователей, просто предоставляя им привилегии. Это использование позволило GRANT быть идемпотентным и безопасным для репликации. Например, когда пользователь может существовать или не существовать в реплике, GRANT создаст пользователя, если пользователь еще не существует. Если пользователь действительно существовал, то ПРЕДОСТАВЛЕНИЕ все еще работает и при необходимости добавляет привилегии.
Когда GRANT использовался таким образом, было необязательно использовать предложение IDENTIFIED BY для установки пароля. Если пользователь уже существует, то ИДЕНТИФИКАЦИЯ с ПОМОЩЬЮ не требуется, потому что у пользователя уже есть пароль. Если пользователь не существует, то исключение ИДЕНТИФИЦИРОВАННОГО неявно создаст пользователя, но без пароля (т. Е. Любой может войти в систему как этот пользователь без ввода пароля).
Это считалось угрозой безопасности. Например, если кто-то использует GRANT без IDENTIFIED BY и допускает орфографическую ошибку в имени пользователя, то можно случайно создать нового пользователя с привилегиями, но без пароля.
GRANT ALL ON *.* TO 'ruhnett'@'%'; -- misspelled username creates new user
Это позволило бы любому войти в систему как новому пользователю и получить привилегированный доступ.
Итак, в MySQL 5.7 использование GRANT для создания пользователей неявно устарело.
СОЗДАЙТЕ ПОЛЬЗОВАТЕЛЯ… Синтаксис IF NOT EXISTS заменяет создание идемпотентного пользователя. Это побуждает разработчиков более четко определять, когда они хотят создать пользователя, а не когда они хотят предоставить привилегии существующему пользователю.
Ответ №2:
То, что вы делаете, не будет работать в MySQL 8.0. Возможность автоматического создания пользователя в GRANT
команде была удалена, вы должны использовать CREATE USER
сначала.