Перейти к содержимому
Последнее обновление

Встроенная аутентификация

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 состоит из двух этапов:

  1. Клиент отправляет данные для аутентификации. Клиент формирует набор сведений о пользователе (имя пользователя, пароль, база данных и другие сведения) и отправляет его серверу Doris, чтобы подтвердить свою личность и запросить доступ к базе данных.
  2. Сервер проверяет личность пользователя. Получив данные для аутентификации, 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, выполните следующие действия для восстановления доступа:

  1. Добавьте следующий параметр в файл конфигурации FE:

    skip_localhost_auth_check = true
  2. Перезапустите FE.

  3. На узле FE войдите в Doris как пользователь root без пароля.

  4. После входа сбросьте пароль с помощью команды 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();