Spec-Zone.ru › MariaDB

СОЗДАНИЕ ПОЛЬЗОВАТЕЛЯ

Синтаксис

CREATE [OR REPLACE] USER [IF NOT EXISTS] 
 user_specification [,user_specification ...] 
  [REQUIRE {NONE | tls_option [[AND] tls_option ...] }]
  [WITH resource_option [resource_option ...] ]
  [lock_option] [password_option] 

user_specification:
  username [authentication_option]

authentication_option:
  IDENTIFIED BY 'password' 
  | IDENTIFIED BY PASSWORD 'password_hash'
  | IDENTIFIED {VIA|WITH} authentication_rule [OR authentication_rule  ...]

authentication_rule:
    authentication_plugin
  | authentication_plugin {USING|AS} 'authentication_string'
  | authentication_plugin {USING|AS} PASSWORD('password')

tls_option:
  SSL 
  | X509
  | CIPHER 'cipher'
  | ISSUER 'issuer'
  | SUBJECT 'subject'

resource_option:
  MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count
  | MAX_STATEMENT_TIME time

password_option:
  PASSWORD EXPIRE
  | PASSWORD EXPIRE DEFAULT
  | PASSWORD EXPIRE NEVER
  | PASSWORD EXPIRE INTERVAL N DAY

lock_option:
    ACCOUNT LOCK
  | ACCOUNT UNLOCK
}

Описание

Выражение CREATE USER создаёт новые учётные записи MariaDB. Для его использования необходимо обладать глобальным правом СОЗДАНИЕ ПОЛЬЗОВАТЕЛЯ или правом ВСТАВКИ для базы данных mysql. Для каждой учётной записи CREATE USER создаётся новая строка в таблице mysql.user (до MariaDB 10.3 это таблица, начиная с MariaDB 10.4 это представление) или mysql.global_priv_table (начиная с MariaDB 10.4), не имеющая привилегий.

Если какие-либо из указанных учётных записей или какие-либо разрешения для указанных учётных записей уже существуют, сервер возвращает ERROR 1396 (HY000). Если произошла ошибка, CREATE USER всё равно создаст учётные записи, которые не привели к ошибке. Для всех пользователей, которые не были созданы, генерируется только одна ошибка:

ERROR 1396 (HY000): 
  Operation CREATE USER failed for 'u1'@'%','u2'@'%'

CREATE USER, УДАЛЕНИЕ ПОЛЬЗОВАТЕЛЯ, СОЗДАНИЕ РОЛИ и УДАЛЕНИЕ РОЛИ — все возвращают один и тот же код ошибки при сбое.

Подробности о том, как задаются имена учётных записей, см. ниже в разделе Имена учётных записей.

OR REPLACE

Если используется необязательная OR REPLACE фраза, она по сути является сокращением для:

DROP USER IF EXISTS name;
CREATE USER name ...;

Например:

CREATE USER foo2@test IDENTIFIED BY 'password';
ERROR 1396 (HY000): Operation CREATE USER failed for 'foo2'@'test'

CREATE OR REPLACE USER foo2@test IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

IF NOT EXISTS

При использовании IF NOT EXISTS фразы, MariaDB вернёт предупреждение, а не ошибку, если указанный пользователь уже существует.

Например:

CREATE USER foo2@test IDENTIFIED BY 'password';
ERROR 1396 (HY000): Operation CREATE USER failed for 'foo2'@'test'

CREATE USER IF NOT EXISTS foo2@test IDENTIFIED BY 'password';
Query OK, 0 rows affected, 1 warning (0.00 sec)

SHOW WARNINGS;
+-------+------+----------------------------------------------------+
| Level | Code | Message                                            |
+-------+------+----------------------------------------------------+
| Note  | 1973 | Can't create user 'foo2'@'test'; it already exists |
+-------+------+----------------------------------------------------+

Параметры аутентификации

IDENTIFIED BY 'password'

Необязательная IDENTIFIED BY фраза может быть использована для предоставления учётной записи пароля. Пароль должен быть указан в виде обычного текста. Он будет хэширован функцией PASSWORD перед сохранением в таблицу mysql.user/mysql.global_priv_table.

Например, если наш пароль mariadb, то мы можем создать пользователя с помощью:

