diff --git a/ydb/docs/ru/core/_includes/builtin-groups-graph.md b/ydb/docs/ru/core/_includes/builtin-groups-graph.md new file mode 100644 index 000000000000..d6660b18371f --- /dev/null +++ b/ydb/docs/ru/core/_includes/builtin-groups-graph.md @@ -0,0 +1,56 @@ +```mermaid +--- +config: + layout: elk + elk: + mergeEdges: true + nodePlacementStrategy: NETWORK_SIMPLEX +--- +graph BT + +DATA-WRITERS & DATABASE-ADMINS --> ADMINS +DDL-ADMINS & ACCESS-ADMINS --> DATABASE-ADMINS +DATA-READERS --> DATA-WRITERS +METADATA-READERS --> DATA-READERS & DDL-ADMINS +%%USERS --> METADATA-READERS & DATA-READERS & DATA-WRITERS & DDL-ADMINS & ACCESS-ADMINS & DATABASE-ADMINS & ADMINS +USERS --> METADATA-READERS & DDL-ADMINS & ACCESS-ADMINS + + DATA-READERS["DATA-READERS + +SelectRow" + ] + + DATA-WRITERS["DATA-WRITERS + +UpdateRow + +EraseRow" + ] + + METADATA-READERS["METADATA-READERS + +DescribeSchema + +ReadAttributes" + ] + + DATABASE-ADMINS["DATABASE-ADMINS + +CreateDatabase + +DropDatabase" + ] + + ACCESS-ADMINS["ACCESS-ADMINS + +GrantAccessRights" + ] + + DDL-ADMINS["DDL-ADMINS + +CreateDirectory + +CreateTable + +CreateQueue + +WriteAttributes + +AlterSchema + +RemoveSchema" + ] + + USERS[USERS + +ConnectDatabase + ] + ADMINS[ADMINS] +``` + +[//]: # (diplodoc support for mermaid lacks support for markdown in labels) diff --git a/ydb/docs/ru/core/_includes/do-not-create-users-in-ldap.md b/ydb/docs/ru/core/_includes/do-not-create-users-in-ldap.md index 119b6a658d2a..34b65e2660bf 100644 --- a/ydb/docs/ru/core/_includes/do-not-create-users-in-ldap.md +++ b/ydb/docs/ru/core/_includes/do-not-create-users-in-ldap.md @@ -3,6 +3,6 @@ Область действия команд `CREATE USER`, `ALTER USER`, `DROP USER` не распространяется на внешние каталоги пользователей. Учитывайте это, если к {{ ydb-short-name }} подключаются пользователи со сторонней аутентификацией (например, LDAP). Например, команда `CREATE USER` не создаст пользователя в LDAP-каталоге. -Подробнее про [взаимодействие {{ ydb-short-name }} с LDAP-каталогом](../security/authentication.md#ldap-auth-provider). +Подробнее про [взаимодействие {{ ydb-short-name }} с LDAP-каталогом](../security/authentication.md#ldap). {% endnote %} diff --git a/ydb/docs/ru/core/changelog-server.md b/ydb/docs/ru/core/changelog-server.md index afd5ae5e5abf..47726078fe51 100644 --- a/ydb/docs/ru/core/changelog-server.md +++ b/ydb/docs/ru/core/changelog-server.md @@ -85,7 +85,7 @@ * Добавлена возможность [задать приоритеты](./devops/manual/maintenance-without-downtime#priority) задачам обслуживания в [системе управления кластером](./concepts/glossary#cms). * Добавлена [настройка стабильных имён](./reference/configuration/#node-broker-config) для узлов кластера в рамках тенанта. -* Добавлено получение вложенных групп от [LDAP-сервера](./concepts/auth#ldap-auth-provider), в [LDAP-конфигурации](./reference/configuration/#ldap-auth-config) улучшен парсинг хостов и добавлена настройка для отключения встроенной аутентификацию по логину и паролю. +* Добавлено получение вложенных групп от [LDAP-сервера](./security/authentication.md#ldap), в [LDAP-конфигурации](./reference/configuration/index.md#ldap-auth-config) улучшен парсинг хостов и добавлена настройка для отключения встроенной аутентификацию по логину и паролю. * Добавлена возможность аутентификации [динамических узлов](./concepts/glossary#dynamic) по SSL-сертификату. * Реализовано удаление неактивных узлов из [Hive](./concepts/glossary#hive) без его перезапуска. * Улучшено управление inflight pings при перезапуске Hive в кластерах большого размера. diff --git a/ydb/docs/ru/core/concepts/glossary.md b/ydb/docs/ru/core/concepts/glossary.md index 3c131a324b30..6792885d824f 100644 --- a/ydb/docs/ru/core/concepts/glossary.md +++ b/ydb/docs/ru/core/concepts/glossary.md @@ -269,6 +269,12 @@ **Секрет** или **secret** — это конфиденциальные метаданные, требующие особого обращения. Например, секреты могут использоваться в определениях [внешних источников данных](#external-data-source) и представляют собой такие сущности, как пароли и токены. +### Аутентификационный токен {#auth-token} + +**Аутентификационный токен** или **auth token** — токен, используемый для [аутентификации](../security/authentication.md) в {{ ydb-short-name }}. + +{{ ydb-short-name }} поддерживает [разные виды аутентификации](../security/authentication.md) и различные типы токенов. + ### Объект схемы {#scheme-object} Схема базы данных состоит из **схемных объектов** или **объектов схемы**, которыми могут быть базы данных, [таблицы](#table) (включая [внешние таблицы](#external-table)), [топики](#topic), [папки](#folder) и т.д. @@ -284,21 +290,36 @@ ### Объект доступа {#access-object} **Объект доступа** или **access object** при [авторизации](../security/authorization.md) — сущность, для которой настраиваются права и ограничения доступа. В {{ ydb-short-name }} объектами доступа являются [объекты схемы](#scheme-object). -У каждого объекта доступа есть [владелец](#access-owner) и [список разрешений](#access-control-list). + +У каждого [объекта схемы](#scheme-object) есть [владелец](#access-owner) и [список прав](#access-control-list) на этот объект, выданных пользователям и группам ([субъектам доступа](#access-subject)). ### Субъект доступа {#access-subject} -**Субъект доступа** или **access subject** — сущность, которая может обращаться к [объектам доступа](#access-object) или выполнять определённые действия в системе. Получение доступа при этих обращениях и действиях зависит от настроенных [списков разрешений](#access-control-list). +**Субъект доступа** или **access subject** — сущность, которая может обращаться к [объектам доступа](#access-object) и выполнять определённые действия в системе. + +Получение доступа при этих обращениях и действиях зависит от настроенных [списков прав](#access-control-list) и [уровня доступа](#access-level) субъекта. Субъектом доступа может быть [пользователь](#access-user) или [группа](#access-group). -### Право доступа {#access-right} +### Право {#access-right} **[Право доступа](../security/authorization.md#right)** или **access right** — сущность, отражающая разрешение [субъекту доступа](#access-subject) выполнять конкретный набор операций в кластере или базе данных над конкретным [объектом доступа](#access-object). -### Список разрешений {#access-control-list} +### Список прав {#access-control-list} + +**[Список прав](../security/authorization.md#right)**, **access control list** или **ACL** — список всех [прав](#access-right), предоставленных [субъектам доступа](#access-subject) (пользователям и группам) на конкретный [объект доступа](#access-object). + +### Уровень доступа {#access-level} + +**[Уровень доступа](../security/authorization.md#level)** — состояние, определяющее дополнительные возможности [субъекта доступа](#access-subject) при работе с [объектами схемы](#scheme-object), а также возможности [субъекта доступа](#access-subject) в контекстах, не связанных с [объектами схемы](#scheme-object). -**Список разрешений**, **access control list** или **ACL** — список всех [прав](#access-right), предоставленных [субъектам доступа](#access-subject) (пользователям и группам) на конкретный [объект доступа](#access-object). +Уровень доступа определяется принадлежностью субъекта к [спискам разрешений](#access-level-list). + +### Список уровня доступа {#access-level-list} + +**Список уровня доступа** или **список разрешений** — список [SID](#access-sid)'ов [субъектов доступа](#access-subject), которым разрешён определённый [уровень доступа](#access-level). + +{{ ydb-short-name }} имеет несколько [списков уровней доступа](../reference/configuration/index.md#security-access-levels), совместно определяющих набор [уровней доступа](#access-level) в системе. ### Владелец {#access-owner} @@ -308,13 +329,21 @@ **[Пользователь](../security/authorization.md#user)** - лицо, использующее {{ ydb-short-name }} для выполнения конкретной функции. +Пользователь идентифицируется [SID](#access-sid). + ### Группа {#access-group} -**[Группа](../security/authorization.md#group)** или **группа доступа** - именованное множество [пользователей](#access-user) с одинаковыми [правами доступа](#access-right) к тем или иным [объектам доступа](#access-object). +**[Группа](../security/authorization.md#group)** или **группа доступа** - именованное множество [пользователей](#access-user) и других групп с равными возможностями для своих членов. + +Группа идентифицируется [SID](#access-sid). ### SID {#access-sid} - **SID** (**Security Identifier**) - строка вида `[@]`, идентифицирующая [субъект доступа](../concepts/glossary.md#access-subject) в [списках разрешений](#access-control-list). +**SID** или **security identifier** — строка вида `` или `@`, идентифицирующая [субъект доступа](../concepts/glossary.md#access-subject). Используется при [аутентификации](../security/authentication.md), [авторизации](../security/authorization.md), в [списках прав](#access-control-list) и в [списках уровней доступа](#access-level-list). + +SID идентифицирует индивидуального [пользователя](#access-user) или [группу пользователей](#access-group). + +Опциональный суффикс `@` идентифицирует источник субъекта доступа, то есть внешний каталог или систему, откуда он был получен. Например, пользователи или группы из LDAP-каталога могут иметь суффикс `@ldap`. Отсутствие суффикса означает, что пользователь или группа созданы и существуют непосредственно в {{ ydb-short-name }}. ### Оптимизатор запросов {#optimizer} diff --git a/ydb/docs/ru/core/devops/manual/initial-deployment.md b/ydb/docs/ru/core/devops/manual/initial-deployment.md index 292af112a8a9..27fc2c52ec02 100644 --- a/ydb/docs/ru/core/devops/manual/initial-deployment.md +++ b/ydb/docs/ru/core/devops/manual/initial-deployment.md @@ -484,7 +484,7 @@ sudo chmod 700 /opt/ydb/certs Если в файле настроек кластера включен режим аутентификации, то перед началом работы с кластером {{ ydb-short-name }} необходимо выполнить первоначальную настройку учетных записей. -При первоначальной установке кластера {{ ydb-short-name }} автоматически создается учетная запись `root` с пустым паролем, а также стандартный набор групп пользователей, описанный в разделе [{#T}](../../yql/reference/syntax/alter-group.md#builtin). +При первоначальной установке кластера {{ ydb-short-name }} автоматически создается учетная запись `root` с пустым паролем, а также стандартный набор групп пользователей, описанный в разделе [{#T}](../../security/builtin-security.md). Для выполнения первоначальной настройки учетных записей в созданном кластере {{ ydb-short-name }} выполните следующие операции: diff --git a/ydb/docs/ru/core/reference/configuration/index.md b/ydb/docs/ru/core/reference/configuration/index.md index 4fd6da53fa9b..fa4b410d6a12 100644 --- a/ydb/docs/ru/core/reference/configuration/index.md +++ b/ydb/docs/ru/core/reference/configuration/index.md @@ -125,20 +125,49 @@ hosts: ## domains_config — домен кластера {#domains-config} -Данный раздел содержит конфигурацию корневого домена кластера {{ ydb-short-name }}, включая [конфигурации Blob Storage](#domains-blob) (хранилища бинарных объектов), [State Storage](#domains-state) (хранилища состояний) и [аутентификации](#auth). - -### Синтаксис +Данный раздел содержит конфигурацию кластера {{ ydb-short-name }}, включая [конфигурации Blob Storage](#domains-blob) (хранилища бинарных объектов), [State Storage](#domains-state) (хранилища состояний) и [настройки безопасности](#security). ``` yaml domains_config: domain: - - name: <имя корневого домена> + - name: <имя корня кластера> storage_pool_types: <конфигурация Blob Storage> state_storage: <конфигурация State Storage> - security_config: <конфигурация аутентификации> + disable_builtin_security: false + default_groups: false + default_access: false + security_config: <конфигурация безопасности> ``` -## Конфигурация Blob Storage {#domains-blob} +{% note info %} + +Формально, поле `domain` может содержать много элементов, так как это список, но имеет значение только первый элемент; остальные будут проигнорированы (в кластере может быть только один «домен»). + +{% endnote %} + +Флаги `disable_builtin_security`, `default_groups`, `default_access` влияют на настройку кластера, осуществляемую только при первом старте кластера {{ ydb-short-name }}. + +#| +|| Параметр | Описание || +|| `disable_builtin_security` | Не выполнять [встроенную настройку безопасности](../../security/builtin-security.md). +Встроенная настройка включает автоматическое создание суперпользователя `root`, набора встроенных пользовательских групп и выдачу прав доступа этим группам на корне кластера. + +Эфемерный флаг, не попадает в конфигурацию, сохраняемую в кластере. + +Значение по умолчанию: `false`. + || +|| `default_groups` | Отказаться от создания [встроенных групп](../../security/builtin-security.md), даже если явные группы по умолчанию ([`security_config.default_groups`](#security)) не заданы. + +Значение по умолчанию: `false` + || +|| `default_access` | Отказаться от добавления прав на корне кластера для [встроенных групп](../../security/builtin-security.md), даже если явные права по умолчанию ([`security_config.default_access`](#security)) не заданы. + +Значение по умолчанию: `false` + || +|# + + +### Конфигурация Blob Storage {#domains-blob} Данный раздел определяет один или более типов пулов хранения, доступных в кластере для данных в базах данных, со следующими возможностями конфигурации: @@ -155,27 +184,27 @@ domains_config: `block-4-2` | Избыточность с коэффициентом 1,5, применяется для однодатацентровых кластеров. `mirror-3-dc` | Избыточность с коэффициентом 3, применяется для мультидатацентровых кластеров. -### Синтаксис - ``` yaml - storage_pool_types: - - kind: <имя пула хранения> - pool_config: - box_id: 1 - encryption_mode: <опциональный, укажите 1 для шифрования данных на диске> - erasure_species: <имя режима отказоустойчивости - none, block-4-2, or mirror-3-dc> - kind: <имя пула хранения - укажите то же значение, что выше> - pdisk_filter: - - property: - - type: <тип устройства для сопоставления с указанным в host_configs.drive.type> - vdisk_kind: Default - - kind: <имя пула хранения> - # ... +domains_config: + domain: + ... + storage_pool_types: + - kind: <имя пула хранения> + pool_config: + box_id: 1 + encryption_mode: <опциональный, укажите 1 для шифрования данных на диске> + erasure_species: <имя режима отказоустойчивости - none, block-4-2, or mirror-3-dc> + kind: <имя пула хранения - укажите то же значение, что выше> + pdisk_filter: + - property: + - type: <тип устройства для сопоставления с указанным в host_configs.drive.type> + vdisk_kind: Default + - kind: <имя пула хранения> ``` Каждой базе данных в кластере назначается как минимум один из доступных пулов хранения, выбираемый в операции создания базы данных. Имена пулов хранения среди назначенных могут быть использованы в атрибуте `DATA` при определении групп колонок в операторах YQL [`CREATE TABLE`](../../yql/reference/syntax/create_table/family.md)/[`ALTER TABLE`](../../yql/reference/syntax/alter_table/family.md). -## Конфигурация State Storage {#domains-state} +### Конфигурация State Storage {#domains-state} State Storage (хранилище состояний) — это независимое хранилище в памяти для изменяемых данных, поддерживающее внутренние процессы {{ ydb-short-name }}. Оно хранит реплики данных на множестве назначенных узлов. @@ -193,37 +222,231 @@ State Storage (хранилище состояний) — это независ При развертывании State Storage на кластерах, в которых применяется несколько пулов хранения с возможным сочетанием режимов отказоустойчивости, рассмотрите возможность увеличения количества узлов с распространением их на разные пулы хранения, так как недоступность State Storage приводит к недоступности всего кластера. -### Синтаксис - ```yaml -state_storage: -- ring: - node: <массив узлов StateStorage> - nto_select: <количество реплик данных в StateStorage> - ssid: 1 +domains_config: + ... + state_storage: + - ring: + node: <массив узлов StateStorage> + nto_select: <количество реплик данных в StateStorage> + ssid: 1 ``` Каждый клиент State Storage (например, таблетка DataShard) использует `nto_select` узлов для записи копий его данных в State Storage. Если State Storage состоит из большего количества узлов чем `nto_select`, то разные узлы могут быть использованы для разных клиентов, поэтому необходимо обеспечить, чтобы любое подмножество из `nto_select` узлов в пределах State Storage отвечало критериям отказоустойчивости. Для `nto_select` должны использоваться нечетные числа, так как использование четных чисел не улучшает отказоустойчивость по сравнению с ближайшим меньшим нечетным числом. -## Конфигурация аутентификации {#auth} - -[Режим аутентификации](../../security/authentication.md) на кластере {{ ydb-short-name }} задается в разделе `domains_config.security_config`. +### Конфигурация безопасности {#security} -### Синтаксис +В разделе `domains_config.security_config` задаются режимы [аутентификации](../../security/authentication.md), первичная конфигурация локальных [пользователей](../../concepts/glossary.md#access-user) и [групп](../../concepts/glossary.md#access-group) и их [права](../../concepts/glossary.md#access-right). ```yaml domains_config: ... security_config: - enforce_user_token_requirement: Bool - ... + # настройка режима аутентификации + enforce_user_token_requirement: false + enforce_user_token_check_requirement: false + default_user_sids: <аутентификационный токен для анонимных запросов> + all_authenticated_users: <имя группы всех аутентифицированных пользователей> + all_users_group: <имя группы всех пользователей> + + # первичные настройки безопасности + default_users: <список пользователей по умолчанию> + default_groups: <список групп по умолчанию> + default_access: <список прав по умолчанию на корне кластера> + + # настройки привилегий + viewer_allowed_sids: <список SID'ов с правами просмотра состояния кластера> + monitoring_allowed_sids: <список SID'ов с правами просмотра и изменения состояния кластера> + administration_allowed_sids: <список SID'ов с доступом администратора кластера> ``` -Ключ | Описание ---- | --- -`enforce_user_token_requirement` | Требовать токен пользователя.
Допустимые значения:
  • `false` — режим аутентификации анонимный, токен не требуется (применяется по умолчанию, если параметр не задан);
  • `true` — режим аутентификации по логину и паролю, для выполнения запроса требуется валидный токен пользователя.
+[//]: # (TODO: wait for pull/9387, dynamic_node_registration to add info about "register_dynamic_node_allowed_sids: <список SID'ов с правами подключения динамических нод в кластер>") + +#### Настройки режима аутентификации {#security-auth} + +#| +|| Параметр | Описание || +|| `enforce_user_token_requirement` | Режим обязательной [аутентификации](../../security/authentication.md). + +- `enforce_user_token_requirement: true` — аутентификация обязательна, запросы к {{ ydb-short-name }} обязаны сопровождаться [аутентификационным токеном](../../concepts/glossary.md#auth-token). + + Запросы проходят аутентификацию и проверку прав. + +- `enforce_user_token_requirement: false` — аутентификация опциональна, запросы к {{ ydb-short-name }} могут не сопровождаться [аутентификационным токеном](../../concepts/glossary.md#auth-token). + + Запросы без токена выполняются в [анонимном режиме](../../security/authentication.md#anonymous) и без проверки прав. + + Запросы с токеном проходят аутентификацию и проверку прав. Но в случае ошибок аутентификации, запросы не запрещаются, а выполняются в анонимном режиме. + + При `enforce_user_token_check_requirement: true` выполнение запросов с ошибкой аутентификации запрещается. + +[//]: # (TODO: добавить про ошибки проверки права на доступ к базе данных, когда появится место для ссылки) + +Взамен отсутствующего в запросах токена используется значение параметра `default_user_sids`, если параметр определён и не пустой (см. описание ниже). Тогда аутентификация и проверка прав проводится для [субъекта доступа](../../concepts/glossary.md#access-subject), заданного `default_user_sids`. + +Значение по умолчанию: `false`. + || +|| `enforce_user_token_check_requirement` | Запрещает игнорировать ошибки аутентификации в режиме `enforce_user_token_requirement: false`. + +Значение по умолчанию: `false`. + || +|| `default_user_sids` | Список [SID](../../concepts/glossary.md#access-sid)'ов для использования в проверке аутентификации в случае, когда входящий запрос не сопровождается явным [аутентификационным токеном](../../concepts/glossary.md#auth-token). + +`default_user_sids` играет роль аутентификационного токена для анонимных запросов. Первым элементом в списке должен быть SID пользователя, за ним должны идти SID'ы групп, к которым пользователь принадлежит. + +Непустой `default_user_sids` позволяет использовать режим обязательной аутентификации (`enforce_user_token_requirement: true`) вместе с анонимными запросами. Это может быть полезно в определённых сценариях тестирования {{ ydb-short-name }} или в ознакомительных целях для локальных баз данных. + +Значение по умолчанию: пустой список. + || +|| `all_authenticated_users` | Имя виртуальной [группы](../../concepts/glossary.md#access-group), в которой состоят все аутентифицированные [пользователи](../../concepts/glossary.md#access-user). + +Виртуальную группу не нужно явно создавать, она ведётся системой автоматически. Виртуальную группу нельзя удалить, нельзя получить или изменить список её членов. +Пользователь может использовать её для выдачи [прав](../../concepts/glossary.md#access-right) на [схемных объектах](../../concepts/glossary.md#scheme-object). + +Значение по умолчанию: `all-users@well-known`. + || +|| `all_users_group` | Имя [группы](../../concepts/glossary.md#access-group), в которую должны добавляться все локальные [пользователи](../../concepts/glossary.md#access-user). + +Если `all_users_group` не пустая, то все локальные пользователи в момент создания будут добавляться в группу с указанным именем. В момент создания пользователей группа должна существовать. + +`all_users_group` автоматически конфигурируется при выполнении [встроенной настройки безопасности](../../security/builtin-security.md). + +Значение по умолчанию: пустая строка. + || +|# + +#### Первичные настройки безопасности {#security-bootstrap} + +Параметры `default_users`, `default_groups`, `default_access` влияют на настройку кластера, осуществляемую при первом старте {{ ydb-short-name }}. При последующих запусках первичная настройка не выполняется, эти параметры игнорируются. + +См. также раздел по [встроенной настройке безопасности](../../security/builtin-security.md) и влияющие на неё настройки [уровня `domains_config`](#domains-config). + +#| +|| Параметр | Описание || +|| `default_users` | Какие [пользователи](../../concepts/glossary.md#access-user) должны быть созданы на кластере при первом запуске. + +Список пар логин-пароль. Первый пользователь становится суперпользователем. + +{% note info %} + +Пароли задаются в открытом виде и оставлять их действующими на долгое время небезопасно. Поэтому после первого запуска кластера и его настройки рекомендуется пароли стартовым пользователям поменять средствами {{ ydb-short-name }} (например, [`ALTER USER`](../../yql/reference/syntax/alter-user.md)). + +[//]: # (TODO: добавить про возможность блокировки этих стартовых пользователей, когда такое описание появится) + +{% endnote %} + +Пример: + +```yaml +default_users: +- name: root + password: <...> +- name: user1 + password: <...> +``` + +Ошибки в списке (повторение логинов) фиксируются в логе, но не влияют на запуск кластера. + + || +|| `default_groups` | Какие [группы](../../concepts/glossary.md#access-group) должны быть созданы на кластере при первом запуске. + +Список групп и их членов. + +Пример: + +```yaml +default_groups: +- name: ADMINS + members: root +- name: USERS + members: + - ADMINS + - root + - user1 +``` + +Порядок перечисления групп важен: группы создаются в порядке перечисления, и указанные члены группы к моменту создания группы должны существовать, иначе они не будут добавлены в группу. + +Ошибки добавления членов групп фиксируются в логе, но не влияют на запуск кластера. + + || +|| `default_access` | Какие [права](../../concepts/glossary.md#access-right) должны быть выданы на корне кластера. + +Список разрешений в формате [краткой записи управления доступом](../../security/short-access-control-notation.md). + +Пример: + +```yaml +default_access: +- +(CDB|DDB|GAR):ADMINS +- +(ConnDB):USERS +``` + + || +|# + +Ошибки в строках прав доступа фиксируются в логе, но не влияют на запуск кластера. Право доступа с ошибкой не будет добавлено. + +[//]: # (TODO: требуется доработка, сейчас ошибка в формате приводит к падению процесса) + +#### Настройки административных и других привилегий {#security-access-levels} + +Управление доступом в {{ ydb-short-name }} реализуется двумя механизмами: + +- [списками прав](../../concepts/glossary.md#access-control-list) на [схемных объектах](../../concepts/glossary.md#scheme-object); +- [уровнями доступа](../../concepts/glossary.md#access-level-list), определяющими дополнительные возможности или ограничения. + +Оба механизма применяются одновременно: для конкретного [субъекта](../../concepts/glossary.md#access-subject) действие оказывается доступно, если оба механизма его разрешают, и не доступно, если хотя бы один не разрешает. + +Уровень доступа субъекта определяется списками разрешений, заданными в конфигурации кластера, и влияет на дополнительные возможности субъекта при работе со [схемными объектами](../../concepts/glossary.md#scheme-object), а также на возможности субъекта в контекстах, не связанных со схемными объектами. + +[//]: # (TODO: добавить ссылку на справку по viewer api и требуемым правам, когда она появится) + +#| +|| Параметр | Описание || +|| `viewer_allowed_sids` | Список [SID](../../concepts/glossary.md#access-sid)'ов с доступом уровня наблюдателя. + +Даёт возможность просмотра состояния системы, закрытого от публичного доступа (это большая часть страниц Embedded UI ([YDB Monitoring](../embedded-ui/ydb-monitoring.md))), без возможности делать изменения. + || +|| `monitoring_allowed_sids` | Список [SID](../../concepts/glossary.md#access-sid)'ов с доступом уровня оператора. + +Даёт дополнительные возможности просмотра и выполнения действий, меняющих состояние системы. Например, выполнение бекапа, восстановления базы или выполнение YQL-запросов через Embedded UI. + || +|| `administration_allowed_sids` | Список [SID](../../concepts/glossary.md#access-sid)'ов с доступом уровня администратора. + +Даёт право на выполнение административных действий с базами или кластером. + || +|# + +[//]: # (TODO: wait for pull/9387, dinamic_node_registration to add info about `register_dynamic_node_allowed_sids`) + +{% note warning %} + +По-умолчанию, все списки пустые. + +Пустой список разрешает доступ любому пользователю (включая анонимного пользователя). + +Все три пустых списка дают возможности администратора любому пользователю системы. + +Для защищённого развёртывания {{ ydb-short-name }} важно заранее определить модель прав и прописать в списках соответствующие группы. + +{% endnote %} + +В списках могут перечисляться индивидуальные SID'ы [пользователей](../../concepts/glossary.md#access-user) или SID'ы [групп пользователей](../../concepts/glossary.md#access-group). Принадлежность пользователя к списку определяется по прямому вхождению или по вхождению в список любой его группы (рекурсивно). +Рекомендуется включать в списки `*_allowed_sids` группы и отдельные сервисные аккаунты, тогда наделение индивидуальных пользователей соответствующими возможностями не будет требовать изменения общей конфигурации кластера. + +Списки разрешений можно воспринимать как слои дополнительных разрешений: + +- Субъект, не состоящий ни в одном списке разрешений, имеет возможность просмотра публично доступной информации в системе (например, может видеть [список баз на кластере](../embedded-ui/ydb-monitoring.md#tenant_list_page) или [список узлов кластера](../embedded-ui/ydb-monitoring.md#node_list_page)). +- Списки `viewer_allowed_sids`, `monitoring_allowed_sids`, `administration_allowed_sids` последовательно наращивают возможности субъекта. Максимальные возможности требуют включения во все три списка. +- Присутствие в списке `monitoring_allowed_sids` или `administration_allowed_sids` без присутствия во `viewer_allowed_sids` не имеет смысла. + +Например: + +- оператор должен состоять (прямо или через группы) во `viewer_allowed_sids` и в `monitoring_allowed_sids`; +- полноценный администратор должен состоять во `viewer_allowed_sids`, `monitoring_allowed_sids` и в `administration_allowed_sids`. ### Примеры {#domains-examples} @@ -599,19 +822,19 @@ blob_storage_config: Для конфигурации расположенной в 3 AZ необходимо указать 3 кольца. Для конфигураций, расположенных в одной AZ, указывается ровно одно кольцо. -## Конфигурирование провайдеров аутентификации {#auth-config} +## Конфигурация аутентификации {#auth-config} -{{ ydb-short-name }} позволяет использовать различные способы аутентификации пользователя. Конфигурирование провайдеров аутентификации задается в секции `auth_config`. +{{ ydb-short-name }} позволяет использовать различные способы аутентификации пользователя в системе. Настройки аутентификации и провайдеров аутентификации задаются в секции `auth_config`. ### Конфигурация LDAP аутентификации {#ldap-auth-config} -Одним из способов аутентификации пользователей в {{ ydb-short-name }} является использование LDAP каталога. Подробнее о таком виде аутентификации написано в разделе про [взаимодействие {{ ydb-short-name }} с LDAP каталогом](../../security/authentication.md#ldap-auth-provider). Для конфигурирования LDAP аутентификации необходимо описать секцию `ldap_authentication`. +Одним из способов аутентификации пользователей в {{ ydb-short-name }} является использование LDAP каталога. Подробнее о таком виде аутентификации написано в разделе про [использование LDAP каталога](../../security/authentication.md#ldap). Для конфигурирования LDAP аутентификации необходимо описать секцию `ldap_authentication`. Пример секции `ldap_authentication`: ```yaml auth_config: - #... + ... ldap_authentication: hosts: - "ldap-hostname-01.example.net" @@ -633,7 +856,7 @@ auth_config: enable_nested_groups_search: true refresh_time: "1h" - #... + ... ``` Параметр | Описание diff --git a/ydb/docs/ru/core/security/admin-users.md b/ydb/docs/ru/core/security/admin-users.md new file mode 100644 index 000000000000..86c09874fd83 --- /dev/null +++ b/ydb/docs/ru/core/security/admin-users.md @@ -0,0 +1,59 @@ +# Привилегированные пользователи + +- `root` -- суперпользователь +- администратор кластера (СУБД) +- администратор базы + +## Суперпользователь + +Суперпользователь создаётся при первом развёртывании кластера. + +По-умолчанию суперпользователь имеет логин `root` и пустой пароль. + +Задать другое имя и пароль для суперпользователя можно в секции [`auth_config`](../reference/configuration/index.md#auth-config) конфигурации кластера. Суперпользователем становится первый пользователь из списка `auth_config.default_users`. + +TODO: суперпользователь -- не полный суперпользователь, если не состоит прямо или косвенно в `domains_config.security_config.administration_allowed_sids`. + +## Администратор кластера (СУБД) + +Администратор кластера имеет неограниченные права на всём кластере. + +Для этого администратор кластера должен: + +1. принадлежать списку `domains_config.security_config.administration_allowed_sids` +2. и иметь полные права на корне схемы кластера + +Принадлежность списку `domains_config.security_config.administration_allowed_sids` определяется прямым вхождением или через группу. + +Например, если кластер развёрнут со [встроенными группами безопасности](./builtin-security.md), то администратор кластера должен принадлежать группе `ADMINS`. + +## Администратор базы данных + +--- + +## Конфиг + +## Пользователи, группа и права по-умолчанию + +`auth_config.default_users` -- какие пользователи должны быть созданы на кластере по-умолчанию +`auth_config.default_groups` -- какие группы должны быть созданы на кластере по-умолчанию +`auth_config.default_access` -- права доступа по-умолчанию на корне кластера + +## Справка по конфигурации + +Эфемерные флаги: + - `domains_config.disable_builtin_security` -- отключить ли использование суперпользователя `root`, "встроенных" групп, и "встроенных" прав доступа на корне кластера (флаг, default: false) + - `domains_config.default_groups` -- регистрировать ли "встроенные" группы, если явные группы по-умолчанию `auth_config.default_groups` не заданы (флаг, default: false) + - `domains_config.default_access` -- прописывать ли "встроенные" права доступа на корне кластера (флаг, default: false) + +`auth_config.default_users` -- какие пользователи должны быть созданы на кластере по-умолчанию (список пар логин-пароль), первый пользователь становится суперпользователем) +`auth_config.default_groups` -- какие группы должны быть созданы на кластере по-умолчанию +`auth_config.default_access` -- права доступа по-умолчанию на корне кластера + +`auth_config.use_builtin_domain` -- разрешено ли использование "встроенных" sid'ов (из аутентификационного домена `@builtin`): `root@builtin` и т.п. (default: true) +`auth_config.enable_login_authentication` -- включена ли возможность логина (то есть обмена логина-пароля на токен) (default: true) + +`auth_config.domain_login_only` -- логины делаются только против корневой базы (то есть против кластера) или можно логиниться в конкретную базу (default: true) + +`auth_config.all_authenticated_users` -- sid для виртуальной группы пользователей, прошедших аутентификацию. Автоматически добавляется к пользовательскому токену в момент аутентификации (default: `all-users@well-known`) + diff --git a/ydb/docs/ru/core/security/authentication.md b/ydb/docs/ru/core/security/authentication.md index d421cbae8b9b..5c24463dd7b8 100644 --- a/ydb/docs/ru/core/security/authentication.md +++ b/ydb/docs/ru/core/security/authentication.md @@ -1,6 +1,6 @@ # Аутентификация -После успешной установки сетевого соединения сервер принимает к обработке запросы от клиента, в которых передается аутентификационная информация. На ее основании сервер определяет учетную запись (аккаунт) клиента и проверяет доступ на выполнение запроса. +После успешной установки сетевого соединения сервер принимает к обработке запросы от клиента, в которых передается аутентификационная информация в виде [аутентификационного токена](../concepts/glossary.md#auth-token). На ее основании сервер определяет [SID](../concepts/glossary.md#access-sid) клиента и проверяет его доступы на выполнение запроса. {% note info %} @@ -8,18 +8,18 @@ {% endnote %} -Поддерживаются следующие режимы аутентификации: +Поддерживаются следующие виды аутентификации: * [Анонимная](#anonymous) аутентификация. * Аутентификация по [логину и паролю](#static-credentials). -* Аутентификация с использованием [LDAP каталога](#ldap-auth-provider). +* Аутентификация с использованием [LDAP-каталога](#ldap). * [Аутентификация с использованием стороннего IAM-провайдера](#iam), например [Yandex Identity and Access Management](https://yandex.cloud/ru/docs/iam/). ## Анонимная аутентификация {#anonymous} -В данном режиме допускается логин без указания аутентификационных данных, таких как имя пользователя или токен. В этом случае также не производится [авторизация](authorization.md) (проверка прав доступа). +По умолчанию, {{ ydb-short-name }} допускает выполнение запросов без указания аутентификационных данных, таких как имя пользователя или [токен](../concepts/glossary.md#auth-token). Проверка прав доступа ([авторизация](authorization.md)) при этом также не проводится. -Но если будет указан пользователь или токен, то будет работать соответствующий режим аутентификации с последующей авторизацией. +Анонимный запрос не может выполнить в системе действия, требующие [административного уровня доступа](../reference/configuration/index.md#security-access-levels). {% note warning %} @@ -27,7 +27,14 @@ {% endnote %} -За включение анонимной аутентификации отвечает ключ `enforce_user_token_requirement` в [конфигурационном файле](../reference/configuration/index.md#auth) кластера. +За выключение режима анонимной аутентификации отвечает флаг `enforce_user_token_requirement` в [настройках режима аутентификации](../reference/configuration/index.md#security-auth) {{ ydb-short-name }}. + +В зависимости от других настроек режима аутентификации, реальная аутентификация может быть не анонимной: + +- Отсутствующий в запросах токен может подменяться на токен по умолчанию +- Явно указанный в запросах токен может проверяться по надлежащим правилам + +Тогда запросы будут выполняться не анонимно, и будет также выполняться проверка прав. ## Аутентификация по логину и паролю {#static-credentials} @@ -37,7 +44,7 @@ Логин пользователя и хеш пароля хранятся в таблице внутри компонента аутентификации. Пароль хеширован методом [Argon2](https://ru.wikipedia.org/wiki/Argon2). Доступ к этой таблице имеет только администратор системы. -В ответ на логин и пароль возвращается токен. Время жизни токена по умолчанию составляет 12 часов. Для ротации токенов клиент, например, [SDK](../reference/ydb-sdk/index.md), самостоятельно обращается к сервису аутентификации. Использование токена ускоряет процесс аутентификации и повышает безопасность. +В ответ на логин и пароль возвращается [аутентификационный токен](../concepts/glossary.md#auth-token). Время жизни токена по умолчанию составляет 12 часов. Для ротации токенов клиент, например, [SDK](../reference/ydb-sdk/index.md), самостоятельно обращается к сервису аутентификации. Использование токена ускоряет процесс аутентификации и повышает безопасность. Процесс аутентификации по логину и паролю включает следующие шаги: @@ -45,45 +52,21 @@ 1. Сервис проверяет аутентификационные данные, при успешном сопоставлении создаёт токен и возвращает его клиенту. 1. Клиент обращается к БД, передавая в качестве аутентификационной информации токен. -Для включения аутентификации по логину и паролю укажите значение `true` для ключа `enforce_user_token_requirement` в [конфигурационном файле](../reference/configuration/index.md#auth) кластера. +Аутентификация по логину и паролю работает по умолчанию. + +[//]: # (TODO: упомянуть и дать ссылку на auth_config.enable_login_authentication, когда auth_config будет описана) Об управлении ролями и пользователями читайте в [{#T}](../security/authorization.md). -## Взаимодействие с LDAP каталогом {#ldap-auth-provider} +## Аутентификация с использованием LDAP-каталога {#ldap} В {{ ydb-short-name }} интегрировано взаимодействие с [LDAP каталогом](https://ru.wikipedia.org/wiki/LDAP). LDAP каталог является внешним по отношению к {{ ydb-short-name }} сервисом и используется для аутентификации и авторизации пользователей базы данных. Прежде чем воспользоваться данным способом аутентификации и авторизации необходимо иметь развернутый LDAP сервис и настроенный сетевой доступ между ним и серверами {{ ydb-short-name }}. Примеры поддерживаемых реализаций LDAP каталогов: [OpenLdap](https://openldap.org/), [Active Directory](https://azure.microsoft.com/en-us/products/active-directory/). -## Аутентификация с использованием стороннего IAM-провайдера {#iam} - -* **Access Token** — параметром для клиента (SDK или CLI) задается фиксированный токен, который передается в запросы. -* **Refresh Token** — параметром для клиента (SDK или CLI) задается [OAuth токен](https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/) персональной учетной записи, на основании которого клиент периодически в фоновом режиме обращается к IAM API для ротации (получения следующего) токена, передаваемого в запросы. -* **Service Account Key** — параметром для клиента (SDK или CLI) задаются атрибуты сервисной учетной записи и ключ для подписи, на основании которых клиент периодически в фоновом режиме обращается к IAM API для ротации (получения следующего) токена, передаваемого в запросы. -* **Metadata** — клиент (SDK или CLI) периодически обращается к локальному сервису для ротации (получения следующего) токена, передаваемого в запросы. -* **OAuth 2.0 token exchange** - клиент (SDK или CLI) обменивает токен другого типа на access token по [протоколу обмена токенов OAuth 2.0](https://www.rfc-editor.org/rfc/rfc8693), который затем передаётся в запросы {{ ydb-short-name }} API. - -Любой обладатель валидного токена может получить доступ на выполнение операций, поэтому главная задача системы безопасности — обеспечение секретности токена и предотвращение его компрометации. - -Режимы аутентификации с ротацией токена **Refresh Token** и **Service Account Key** обеспечивают больший уровень безопасности по сравнению с режимом с фиксированным токеном **Access Token**, так как на сервер {{ ydb-short-name }} по сети передаются только короткоживущие секреты. - -Максимальная безопасность и производительность обеспечивается при использовании режима **Metadata**, так как он исключает необходимость работы с секретами при развертывании приложения, а также позволяет обратиться к IAM и закешировать токен заранее, до запуска приложения. - -При выборе режима аутентификации среди поддерживаемых сервером и окружением, следует руководствоваться следующими рекомендациями: - -* **Anonymous** обычно применяется на самостоятельно разворачиваемых локальных кластерах {{ ydb-short-name }}, недоступных по сети. -* **Access Token** применяется при отсутствии поддержки других режимов на стороне сервера или в настроечных/отладочных целях. Он не требует взаимодействий клиента с IAM. Однако, если IAM поддерживает API для ротации токенов, то обычно выдаваемые таким IAM фиксированные токены имеют короткий срок жизни, что вынуждает регулярно обновлять их в IAM вручную заново. -* **Refresh Token** может применяться при выполнении разовых ручных операций под персональной учетной записью, например, связанных с обслуживанием данных в БД, выполнением ad-hoc операций в CLI, или запусками приложений с рабочей станции. Такой токен можно получить вручную в IAM один раз на долгий срок и сохранить в переменной окружения на личной рабочей станции для автоматического применения при запуске CLI без дополнительных параметров аутентификации. -* **Service Account Key** применяется в первую очередь для приложений, рассчитанных на эксплуатацию в окружениях, где поддерживается режим **Metadata**, при их тестировании вне таких окружений (например, на рабочей станции). Также он может применяться для приложений вне таких окружений, работая как аналог **Refresh Token** для сервисных учетных записей. В отличие от персональной учетной записи, объекты доступа и роли сервисной учетной записи могут быть ограничены. -* **Metadata** применяется при разворачивании приложений в облаках. В настоящее время этот режим поддерживается на виртуальных машинах и в {{ sf-name }} {{ yandex-cloud }}. - -Токен для указания в параметрах может быть получен в системе IAM, с которой связана конкретная установка {{ ydb-short-name }}. В частности, для сервиса {{ ydb-short-name }} в {{ yandex-cloud }} применяется Yandex.Passport OAuth и сервисные аккаунты {{ yandex-cloud }}. При использовании {{ ydb-short-name }} в корпоративных контекстах могут применяться стандартные для данной организации системы централизованной аутентификации. - -При использовании режимов, предусматривающих обращение клиента {{ ydb-short-name }} к IAM, дополнительно может быть задан URL IAM, предоставляющий API выдачи токенов. По умолчанию в существующих SDK и CLI производится попытка обращения к API IAM {{ yandex-cloud }}, размещенному на `iam.api.cloud.yandex.net:443`. - ### Аутентификация -Аутентификация с помощью LDAP протокола похожа на процесс аутентификации по логину и паролю. Отличие заключается лишь в том, что роль компонента аутентификации играет LDAP каталог. LDAP каталог используется только для проверки пары логин/пароль. +Аутентификация с помощью LDAP протокола похожа на процесс аутентификации по логину и паролю. Отличие заключается лишь в том, что роль компонента аутентификации играет LDAP каталог. LDAP каталог используется для проверки пары логин/пароль и для определения групп, к которым принадлежит пользователь. {% note info %} @@ -91,9 +74,9 @@ {% endnote %} -На данный момент {{ ydb-short-name }} поддерживает только один способ LDAP аутентификации, так называемый search+bind метод, состоящий из нескольких шагов. После получения логина и пароля пользователя, которого нужно аутентифицировать, выполняется операция *bind* с заранее определенными в секции [ldap_authentication](../reference/configuration/index.md#ldap-auth-config) учетными данными специального сервисного аккаунта. Учетные данные такого сервисного аккаунта задаются через параметры конфигурации **bind_dn** и **bind_password**. После успешной аутентификации сервисного пользователя от его имени выполняется поиск в LDAP каталоге пользователя, который пытается аутентифицироваться в системе. Операция *search* выполняется для всего поддерева, корень которого берется из параметра конфигурации **base_dn**. Поиск записи в поддереве осуществляется в соответствии с фильтром, задаваемым в параметре конфигурации **search_filter**. После того как запись пользователя была найдена, {{ ydb-short-name }} выполняет повторную операцию *bind* от лица этого найденного пользователя, используя ранее запрошенный пароль. Успех аутентификации пользователя определяется результатом повторной операции *bind*. +На данный момент {{ ydb-short-name }} поддерживает только один способ LDAP аутентификации, так называемый *search+bind* метод, состоящий из нескольких шагов. После получения логина и пароля пользователя, которого нужно аутентифицировать, выполняется операция *bind* с заранее определенными в секции [ldap_authentication](../reference/configuration/index.md#ldap-auth-config) учетными данными специального сервисного аккаунта. Учетные данные такого сервисного аккаунта задаются через параметры конфигурации `bind_dn` и `bind_password`. После успешной аутентификации сервисного пользователя от его имени выполняется поиск в LDAP каталоге пользователя, который пытается аутентифицироваться в системе. Операция *search* выполняется для всего поддерева, корень которого берется из параметра конфигурации `base_dn`. Поиск записи в поддереве осуществляется в соответствии с фильтром, задаваемым в параметре конфигурации `search_filter`. После того как запись пользователя была найдена, {{ ydb-short-name }} выполняет повторную операцию *bind* от лица этого найденного пользователя, используя ранее запрошенный пароль. Успех аутентификации пользователя определяется результатом повторной операции *bind*. -После успешной аутентификации пользователя формируется токен. Далее этот токен используется вместо логина и пароля. Оперирование токеном ускоряет процесс аутентификации и повышает безопасность. +В результате успешной проверки логина и пароля пользователя в LDAP каталоге возвращается [аутентификационный токен](../concepts/glossary.md#auth-token) {{ ydb-short-name }}. Далее этот токен используется вместо логина и пароля. Оперирование токеном ускоряет процесс аутентификации и повышает безопасность. {% note info %} @@ -107,15 +90,15 @@ Группы, как и сам пользователь, являются субъектами выполнения операций над объектами схемы базы данных. Для разграничения доступа к различным ресурсам базы данных субъектам могут назначаться права доступа. И в соответствии со списком назначенных прав субъекты будут авторизованы на выполнение тех или иных операций. -Процесс получения списка групп пользователя из LDAP каталога похож на те действия, которые выполняются при аутентификации. Сначала выполняется операция *bind* для сервисного пользователя, учетные данные которого записаны в параметрах **bind_dn** и **bind_password** секции [ldap_authentication](../reference/configuration/index.md#ldap-auth-config) файла конфигурации. После успешной аутентификации выполняется поиск записи пользователя, для которого был ранее сформирован токен. Поиск также выполняется в соответствии с параметром **search_filter**. Если пользователь всё ещё существует, то в качестве возвращаемого результата операции *search* будет список значений атрибута, записанного в параметре **requested_group_attribute**. В случае, если этот параметр пуст, то аттрибутом обратного членства в группе будет являться *memberOf*. Атрибут *memberOf* хранит уникальные имена (Distinguished Name, DN) групп, в которых состоит пользователь. +Процесс получения списка групп пользователя из LDAP каталога похож на те действия, которые выполняются при аутентификации. Сначала выполняется операция *bind* для сервисного пользователя, учетные данные которого записаны в параметрах `bind_dn` и `bind_password` секции [ldap_authentication](../reference/configuration/index.md#ldap-auth-config) файла конфигурации. После успешной аутентификации выполняется поиск записи пользователя, для которого был ранее сформирован токен. Поиск также выполняется в соответствии с параметром `search_filter`. Если пользователь всё ещё существует, то в качестве возвращаемого результата операции *search* будет список значений атрибута, записанного в параметре `requested_group_attribute`. В случае, если этот параметр пуст, то аттрибутом обратного членства в группе будет являться `memberOf`. Атрибут `memberOf` хранит уникальные имена (Distinguished Name, DN) групп, в которых состоит пользователь. #### Получение групп -По умолчанию {{ ydb-short-name }} выполняет поиск только тех групп, в которых пользователь состоит непосредственно. С помощью включения флага **extended_settings.enable_nested_groups_search** секции [ldap_authentication](../reference/configuration/index.md#ldap-auth-config) {{ ydb-short-name }} будет пытаться получить группы на всех уровнях вложенности, а не только те, в которые пользователь входит напрямую. Если {{ ydb-short-name }} настроен для работы с Active Directory, для поиска всех вложенных групп будет использовано специфичное для Active Directory правило соответствия [LDAP_MATCHING_RULE_IN_CHAIN](https://learn.microsoft.com/en-us/windows/win32/adsi/search-filter-syntax?redirectedfrom=MSDN). Это правило позволяет получить все вложенные группы одним запросом. Для LDAP-серверов на основе OpenLDAP поиск групп будет выполнен рекурсивным обходом графа, что в общем случае требует выполнения нескольких запросов. Как для Active Directory, так и для OpenLDAP поиск групп будет выполнен только для поддерева, корень которого берётся из параметра конфигурации **base_dn**. +По умолчанию {{ ydb-short-name }} выполняет поиск только тех групп, в которых пользователь состоит непосредственно. С помощью включения флага `extended_settings.enable_nested_groups_search` секции [ldap_authentication](../reference/configuration/index.md#ldap-auth-config) {{ ydb-short-name }} будет пытаться получить группы на всех уровнях вложенности, а не только те, в которые пользователь входит напрямую. Если {{ ydb-short-name }} настроен для работы с Active Directory, для поиска всех вложенных групп будет использовано специфичное для Active Directory правило соответствия [LDAP_MATCHING_RULE_IN_CHAIN](https://learn.microsoft.com/en-us/windows/win32/adsi/search-filter-syntax?redirectedfrom=MSDN). Это правило позволяет получить все вложенные группы одним запросом. Для LDAP-серверов на основе OpenLDAP поиск групп будет выполнен рекурсивным обходом графа, что в общем случае требует выполнения нескольких запросов. Как для Active Directory, так и для OpenLDAP поиск групп будет выполнен только для поддерева, корень которого берётся из параметра конфигурации `base_dn`. {% note info %} -В текущей реализации имена групп, которыми будет оперировать {{ ydb-short-name }}, совпадают с теми значениями, которые записаны в атрибуте *memberOf*. Они могут иметь большую длину и быть сложночитаемыми. +В текущей реализации имена групп, которыми будет оперировать {{ ydb-short-name }}, совпадают с теми значениями, которые записаны в атрибуте `memberOf`. Они могут иметь большую длину и быть сложночитаемыми. Пример: @@ -127,7 +110,7 @@ cn=Developers,ou=Groups,dc=mycompany,dc=net@ldap {% note info %} -В секции конфигурационного файла, описывающего аутентификационную информацию, можно настроить частоту обновления информации о пользователе и его группах. Этот показатель регулируется параметром **refresh_time**. Подробную информацию о файлах конфигурации можно узнать в разделе о [конфигурировании кластера](../reference/configuration/index.md#auth-config). +В секции конфигурационного файла, описывающего аутентификационную информацию, можно настроить частоту обновления информации о пользователе и его группах. Этот показатель регулируется параметром `refresh_time`. Подробную информацию о файлах конфигурации можно узнать в разделе о [конфигурировании кластера](../reference/configuration/index.md#auth-config). {% endnote %} @@ -137,11 +120,11 @@ cn=Developers,ou=Groups,dc=mycompany,dc=net@ldap {% endnote %} -### LDAP пользователи и группы в {{ ydb-short-name }} +### LDAP-пользователи и LDAP-группы в {{ ydb-short-name }} -Так как {{ ydb-short-name }} позволяет использовать различные способы аутентификации пользователя (аутентификация по логину и паролю, использование IAM провайдера, LDAP каталог), то, оперируя именами пользователей и групп, часто бывает полезно различать, где именно аутентифицировался пользователь. Для всех видов аутентификации, кроме аутентификации по логину и паролю, имена групп и пользователей дополняются суффиксом вида `<имя_пользователя>@`. +Так как {{ ydb-short-name }} позволяет использовать разные способы аутентификации пользователя, то, оперируя именами пользователей и групп, часто бывает полезно различать, где именно аутентифицировался пользователь. Для всех видов аутентификации, кроме аутентификации по логину и паролю, имена групп и пользователей дополняются суффиксом вида `@`. -Для LDAP пользователей *domain* задается в [параметре конфигурации](../reference/configuration/index.md#ldap-auth-config) **ldap_authentication_domain**. По умолчанию имеет значение `ldap`, поэтому все имена пользователей, аутентифицированных с помощью LDAP каталога, и имена групп, в которых они состоят, в {{ ydb-short-name }} будут иметь следующий вид: +Для LDAP пользователей *auth-domain* задается в [параметре конфигурации](../reference/configuration/index.md#ldap-auth-config) `ldap_authentication_domain`. По умолчанию имеет значение `ldap`, поэтому все имена пользователей, аутентифицированных с помощью LDAP каталога, и имена групп, в которых они состоят, в {{ ydb-short-name }} будут иметь следующий вид: - `user1@ldap` - `group1@ldap` @@ -149,7 +132,7 @@ cn=Developers,ou=Groups,dc=mycompany,dc=net@ldap {% note warning %} -Чтобы различать, что введенный логин должен быть логином пользователя из LDAP каталога, а не логином для аутентификации по логину и паролю, к нему нужно добавлять суффикс домена LDAP-аутентификации. Суффикс задается через параметр конфигурации **ldap_authentication_domain**. +Чтобы различать, что введенный логин должен быть логином пользователя из LDAP каталога, а не логином локального пользователя {{ ydb-short-name }}, к нему нужно добавлять суффикс `@ldap`. Ниже приведены примеры аутентификации пользователя `user1` используя [{{ ydb-short-name }} CLI](../reference/ydb-cli/index.md): @@ -174,3 +157,30 @@ cn=Developers,ou=Groups,dc=mycompany,dc=net@ldap #### Расширение LDAP протокола `StartTls` {#starttls} `StartTls` — это расширение протокола LDAP, используемое для шифрования сообщений по протоколу TLS. Оно позволяет передавать в рамках одного соединения с LDAP-сервером одни сообщения в зашифрованном виде, а другие — открыто. Сообщение с этим расширением отправляется от {{ ydb-short-name }} к LDAP-серверу для инициирования TLS-соединения. В случае {{ ydb-short-name }} не предусмотрено включение и выключение TLS-соединения в рамках одного соединения. Поэтому при использовании расширения `StartTls` после установления зашифрованного соединения {{ ydb-short-name }} будет отправлять все дальнейшие сообщения к LDAP-серверу в зашифрованном виде. Одним из преимуществ использования данного расширения вместо схемы `ldaps` (при соответствующей настройке LDAP-сервера) является возможность установить TLS-соединение на нешифрованном порту. Расширение включается в [секции `use_tls`](../reference/configuration/index.md#ldap-auth-config) файла конфигурации. + + +## Аутентификация с использованием стороннего IAM-провайдера {#iam} + +* **Access Token** — параметром для клиента (SDK или CLI) задается фиксированный токен, который передается в запросы. +* **Refresh Token** — параметром для клиента (SDK или CLI) задается [OAuth токен](https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/) персональной учетной записи, на основании которого клиент периодически в фоновом режиме обращается к IAM API для ротации (получения следующего) токена, передаваемого в запросы. +* **Service Account Key** — параметром для клиента (SDK или CLI) задаются атрибуты сервисной учетной записи и ключ для подписи, на основании которых клиент периодически в фоновом режиме обращается к IAM API для ротации (получения следующего) токена, передаваемого в запросы. +* **Metadata** — клиент (SDK или CLI) периодически обращается к локальному сервису для ротации (получения следующего) токена, передаваемого в запросы. +* **OAuth 2.0 token exchange** - клиент (SDK или CLI) обменивает токен другого типа на access token по [протоколу обмена токенов OAuth 2.0](https://www.rfc-editor.org/rfc/rfc8693), который затем передаётся в запросы {{ ydb-short-name }} API. + +Любой обладатель валидного токена может получить доступ на выполнение операций, поэтому главная задача системы безопасности — обеспечение секретности токена и предотвращение его компрометации. + +Режимы аутентификации с ротацией токена **Refresh Token** и **Service Account Key** обеспечивают больший уровень безопасности по сравнению с режимом с фиксированным токеном **Access Token**, так как на сервер {{ ydb-short-name }} по сети передаются только короткоживущие секреты. + +Максимальная безопасность и производительность обеспечивается при использовании режима **Metadata**, так как он исключает необходимость работы с секретами при развертывании приложения, а также позволяет обратиться к IAM и закешировать токен заранее, до запуска приложения. + +При выборе режима аутентификации среди поддерживаемых сервером и окружением, следует руководствоваться следующими рекомендациями: + +* **Anonymous** обычно применяется на самостоятельно разворачиваемых локальных кластерах {{ ydb-short-name }}, недоступных по сети. +* **Access Token** применяется при отсутствии поддержки других режимов на стороне сервера или в настроечных/отладочных целях. Он не требует взаимодействий клиента с IAM. Однако, если IAM поддерживает API для ротации токенов, то обычно выдаваемые таким IAM фиксированные токены имеют короткий срок жизни, что вынуждает регулярно обновлять их в IAM вручную заново. +* **Refresh Token** может применяться при выполнении разовых ручных операций под персональной учетной записью, например, связанных с обслуживанием данных в БД, выполнением ad-hoc операций в CLI, или запусками приложений с рабочей станции. Такой токен можно получить вручную в IAM один раз на долгий срок и сохранить в переменной окружения на личной рабочей станции для автоматического применения при запуске CLI без дополнительных параметров аутентификации. +* **Service Account Key** применяется в первую очередь для приложений, рассчитанных на эксплуатацию в окружениях, где поддерживается режим **Metadata**, при их тестировании вне таких окружений (например, на рабочей станции). Также он может применяться для приложений вне таких окружений, работая как аналог **Refresh Token** для сервисных учетных записей. В отличие от персональной учетной записи, объекты доступа и роли сервисной учетной записи могут быть ограничены. +* **Metadata** применяется при разворачивании приложений в облаках. В настоящее время этот режим поддерживается на виртуальных машинах и в {{ sf-name }} {{ yandex-cloud }}. + +Токен для указания в параметрах может быть получен в системе IAM, с которой связана конкретная установка {{ ydb-short-name }}. В частности, для сервиса {{ ydb-short-name }} в {{ yandex-cloud }} применяется Yandex.Passport OAuth и сервисные аккаунты {{ yandex-cloud }}. При использовании {{ ydb-short-name }} в корпоративных контекстах могут применяться стандартные для данной организации системы централизованной аутентификации. + +При использовании режимов, предусматривающих обращение клиента {{ ydb-short-name }} к IAM, дополнительно может быть задан URL IAM, предоставляющий API выдачи токенов. По умолчанию в существующих SDK и CLI производится попытка обращения к API IAM {{ yandex-cloud }}, размещенному на `iam.api.cloud.yandex.net:443`. diff --git a/ydb/docs/ru/core/security/authorization.md b/ydb/docs/ru/core/security/authorization.md index 504d7b42a42f..7b81c5adb7a7 100644 --- a/ydb/docs/ru/core/security/authorization.md +++ b/ydb/docs/ru/core/security/authorization.md @@ -7,7 +7,7 @@ * [Объект доступа](../concepts/glossary.md#access-object) * [Субъект доступа](../concepts/glossary.md#access-subject) * [Право доступа](../concepts/glossary.md#access-right) -* [Список разрешений](../concepts/glossary.md#access-acl) +* [Список доступов](../concepts/glossary.md#access-acl) * [Владелец](../concepts/glossary.md#access-owner) * [Пользователь](../concepts/glossary.md#access-user) * [Группа](../concepts/glossary.md#access-group) @@ -35,13 +35,14 @@ * [Ansible](../devops/ansible/initial-deployment.md) * [Kubernetes](../devops/kubernetes/initial-deployment.md) * [Вручную](../devops/manual/initial-deployment.md) +* [{#T}](./builtin-security.md) {% endnote %} {{ ydb-short-name }} позволяет работать с [пользователями](../concepts/glossary.md#access-user) из разных каталогов и систем, и они отличаются [SID](../concepts/glossary.md#access-sid) с использованием суффикса. -Суффикс `@` идентифицирует «источник пользователя» или «auth-домен», внутри которых гарантируется уникальность всех `login`. Например, в случае [аутентификации LDAP](authentication.md#ldap-auth-provider) имена пользователей будут `user1@ldap` и `user2@ldap`. -Если указан `login` без суффикса, то имеются в виду пользователи, непосредственно созданные в кластере {{ ydb-short-name }}. +Суффикс `@` идентифицирует «источник пользователя», внутри которого гарантируется уникальность всех логинов или идентификаторов пользователей. Например, в случае [аутентификации LDAP](authentication.md#ldap-auth-provider) имена пользователей будут `user1@ldap` и `user2@ldap`.
+Если имя пользователя указано без суффикса, то имеется в виду локальный пользователь, созданный и существующий непосредственно в кластере {{ ydb-short-name }}. ## Группа {#group} @@ -64,9 +65,9 @@ ## Право {#right} -[Права](../concepts/glossary.md#access-right) в {{ ydb-short-name }} привязаны не [субъекту](../concepts/glossary.md#access-subject), а к [объекту доступа](../concepts/glossary.md#access-object). +[Права доступа](../concepts/glossary.md#access-right) в {{ ydb-short-name }} привязаны не [субъекту](../concepts/glossary.md#access-subject), а к [объекту доступа](../concepts/glossary.md#access-object). -У каждого объекта доступа есть список разрешений — [ACL](../concepts/glossary.md#access-acl) (Access Control List) — он хранит все предоставленные [субъектам доступа](../concepts/glossary.md#subject) (пользователям и группам) права на объект. +У каждого объекта доступа есть список прав — [ACL](../concepts/glossary.md#access-acl) (Access Control List) — он хранит все предоставленные [субъектам доступа](../concepts/glossary.md#subject) (пользователям и группам) права на объект. По умолчанию, права наследуются от родителей потомкам по дереву объектов доступа. @@ -96,7 +97,7 @@ {% note info %} -Для владельца не проверяются [списки разрешений](../concepts/glossary.md#access-control-list) на данный [объект доступа](../concepts/glossary.md#access-object). +Для владельца не проверяются [списки прав](../concepts/glossary.md#access-control-list) на данный [объект доступа](../concepts/glossary.md#access-object). Он имеет полный набор прав на объект. diff --git a/ydb/docs/ru/core/security/builtin-security.md b/ydb/docs/ru/core/security/builtin-security.md new file mode 100644 index 000000000000..430822c7dea8 --- /dev/null +++ b/ydb/docs/ru/core/security/builtin-security.md @@ -0,0 +1,54 @@ +# Встроенная настройка безопасности + +Встроенная настройка безопасности выполняется автоматически при первом запуске кластера {{ ydb-short-name }}, если секция настроек безопасности в конфигурации кластера ([секция `security_config`](../reference/configuration/index.md#security)) не содержит явных настроек `default_users`, `default_groups`, `default_access`. + +Применение встроенной конфигурации безопасности выключается по [флагу `domains_config.disable_builtin_security`](../reference/configuration/index.md#domains-config). + +Встроенная настройка безопасности добавляет в систему суперпользователя, а также реализует набор ролей безопасности для удобного управления пользователями. + +## Роли + +Роль | Описание +--- | --- +`ADMINS` | Неограниченные права на всю схему кластера. +`DATABASE-ADMINS` | Права на управление базами, схемой и доступами на схеме, без доступа к данным. +`ACCESS-ADMINS` | Права на управление доступами на схеме, без доступа к данным. +`DDL-ADMINS` | Права на управление схемой, без доступа к данным. +`DATA-WRITERS` | Права на доступ к схемным объектам, и на чтение и изменение данных. +`DATA-READERS` | Права на доступ к схемным объектам, и на чтение данных. +`METADATA-READERS` | Права на доступ к схемным объектам, без доступа к данным. +`USERS` | Права на доступ к базам, общая группа всех пользователей. + +## Группы + +Роли реализуются с помощью иерархии [пользовательских](../concepts/glossary.md#access-user) [групп](./authorization.md#group) и необходимых наборов [прав](./authorization.md#right) для этих групп. Возможности групп задаются с помощью прав, выданных на корне схемы кластера. + +Группы включаются друг в друга и таким образом по цепочке наследуют соответствующие разрешения: + +{% include notitle [builtin-groups-graph](../_includes/builtin-groups-graph.md) %} + +Например, пользователям группы `DATA-WRITERS` разрешено: + +- смотреть схему — `METADATA-READERS`; +- читать данные — `DATA-READERS`; +- и менять их — `DATA-WRITERS`. + +Пользователям группы `DDL-ADMINS` разрешено: + +- смотреть схему — `METADATA-READERS`; +- и менять ёё — `DDL-ADMINS`. + +Пользователи группы `ADMINS` со схемой и данными могут делать всё. + +## Суперпользователь + +Суперпользователь входит в группы `ADMINS` и `USERS` и обладает полными правами на схему кластера. + +По умолчанию суперпользователь называется `root` и имеет пустой пароль. + +## Группа всех пользователей + +Группа `USERS` также определяется как общая [группа](../concepts/glossary.md#access-group) всех локальных [пользователей](../concepts/glossary.md#access-user). При последующем [создании локальных пользователей](./authorization.md#user) они будут автоматически становиться членами группы `USERS`. + + +Об управлении группами и пользователями читайте в разделе [{#T}](../security/authorization.md). diff --git a/ydb/docs/ru/core/security/index.md b/ydb/docs/ru/core/security/index.md index 1026268e9b7b..9d3851d0601b 100644 --- a/ydb/docs/ru/core/security/index.md +++ b/ydb/docs/ru/core/security/index.md @@ -6,6 +6,7 @@ - [{#T}](authentication.md) - [{#T}](authorization.md) +- [{#T}](builtin-security.md) - [{#T}](audit-log.md) - Шифрование: diff --git a/ydb/docs/ru/core/security/toc_p.yaml b/ydb/docs/ru/core/security/toc_p.yaml index adc1a854600c..de2af6df02d6 100644 --- a/ydb/docs/ru/core/security/toc_p.yaml +++ b/ydb/docs/ru/core/security/toc_p.yaml @@ -3,6 +3,8 @@ items: href: authentication.md - name: Авторизация href: authorization.md +- name: Встроенная настройка безопасности + href: builtin-security.md - name: Аудитный лог href: audit-log.md - name: Шифрование diff --git a/ydb/docs/ru/core/yql/reference/yql-core/syntax/_assets/builtin_groups.svg b/ydb/docs/ru/core/yql/reference/yql-core/syntax/_assets/builtin_groups.svg deleted file mode 100644 index cb8c96f20719..000000000000 --- a/ydb/docs/ru/core/yql/reference/yql-core/syntax/_assets/builtin_groups.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -
ADMINS
ADMINS
DATABASE-ADMINS
DATABASE-ADMINS
ACCESS-ADMINS
ACCESS-ADMINS
DDL-ADMINS
DDL-ADMINS
DATA-WRITERS
DATA-WRITERS
DATA-READERS
DATA-READERS
METADATA-READERS
METADATA-READERS
USERS
USERS
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/builtin_groups.md b/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/builtin_groups.md deleted file mode 100644 index e1c98b6ebccf..000000000000 --- a/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/builtin_groups.md +++ /dev/null @@ -1,20 +0,0 @@ -## Встроенные группы {#builtin} - -Кластер {{ ydb-short-name }} имеет встроенные группы, предоставляющие заранее определенные наборы ролей: - -Группа | Описание ---- | --- -`ADMINS` | Неограниченные права на всю схему кластера -`DATABASE-ADMINS` | Права на создание и удаление баз данных (`CreateDatabase`, `DropDatabase`) -`ACCESS-ADMINS` | Права на управление правами других пользователей (`GrantAccessRights`) -`DDL-ADMINS` | Права на изменение схемы баз данных (`CreateDirectory`, `CreateTable`, `WriteAttributes`, `AlterSchema`, `RemoveSchema`) -`DATA-WRITERS` | Права на изменение данных (`UpdateRow`, `EraseRow`) -`DATA-READERS` | Права на чтение данных (`SelectRow`) -`METADATA-READERS` | Права на чтение метаинформации, без доступа к данным (`DescribeSchema` и `ReadAttributes`) -`USERS` | Права на подключение к базам данных (`ConnectDatabase`) - -Все пользователи по умолчанию входят в группу `USERS`. Пользователь `root` по умолчанию входит в группу `ADMINS`. - -Ниже показано, как группы наследуют разрешения друг друга. Например, в `DATA-WRITERS` входят все разрешения `DATA-READERS`: - -![builtin_groups](../_assets/builtin_groups.svg) diff --git a/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/initial_groups_and_users.md b/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/initial_groups_and_users.md new file mode 100644 index 000000000000..3145e0ee9250 --- /dev/null +++ b/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/initial_groups_and_users.md @@ -0,0 +1,5 @@ +{{ ydb-short-name }} может иметь набор групп и пользователей уже с момента начального развёртывания. + +Подробнее см. [{#T}](../../../../reference/configuration/index.md#security-bootstrap) и [{#T}](../../../../security/builtin-security.md). + +Такие пользователи и группы ничем не отличаются от пользователей и групп, созданных позже. diff --git a/ydb/docs/ru/core/yql/reference/yql-core/syntax/alter-group.md b/ydb/docs/ru/core/yql/reference/yql-core/syntax/alter-group.md index e5c92a61610c..84b067d74d6e 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/syntax/alter-group.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/syntax/alter-group.md @@ -12,4 +12,6 @@ ALTER GROUP role_name DROP USER user_name [, ... ] * `role_name` — имя группы. * `user_name` — имя пользователя. -{% include [x](_includes/builtin_groups.md) %} +## Встроенные группы + +{% include [!](_includes/initial_groups_and_users.md) %} diff --git a/ydb/docs/ru/core/yql/reference/yql-core/syntax/alter-user.md b/ydb/docs/ru/core/yql/reference/yql-core/syntax/alter-user.md index 2c61075b2757..10e846b4fcf0 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/syntax/alter-user.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/syntax/alter-user.md @@ -15,3 +15,7 @@ ALTER USER user_name [ WITH ] option [ ... ] * `PASSWORD NULL` — устанавливает пустой пароль. * `NOLOGIN` - запрет на логин пользователя (блокировка пользователя). * `LOGIN` - разрешение на логин пользователя (разблокировка пользователя). + +## Встроенные пользователи + +{% include [!](_includes/initial_groups_and_users.md) %} diff --git a/ydb/docs/ru/core/yql/reference/yql-core/syntax/create-group.md b/ydb/docs/ru/core/yql/reference/yql-core/syntax/create-group.md index c0c86aa2375b..b2b55f7abc95 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/syntax/create-group.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/syntax/create-group.md @@ -9,3 +9,7 @@ CREATE GROUP group_name ``` * `group_name` — имя группы. Может содержать строчные буквы латинского алфавита и цифры. + +## Встроенные группы + +{% include [!](_includes/initial_groups_and_users.md) %} diff --git a/ydb/docs/ru/core/yql/reference/yql-core/syntax/create-user.md b/ydb/docs/ru/core/yql/reference/yql-core/syntax/create-user.md index 1d61bb2b06b1..7faa39fced1d 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/syntax/create-user.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/syntax/create-user.md @@ -11,8 +11,12 @@ CREATE USER user_name [option] * `user_name` — имя пользователя. Может содержать строчные буквы латинского алфавита и цифры. * `option` — опция команды: * `PASSWORD 'password'` — создает пользователя с паролем `password`. - * `PASSWORD NULL` — создает пользователя с пустым паролем (по умолчанию). + * `PASSWORD NULL` — создает пользователя с пустым паролем (по умолчанию). * `NOLOGIN` - запрет на логин пользователя (блокировка пользователя). * `LOGIN` - разрешение на логин пользователя (по умолчанию). {% include [!](../../../_includes/do-not-create-users-in-ldap.md) %} + +## Встроенные пользователи + +{% include [!](_includes/initial_groups_and_users.md) %} diff --git a/ydb/docs/ru/core/yql/reference/yql-core/syntax/drop-group.md b/ydb/docs/ru/core/yql/reference/yql-core/syntax/drop-group.md index d27f6230e082..ceb745e92901 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/syntax/drop-group.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/syntax/drop-group.md @@ -10,3 +10,7 @@ DROP GROUP [ IF EXISTS ] group_name [, ...] * `IF EXISTS` — не выводить ошибку, если группа не существует. * `group_name` — имя группы, которого нужно удалить. + +## Встроенные группы + +{% include [!](_includes/initial_groups_and_users.md) %} diff --git a/ydb/docs/ru/core/yql/reference/yql-core/syntax/drop-user.md b/ydb/docs/ru/core/yql/reference/yql-core/syntax/drop-user.md index b6e814361c22..ce15db9828a0 100644 --- a/ydb/docs/ru/core/yql/reference/yql-core/syntax/drop-user.md +++ b/ydb/docs/ru/core/yql/reference/yql-core/syntax/drop-user.md @@ -10,3 +10,7 @@ DROP USER [ IF EXISTS ] user_name [, ...] * `IF EXISTS` — не выводить ошибку, если пользователь не существует. * `user_name` — имя удаляемого пользователя. Поддерживается возможность задать список пользователей через запятую, например: `DROP USER user1, user2, user3;`. + +## Встроенные пользователи + +{% include [!](_includes/initial_groups_and_users.md) %}