MySQL / MariaDB: В чем разница между ‘ПРЕДОСТАВИТЬ … ИДЕНТИФИЦИРУЕТСЯ ‘ vs ‘CREATE USER’, а затем ‘GRANT’?

#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 сначала.