CREATE USER foo2@test IDENTIFIED BY 'mariadb';

Если вы не укажете пароль с помощью IDENTIFIED BY фразы, пользователь сможет подключаться без пароля. Пустой пароль не является подстановочным символом для соответствия любому паролю. Если пароль не задан, пользователь должен подключаться без ввода пароля.

Единственные плагины аутентификации, которые поддерживает эта фраза, — это mysql_native_password и mysql_old_password.

IDENTIFIED BY PASSWORD 'password_hash'

Необязательная IDENTIFIED BY PASSWORD фраза может быть использована для предоставления учётной записи пароля, который уже был хэширован. Пароль должен быть указан в виде хэша, полученного с помощью функции PASSWORD. Он будет сохранён в таблице mysql.user/mysql.global_priv_table в неизменённом виде.

Например, если наш пароль mariadb, то мы можем найти хэш с помощью:

SELECT PASSWORD('mariadb');
+-------------------------------------------+
| PASSWORD('mariadb')                       |
+-------------------------------------------+
| *54958E764CE10E50764C2EECBB71D01F08549980 |
+-------------------------------------------+
1 row in set (0.00 sec)

И затем мы можем создать пользователя с хэшем:

CREATE USER foo2@test IDENTIFIED BY PASSWORD '*54958E764CE10E50764C2EECBB71D01F08549980';

Если вы не укажете пароль с помощью IDENTIFIED BY фразы, пользователь сможет подключаться без пароля. Пустой пароль не является подстановочным символом для соответствия любому паролю. Если пароль не задан, пользователь должен подключаться без ввода пароля.

Единственные плагины аутентификации, которые поддерживает эта фраза, — это mysql_native_password и mysql_old_password.

IDENTIFIED {VIA|WITH} authentication_plugin

Необязательная IDENTIFIED VIA authentication_plugin позволяет указать, что учётная запись должна аутентифицироваться с помощью определённого плагина аутентификации. Имя плагина должно быть активным плагином аутентификации, как указано в SHOW PLUGINS. Если его нет в этом выводе, вам необходимо установить его с помощью INSTALL PLUGIN или INSTALL SONAME.

Например, это может быть использовано с плагином аутентификации PAM:

CREATE USER foo2@test IDENTIFIED VIA pam;

Некоторые плагины аутентификации позволяют указывать дополнительные аргументы после ключевого слова USING или AS. Например, плагин аутентификации PAM принимает имя сервиса service name:

CREATE USER foo2@test IDENTIFIED VIA pam USING 'mariadb';

Точное значение дополнительного аргумента зависит от конкретного плагина аутентификации.

MariaDB, начиная с 10.4.0

Ключевое слово USING или AS также может быть использовано для предоставления текстового пароля плагину, если он передан в качестве аргумента функции PASSWORD(). Это допустимо только для плагинов аутентификации, которые реализовали обработчик для функции PASSWORD(). Например, плагин аутентификации ed25519 поддерживает это:

CREATE USER safe@'%' IDENTIFIED VIA ed25519 USING PASSWORD('secret');
MariaDB, начиная с 10.4.3

Можно указать несколько плагинов аутентификации; все они являются альтернативными способами аутентификации пользователя:

CREATE USER safe@'%' IDENTIFIED VIA ed25519 USING PASSWORD('secret') OR unix_socket;

По умолчанию, при создании пользователя без указания плагина аутентификации, MariaDB использует плагин mysql_native_password.

Параметры TLS

По умолчанию MariaDB передаёт данные между сервером и клиентами без шифрования. Это обычно приемлемо, когда сервер и клиент работают на одном хосте или в сетях, где безопасность гарантируется другими способами. Однако в случаях, когда сервер и клиент находятся в разных сетях или в сети с высоким риском, отсутствие шифрования создаёт проблемы безопасности, так как злоумышленник потенциально может перехватывать трафик при передаче между ними по сети.

Для решения этой проблемы MariaDB позволяет шифровать данные при передаче между сервером и клиентами с помощью протокола Transport Layer Security (TLS). TLS ранее был известен как Secure Socket Layer (SSL), но строго говоря, протокол SSL является предшественником TLS, а эта версия протокола теперь считается небезопасной. В документации часто используется термин SSL, а по соображениям совместимости переменные сервера и состояния, связанные с TLS, всё ещё используют префикс ssl_, но в MariaDB поддерживаются только его безопасные преемники.

