Встроенная аутентификация
Apache Doris предоставляет встроенный механизм аутентификации пользователей. Администраторы создают пользователей, задают пароли и управляют источниками подключений с помощью команд SQL. В этом документе описаны структура идентификатора пользователя Doris, доступные политики паролей, приоритет сопоставления IP-адресов, а также типовые сценарии администрирования и способы устранения неполадок.
Сценарии применения
| Сценарий | Рекомендуемый раздел |
|---|---|
| Создание и удаление учётной записи, сброс пароля | Основные понятия, Основные команды |
| Настройка политик паролей корпоративного уровня (срок действия / история / сложность / блокировка) | Политики паролей |
Одному имени пользователя соответствуют несколько значений user_identity, и вход отклоняется | Приоритет сопоставления идентификаторов пользователей |
| Запрет входа с определённого IP-адреса (имитация чёрного списка) | Имитация чёрного списка с помощью белого списка |
Забыт пароль root, или current_user() не совпадает с user() | Частые вопросы |
Основные понятия
Пользователь (user_identity)
В Doris user_identity однозначно определяет пользователя и состоит из двух частей:
user_name: имя пользователя.host: адрес узла, с которого подключается клиент. Поддерживает%для сопоставления по шаблону.
Если host не указан, по умолчанию используется '%', что позволяет пользователю подключаться к Doris с любого узла.
Свойства пользователя
Свойства пользователя привязаны непосредственно к user_name, а не к user_identity. То есть user@'192.%' и user@['domain'] используют один и тот же набор свойств пользователя. Эти свойства принадлежат пользователю, а не user@'192.%' или user@['domain'].
Свойства пользователя включают максимальное число подключений пользователя, конфигурацию кластера загрузки и другие параметры.
Встроенные пользователи
Встроенные пользователи создаются в Doris по умолчанию и сразу обладают определёнными привилегиями. К ним относятся root и admin. Их начальные пароли пусты. После запуска FE пароль можно изменить с помощью команды смены пароля. Пользователей, созданных по умолчанию, удалить нельзя.
| Пользователь | Разрешённый источник подключения | Роль по умолчанию |
|---|---|---|
root@'%' | Любой узел | operator |
admin@'%' | Любой узел | admin |
Пароль
Пароль служит учётными данными для входа пользователя в систему. Администратор задаёт его при создании пользователя, а впоследствии пользователь может изменить его самостоятельно.
Механизм аутентификации
Аутентификация в Doris состоит из двух этапов:
- Клиент отправляет данные для аутентификации. Клиент формирует набор сведений о пользователе (имя пользователя, пароль, база данных и другие сведения) и отправляет его серверу Doris, чтобы подтвердить свою личность и запросить доступ к базе данных.
- Сервер проверяет личность пользователя. Получив данные для аутентификации, Doris проверяет их. Если имя пользователя, пароль и IP-адрес клиента верны и у пользователя есть доступ к выбранной базе данных, аутентификация проходит успешно, и Doris сопоставляет пользователя с системным идентификатором пользователя. В противном случае аутентификация завершается неудачей, и клиенту возвращается соответствующее сообщение об ошибке.
Политики паролей
Doris поддерживает следующие политики паролей, которые помогают администраторам управлять жизненным циклом и безопасностью паролей.
| Политика | Назначение | Значение по умолчанию |
|---|---|---|
PASSWORD_HISTORY | Запретить повторное использование последних N паролей | 0 (отключено) |
PASSWORD_EXPIRE | Задать срок действия пароля | NEVER (срок действия не ограничен) |
FAILED_LOGIN_ATTEMPTS + PASSWORD_LOCK_TIME | Блокировать учётную запись после последовательных неудачных попыток входа | Отключено |
validate_password_policy | Проверять сложность пароля | NONE/0 (без проверки) |
PASSWORD_HISTORY
Определяет, может ли текущий пользователь повторно использовать предыдущие пароли при сбросе пароля. Например, PASSWORD_HISTORY 10 запрещает использовать любой из последних 10 паролей в качестве нового. Если задано PASSWORD_HISTORY DEFAULT, используется значение глобальной переменной password_history. Значение 0 отключает эту функцию; значение по умолчанию — 0.
Примеры:
- Задать глобальную переменную:
SET GLOBAL password_history = 10 - Задать для пользователя:
ALTER USER user1@'ip' PASSWORD_HISTORY 10
PASSWORD_EXPIRE
Задаёт срок действия пароля текущего пользователя. Например, PASSWORD_EXPIRE INTERVAL 10 DAY означает, что срок действия пароля истечёт через 10 дней. PASSWORD_EXPIRE NEVER означает, что срок действия пароля не ограничен. Если задано PASSWORD_EXPIRE DEFAULT, используется значение глобальной переменной default_password_lifetime (в днях). По умолчанию используется NEVER (или 0), то есть срок действия пароля не ограничен.
Примеры:
- Задать глобальную переменную:
SET GLOBAL default_password_lifetime = 1 - Задать для пользователя:
ALTER USER user1@'ip' PASSWORD_EXPIRE INTERVAL 10 DAY
FAILED_LOGIN_ATTEMPTS и PASSWORD_LOCK_TIME
Блокирует учётную запись текущего пользователя после n неудачных попыток входа и задаёт продолжительность блокировки. Например, FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 1 DAY означает, что учётная запись блокируется на один день после 3 неудачных попыток входа. Администратор может вручную разблокировать учётную запись с помощью оператора ALTER USER.
Пример:
- Задать для пользователя:
ALTER USER user1@'ip' FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 1 DAY
Сложность пароля
Эта функция управляется глобальной переменной validate_password_policy. Значение по умолчанию — NONE/0, что означает отсутствие проверки сложности пароля. Если задано STRONG/2, пароль должен содержать символы как минимум из 3 следующих 4 категорий: прописные буквы, строчные буквы, цифры и специальные символы. Его длина должна составлять не менее 8 символов.
Пример:
SET validate_password_policy = STRONG
Просмотр политик паролей
После настройки перечисленных выше политик их можно просмотреть с помощью следующей команды:
SHOW PROC "/auth/'<user>'@'<host>'";
Обратите внимание: имя пользователя и адрес узла необходимо по отдельности заключать в одинарные кавычки. Например:
SHOW PROC "/auth/'root'@'%'";
SHOW PROC "/auth/'user1'@'127.0.0.1'";
Приоритет сопоставления идентификаторов пользователей
Идентификатор user_identity состоит из user_name и host, однако при входе пользователь указывает только user_name. Doris подбирает соответствующее значение host по IP-адресу клиента, чтобы определить, какой user_identity использовать для входа.
Если IP-адресу клиента соответствует только одно значение user_identity, Doris использует его. Если подходят несколько значений user_identity, Doris применяет следующий порядок приоритетов:
| Сравниваемые варианты | Приоритет |
|---|---|
| Конкретный IP-адрес и домен | Конкретный IP-адрес имеет приоритет перед доменом |
| Конкретный IP-адрес и диапазон IP-адресов | Более конкретный диапазон IP-адресов имеет приоритет (например, 192.% перед %) |
Пример 1: IP-адрес имеет приоритет перед доменом
CREATE USER user1@['domain1'] IDENTIFIED BY "12345";
CREATE USER user1@'ip1' IDENTIFIED BY "abcde";
Предположим, что domain1 разрешается в два IP-адреса: ip1 и ip2. Поскольку IP-адрес имеет приоритет перед доменом, при попытке пользователя user1 войти в Doris с ip1 с паролем '12345' вход будет отклонён (правильный пароль — 'abcde').
Пример 2: Более конкретный диапазон IP-адресов имеет приоритет
CREATE USER user1@'%' IDENTIFIED BY "12345";
CREATE USER user1@'192.%' IDENTIFIED BY "abcde";
Поскольку '192.%' имеет приоритет перед '%', при попытке пользователя user1 войти в Doris с 192.168.1.1 с паролем '12345' вход будет отклонён (правильный пароль — 'abcde').
Имитация чёрного списка с помощью белого списка
Doris изначально поддерживает только белые списки, без поддержки чёрных списков. Однако приоритет сопоставления идентификаторов пользователей позволяет имитировать чёрный список.
Например, предположим, что создан пользователь с именем user@'192.%', что разрешает вход пользователям с адресами 192.*. Чтобы запретить вход с 192.168.10.1, создайте ещё одного пользователя cmy@'192.168.10.1' и задайте новый пароль. Поскольку 192.168.10.1 имеет более высокий приоритет, чем 192.%, пользователи с 192.168.10.1 больше не смогут войти со старым паролем.
Основные команды
| Операция | Команда |
|---|---|
| Создать пользователя | CREATE USER |
| Просмотреть привилегии пользователя | SHOW ALL GRANTS |
| Изменить пользователя | ALTER USER |
| Изменить пароль | SET PASSWORD |
| Удалить пользователя | DROP USER |
| Задать свойства пользователя | SET PROPERTY |
| Просмотреть свойства пользователя | SHOW PROPERTY |
Частые вопросы
Вопрос: Как сбросить забытый пароль?
Если вы забыли пароль и не можете войти в Doris, выполните следующие действия для восстановления доступа:
-
Добавьте следующий параметр в файл конфигурации FE:
skip_localhost_auth_check = true -
Перезапустите FE.
-
На узле FE войдите в Doris как пользователь root без пароля.
-
После входа сбросьте пароль с помощью команды
SET PASSWORD.
Вопрос: Могут ли другие пользователи сбросить пароль пользователя root?
Нет. Ни один пользователь, кроме root, не может сбросить пароль пользователя root.
Вопрос: В чём разница между current_user() и user()?
Выполните SELECT current_user() и SELECT user(), чтобы просмотреть current_user и user соответственно:
current_user: идентификатор, под которым текущий пользователь прошёл аутентификацию (значениеuser_identity, использованное при создании пользователя).user: фактический идентификатор текущего пользователя, включающий реальный IP-адрес клиента.
Например, предположим, что создан пользователь user1@'192.%', а затем пользователь user1 с адреса 192.168.10.1 входит в систему. В этом случае current_user будет равен user1@'192.%', а user — user1@'192.168.10.1'.
Все привилегии назначаются конкретному current_user, и фактический пользователь обладает всеми привилегиями этого current_user.
Вопрос: Вход пользователя отклоняется, хотя пароль точно верен. Почему?
Обычно это означает, что сработали правила приоритета сопоставления идентификаторов пользователей: IP-адресу клиента соответствует более конкретный user_identity, и пользователю следует войти с паролем, принадлежащим этому user_identity. Проверить фактически выбранный идентификатор можно с помощью следующей команды:
SELECT current_user();