См. Обзор безопасных соединений для получения дополнительной информации о том, поддерживает ли ваш сервер MariaDB TLS.

Вы можете установить определённые ограничения, связанные с TLS, для конкретных учётных записей пользователей. Например, вы можете использовать это с учётными записями пользователей, которым требуется доступ к конфиденциальным данным при отправке их через сети, которыми вы не управляете. Эти ограничения можно включить для учётной записи пользователя с помощью команд CREATE USER, ALTER USER или GRANT. Доступны следующие параметры:

Параметр Описание
REQUIRE NONE TLS не требуется для этой учётной записи, но может быть использован.
REQUIRE SSL Учётная запись должна использовать TLS, но действительный сертификат X509 не требуется. Этот параметр не может быть объединён с другими параметрами TLS.
REQUIRE X509 Учётная запись должна использовать TLS и должна иметь действительный сертификат X509. Этот параметр подразумевает REQUIRE SSL. Этот параметр не может быть объединён с другими параметрами TLS.
REQUIRE ISSUER 'issuer' Учётная запись должна использовать TLS и должна иметь действительный сертификат X509. Кроме того, центр сертификации должен быть тем, который указан в строке issuer. Этот параметр подразумевает REQUIRE X509. Этот параметр может быть объединён с параметрами SUBJECT, и CIPHER в любом порядке.
REQUIRE SUBJECT 'subject' Учётная запись должна использовать TLS и должна иметь действительный сертификат X509. Кроме того, субъект сертификата должен быть тем, который указан в строке subject. Этот параметр подразумевает REQUIRE X509. Этот параметр может быть объединён с параметрами ISSUER, и CIPHER в любом порядке.
REQUIRE CIPHER 'cipher' Учётная запись должна использовать TLS, но действительный сертификат X509 не требуется. Кроме того, шифрование, используемое для соединения, должно использовать определённый метод шифра, указанный в строке cipher. Этот параметр подразумевает REQUIRE SSL. Этот параметр может быть объединён с параметрами ISSUER, и SUBJECT в любом порядке.

Ключевое слово REQUIRE должно быть использовано только один раз для всех указанных параметров, а ключевое слово AND может быть использовано для разделения отдельных параметров, но это не обязательно.

Например, вы можете создать учётную запись пользователя, которая требует этих параметров TLS с помощью следующего:

CREATE USER 'alice'@'%'
 REQUIRE SUBJECT '/CN=alice/O=My Dom, Inc./C=US/ST=Oregon/L=Portland'
 AND ISSUER '/C=FI/ST=Somewhere/L=City/ O=Some Company/CN=Peter Parker/emailAddress=p.parker@marvel.com'
 AND CIPHER 'SHA-DES-CBC3-EDH-RSA';

Если какой-либо из этих параметров установлен для конкретной учётной записи пользователя, то любой клиент, пытающийся подключиться с этой учётной записью, должен быть настроен на подключение с TLS.

См. Защита подключений для клиента и сервера для получения информации о том, как включить TLS на клиенте и сервере.

Параметры ограничения ресурсов

Можно установить ограничения на определённые ресурсы сервера для каждой учётной записи. В следующей таблице показаны значения, которые могут быть установлены для каждой учётной записи:

Тип лимита Описание
MAX_QUERIES_PER_HOUR Количество запросов, которое может выпустить счёт в час (включая обновления)
MAX_UPDATES_PER_HOUR Количество обновлений (а не запросов), которое может выпустить счёт в час
MAX_CONNECTIONS_PER_HOUR Количество подключений, которые может начать счёт в час
MAX_USER_CONNECTIONS Количество одновременных подключений, которые может принять счёт; если это 0, max_connections будет использоваться вместо; если max_connections равно 0, нет ограничений на одновременные подключения для этого счёта.
MAX_STATEMENT_TIME Таймаут, в секундах, для запросов, выполняемых пользователем. См. также Прерывание запросов, превысивших определённое время выполнения.

Если любой из этих лимитов установлен на 0, то для данного ресурса для данного пользователя ограничений нет.

Вот пример создания пользователя с ограничениями ресурсов:

CREATE USER 'someone'@'localhost' WITH
    MAX_USER_CONNECTIONS 10
    MAX_QUERIES_PER_HOUR 200;

Ресурсы отслеживаются по счёту, а не по имени пользователя или по подключению.

Подсчёт можно сбросить для всех пользователей, используя FLUSH USER_RESOURCES, FLUSH PRIVILEGES или mariadb-admin reload.

Ограничения ресурсов по счёту хранятся в таблице user базы данных mysql. Столбцы, используемые для ограничений ресурсов, называются max_questions, max_updates, max_connections (для MAX_CONNECTIONS_PER_HOUR) и max_user_connections (для MAX_USER_CONNECTIONS).

Имена счетов

Имена счетов содержат как компонент имени пользователя, так и компонент имени хоста и задаются как 'user_name'@'host_name'.

Имя пользователя и имя хоста могут быть не заключёнными в кавычки, заключёнными в кавычки в виде строк с использованием двойных кавычек (") или одинарных кавычек ('), или заключёнными в кавычки в качестве идентификаторов с использованием обратных кавычек (`). Вы должны использовать кавычки при использовании специальных символов (таких как дефис) или символов подстановки. Если вы используете кавычки, вы должны заключить в кавычки имя пользователя и имя хоста отдельно (например, 'user_name'@'host_name').

Компонент имени хоста

Если имя хоста не указано, предполагается, что это '%'.

Имена хостов могут содержать символы подстановки % и _. Они сопоставляются так же, как в CLAUSE LIKE. Если вам нужно использовать символ подстановки буквально (например, для сопоставления имени домена с подчёркиванием), добавьте перед ним обратную косую черту. Дополнительную информацию об экранировании символов подстановки см. в LIKE.

Сопоставления имён хостов нечувствительны к регистру. Имена хостов могут соответствовать либо доменным именам, либо IP-адресам. Используйте 'localhost' в качестве имени хоста, чтобы разрешить только локальные подключения клиентов. В Linux, локальный интерфейс (127.0.0.1) не будет соответствовать «localhost», поскольку он не считается локальным подключением: это означает, что только подключения через сокеты UNIX-домена будут соответствовать «localhost».

Можно использовать маску сети для сопоставления диапазона IP-адресов, используя 'base_ip/netmask' в качестве имени хоста. Пользователь с IP-адресом ip_addr сможет подключиться, если выполняется следующее условие:

ip_addr & netmask = base_ip

Например, для пользователя:

CREATE USER 'maria'@'247.150.130.0/255.255.255.0';

IP-адреса, удовлетворяющие этому условию, находятся в диапазоне от 247.150.130.0 до 247.150.130.255.

Использование 255.255.255.255 эквивалентно отсутствию маски подсети. Маски подсети нельзя использовать для IPv6-адресов.

Обратите внимание, что учётные данные, добавленные при создании пользователя с символом подстановки '%' для имени хоста, не всегда гарантируют доступ. Например, на некоторых системах есть анонимный пользователь localhost, и при подключении с localhost он будет иметь приоритет.

До MariaDB 10.6 длина компонента имени хоста могла составлять до 60 символов. Начиная с MariaDB 10.6, она может составлять до 255 символов.

Компонент имени пользователя

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

См. Имена идентификаторов для допустимых идентификаторов для использования в качестве имён пользователей.

При подключении пользователя может совпадать более одного счёта. MariaDB выбирает первый соответствующий счёт после сортировки по следующим критериям:

  • Счёта с точным именем хоста отсортированы перед счётами, использующими символ подстановки в имени хоста. Счёта с маской подсети считаются точными для сортировки.
  • Счёта с символом подстановки в имени хоста сортируются в зависимости от положения первого символа подстановки. Те, у которых символ подстановки находится позже в имени хоста, сортируются перед теми, у которых он находится раньше.
  • Счёта с ненулевым именем пользователя сортируются перед счётами с пустым именем пользователя.
  • Счёта с пустым именем пользователя сортируются последними. Как упоминалось ранее, они известны как анонимные счёта. Подробнее об этом в следующем разделе.

В следующей таблице приведён список примеров счетов, отсортированных по этим критериям:

+---------+-------------+
| User    | Host        |
+---------+-------------+
| joffrey | 192.168.0.3 |
|         | 192.168.0.% |
| joffrey | 192.168.%   |
|         | 192.168.%   |
+---------+-------------+

После подключения вы получаете только привилегии, предоставленные сопоставленному счёту, а не всем счетам, которые могли бы соответствовать. Например, рассмотрим следующие команды:

CREATE USER 'joffrey'@'192.168.0.3';
CREATE USER 'joffrey'@'%';
GRANT SELECT ON test.t1 to 'joffrey'@'192.168.0.3';
GRANT SELECT ON test.t2 to 'joffrey'@'%';

Если вы подключаетесь как joffrey с 192.168.0.3, у вас будет привилегия SELECT на таблице test.t1, но не на таблице test.t2. Если вы подключаетесь как joffrey с любого другого IP-адреса, у вас будет привилегия SELECT на таблице test.t2, но не на таблице test.t1.

Имена пользователей могут иметь длину до 80 символов до версии 10.6, а начиная с версии 10.6 – до 128 символов.

Анонимные счёта

Анонимные счёта — это счёта, где часть имени пользователя в имени счёта пуста. Эти счёта действуют как специальные универсальные счёта. Если пользователь пытается войти в систему с хоста, и существует анонимный счёт с частью имени хоста, совпадающей с хостом пользователя, то пользователь войдёт как анонимный счёт, если нет более специфического соответствия счёта для имени пользователя, введённого пользователем.

Например, вот некоторые анонимные счёта:

CREATE USER ''@'localhost';
CREATE USER ''@'192.168.0.3';

Исправление устаревшего анонимного счёта по умолчанию

В некоторых системах таблица mysql.db по умолчанию имеет некоторые записи для анонимного счёта ''@'%'. К сожалению, в таблице mysql.user/mysql.global_priv_table нет соответствующей записи, что означает, что этот анонимный счёт фактически не существует, но у него есть привилегии, обычно на базе данных test по умолчанию, созданной mariadb-install-db. Эти привилегии без счёта являются остатком от времени, когда система привилегий MySQL была менее развитой.

В этой ситуации вы столкнётесь с ошибками, если попытаетесь создать счёт ''@'%'. Например:

CREATE USER ''@'%';
ERROR 1396 (HY000): Operation CREATE USER failed for ''@'%'

Исправление состоит в том, чтобы удалить строку в таблице mysql.db, а затем выполнить FLUSH PRIVILEGES:

DELETE FROM mysql.db WHERE User='' AND Host='%';
FLUSH PRIVILEGES;

Затем счёт можно создать:

CREATE USER ''@'%';
Query OK, 0 rows affected (0.01 sec)

См. MDEV-13486 для получения дополнительной информации.

Срок действия пароля

MariaDB, начиная с 10.4.3

Помимо автоматического истечения срока действия пароля, определяемого default_password_lifetime, можно установить время истечения срока действия пароля для каждого пользователя, переопределяя глобальную настройку, например:

CREATE USER 'monty'@'localhost' PASSWORD EXPIRE INTERVAL 120 DAY;

См. Срок действия пароля пользователя для получения дополнительной информации.

Блокировка счетов

MariaDB, начиная с 10.4.2

Блокировка счетов позволяет администраторам с привилегиями блокировать/разблокировать учётные записи пользователей. Новые подключения клиентов не будут разрешены, если счёт заблокирован (существующие подключения не затрагиваются). Например:

CREATE USER 'marijn'@'localhost' ACCOUNT LOCK;

См. Блокировка счетов для получения дополнительной информации.

Начиная с MariaDB 10.4.7 и MariaDB 10.5.8, предложения lock_option и password_option могут следовать в любом порядке.

См. также

  • Устранение неполадок при подключении
  • Вход в систему с MariaDB 10.4
  • Имена идентификаторов
  • GRANT
  • ALTER USER
  • RENAME USER
  • DROP USER
  • SET PASSWORD
  • SHOW CREATE USER
  • Таблица mysql.user
  • Таблица mysql.global_priv_table
  • Плагины проверки паролей - позволяют задавать базовые критерии для паролей
  • Плагины аутентификации - позволяют использовать различные методы аутентификации и разрабатывать новые.
Содержимое, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется предварительно MariaDB. Мнения, информация и мнения, выраженные в данном содержании, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/create-user/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API