diff --git a/ydb/docs/ru/core/_assets/groups.svg b/ydb/docs/ru/core/_assets/groups.svg
deleted file mode 100644
index cb8c96f20719..000000000000
--- a/ydb/docs/ru/core/_assets/groups.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
\ No newline at end of file
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..d8f66e0fd5b6
--- /dev/null
+++ b/ydb/docs/ru/core/_includes/builtin-groups-graph.md
@@ -0,0 +1,48 @@
+```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]
+ ADMINS[ADMINS]
+```
+
+[//]: # (diplodoc support for mermaid lacks support for markdown in labels)
diff --git a/ydb/docs/ru/core/reference/configuration/index.md b/ydb/docs/ru/core/reference/configuration/index.md
index a92adbc7ee56..86c763b72df2 100644
--- a/ydb/docs/ru/core/reference/configuration/index.md
+++ b/ydb/docs/ru/core/reference/configuration/index.md
@@ -125,20 +125,47 @@ 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` | Не выполнять ["встроенные" настройки безопасности](../../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,8 +182,6 @@ domains_config:
`block-4-2` | Избыточность с коэффициентом 1,5, применяется для однодатацентровых кластеров.
`mirror-3-dc` | Избыточность с коэффициентом 3, применяется для мультидатацентровых кластеров.
-### Синтаксис
-
``` yaml
storage_pool_types:
- kind: <имя пула хранения>
@@ -175,7 +200,7 @@ domains_config:
Каждой базе данных в кластере назначается как минимум один из доступных пулов хранения, выбираемый в операции создания базы данных. Имена пулов хранения среди назначенных могут быть использованы в атрибуте `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,8 +218,6 @@ State Storage (хранилище состояний) — это независ
При развертывании State Storage на кластерах, в которых применяется несколько пулов хранения с возможным сочетанием режимов отказоустойчивости, рассмотрите возможность увеличения количества узлов с распространением их на разные пулы хранения, так как недоступность State Storage приводит к недоступности всего кластера.
-### Синтаксис
-
```yaml
state_storage:
- ring:
@@ -207,23 +230,177 @@ state_storage:
Для `nto_select` должны использоваться нечетные числа, так как использование четных чисел не улучшает отказоустойчивость по сравнению с ближайшим меньшим нечетным числом.
-## Конфигурация аутентификации {#auth}
+### Конфигурация безопасности {#security}
-[Режим аутентификации](../../concepts/auth.md) на кластере {{ ydb-short-name }} задается в разделе `domains_config.security_config`.
-
-### Синтаксис
+В разделе `domains_config.security_config` задаются режимы аутентификации, первичная конфигурация (локальных) пользователей и групп и их права.
```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, dinamic_node_registration to add info about "register_dynamic_node_allowed_sids: <список SID'ов с правами подключения динамических нод в кластер>")
+
+#### Настройки режима аутентификации
+
+#|
+|| Ключ | Описание ||
+|| `enforce_user_token_requirement` | Режим обязательной аутентификации.
+
+- `true` — аутентификация обязательна, запросы к {{ ydb-short-name }} обязаны сопровождаться аутентификационным токеном
+- `false` — аутентификация опциональна, запросы могут не сопровождаться аутентификационным токеном
+
+Если входящий запрос приходит без токена, то в качестве токена будет использоваться `default_user_sids`, если он не пустой.
+Токен (или `default_user_sids`) будет проверяться даже при `enforce_user_token_requirement: false`, если `enforce_user_token_check_requirement: true`.
+
+Значение по-умолчанию: `false`.
+ ||
+|| `enforce_user_token_check_requirement` | Проверять аутентификационный токен (приходящий с запросом или `default_user_sids`) даже при `enforce_user_token_requirement: false`.
+
+Значение по-умолчанию: `false`.
+ ||
+|| `default_user_sids` | Список SID'ов ([UserSID, GroupSID...]) для использования в проверке аутентификации в случае, когда входящий запрос не сопровождается явным аутентификационным токеном.
+
+`default_user_sids` играет роль аутентификационного токена для анонимных запросов.
+
+Непустой `default_user_sids` позволяет использовать систему одновременно с включённым режимом обязательной аутентификации (`enforce_user_token_requirement: true`) и анонимными запросами. Это может быть полезно в определённых сценариях функционального или нагрузочного тестирования {{ ydb-short-name }}. Не рекомендуется для production.
+
+Значение по-умолчанию: пустой список.
+ ||
+|| `all_authenticated_users` | Имя виртуальной группы, в которой будут состоять все аутентифицированные пользователи.
+
+Виртуальную группу не нужно явно создавать, она ведётся системой автоматически. Назначение такой виртуальной группы -- использовать при выдаче разрешений на схемных объектах.
+Виртуальную группу нельзя удалить, нельзя получить или изменить список её членов.
+
+[//]: # (TODO: сделать ссылки на изменение ACL, на работу с группами, может быть, на описание виртуальных групп в разделе про группы пользователей, если оно там появится)
+
+Значение по-умолчанию: `all-users@well-known`.
+ ||
+|| `all_users_group` | Имя группы, в которой должны состоять все (локальные) пользователи.
+
+Если `all_users_group` не пустая, то все локальные пользователи в момент создания будут добавляться в указанную группу. В момент создания пользователей группа должна существовать.
+
+`all_users_group` автоматически прописывается при выполнении ["встроенной" настройки безопасности](../../security/builtin-security.md).
+
+Значение по-умолчанию: пустая строка.
+ ||
+|#
+
+#### Первичные настройки безопасности
+
+Параметры `default_users`, `default_groups`, `default_access` влияют на настройку кластера, осуществляемую при первом старте {{ ydb-short-name }} кластера. При последующих запусках первичная настройка не выполняется, эти настройки эффективно игнорируются.
+См. [настройки уровня `domains_config`](#domains-config) и раздел по ["встроенной" настройке безопасности](../../security/builtin-security.md).
+
+#|
+|| `default_users` | Какие пользователи должны быть созданы на кластере при первом запуске.
+
+Список пар логин-пароль. Первый пользователь становится суперпользователем.
+
+Пример:
+
+```yaml
+default_users:
+- name: root
+ password: <...>
+- name: user1
+ password: <...>
+```
+
+ ||
+|| `default_groups` | Какие группы должны быть созданы на кластере при первом запуске.
+
+Список групп и их членов.
+
+Пример:
+
+```yaml
+default_groups:
+- name: ADMINS
+ members: root
+- name: USERS
+ members:
+ - ADMINS
+ - root
+ - user1
+```
+
+ ||
+|| `default_access` | Какие разрешения должны быть выданы на корне кластера.
+
+Список разрешений в формате [краткой записи управления доступом](../../security/short-access-control-notation.md).
+
+Пример:
+
+```yaml
+default_access:
+- +(CDB|DDB|GAR):ADMINS
+- +(ConnDB):USERS
+```
+
+ ||
+|#
+
+#### Настройки административных и прочих привилегий
+
+`viewer_allowed_sids`, `monitoring_allowed_sids`, `administration_allowed_sids` — списки SID'ов, которым должны быть даны соответствующие привилегии.
+
+[//]: # (TODO: wait for pull/9387, dinamic_node_registration to add info about `register_dynamic_node_allowed_sids`)
+
+Состояние кластера не ограничивается объектами схемы (базами, таблицами, топиками и т.д.), поэтому для доступа к состоянию кластера и состоянию его подсистем требуется отдельная иерархия привилегий, не связанная со схемными объектами и разрешениями на них (ACL).
+
+[//]: # (TODO: добавить ссылку на описание схемных ACL, когда оно появится)
+
+Часть состояния кластера доступна без авторизации (например, [список узлов кластера](../embedded-ui/ydb-monitoring.md#список-узлов-node_list_page)). Этот базовый уровень возможностей расширяется дополнительными уровнями привилегий, задаваемыми списками `*_allowed_sids`.
+
+[//]: # (TODO: добавить ссылку на справку по viewer api и требуемым правам, когда она появится)
+
+#|
+|| `viewer_allowed_sids` | Список SID'ов с доступом уровня наблюдателя.
+
+Уровень наблюдателя даёт возможность просмотра всего состояния кластера и его подсистем через Web UI ([YDB Monitoring](../embedded-ui/ydb-monitoring.md)).
+ ||
+|| `monitoring_allowed_sids` | Список SID'ов с доступом уровня оператора.
+
+Уровень оператора даёт дополнительные возможности по просмотру и изменению состояния кластера. Например, выполнение бекапа или восстановление базы или выполнение YQL-запросов через Web UI.
+ ||
+|| `administration_allowed_sids` | Список SID'ов с доступом уровня администратора.
+
+Уровень администратора даёт максимальные возможности по изменению состояния системы.
+ ||
+|#
+
+Все списки по-умолчанию пустые.
+
+{% note warning %}
+
+Пустой список `*_allowed_sids` разрешает доступ любому пользователю (включая анонимного пользователя). Для защищённого развёртывания {{ ydb-short-name }} важно заранее определить модель прав и прописать в списках соответствующие группы/роли.
+
+{% endnote %}
+
+SID'ы в списках могут быть групповыми и пользовательскими. Принадлежность пользователя к списку `*_allowed_sids` определяется по вхождению в список любой его группы (рекурсивно) или по прямому вхождению. Наиболее осмысленно включать в списки `*_allowed_sids` пользовательские группы и отдельные сервисные аккаунты, тогда наделение отдельных пользователей соответствующими привилегиями не будет требовать изменения общей конфигурации кластера.
+
+`viewer_allowed_sids`, `monitoring_allowed_sids`, `administration_allowed_sids` представляют собой уровни расширения возможностей, по возрастанию. Принадлежность к `administration_allowed_sids` не означает автоматической принадлежности к `viewer_allowed_sids`. Для получения нужного объёма возможностей пользователь должен состоять во всех списках предыдущих уровней. Эту сборку возможностей должен обеспечивать администратор {{ ydb-short-name }} через конфигурацию `*_allowed_sids` списков.
+
+Например:
+
+- оператор должен состоять (прямо или через группы) во `viewer_allowed_sids` и в `monitoring_allowed_sids`
+- полноценный администратор должен состоять во `viewer_allowed_sids`, `monitoring_allowed_sids` и в `administration_allowed_sids`
### Примеры {#domains-examples}
@@ -599,9 +776,9 @@ 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}
@@ -611,7 +788,7 @@ blob_storage_config:
```yaml
auth_config:
- #...
+ ...
ldap_authentication:
hosts:
- "ldap-hostname-01.example.net"
@@ -633,7 +810,7 @@ auth_config:
enable_nested_groups_search: true
refresh_time: "1h"
- #...
+ ...
```
Параметр | Описание
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..448677717110
--- /dev/null
+++ b/ydb/docs/ru/core/security/builtin-security.md
@@ -0,0 +1,47 @@
+# "Встроенная" настройка безопасности
+
+"Встроенная" конфигурация безопасности применяется автоматически при первом запуске кластера {{ ydb-short-name }}, если секция [`security_config`](../reference/configuration/index.md#security) в конфигурации кластера не содержит явных настроек.
+
+Применение "встроенной" конфигурации безопасности отключается по флагу `domains_config.disable_builtin_security` (см. описание в разделе [`domains_config`](../reference/configuration/index.md#domains-config) конфигурации кластера). Про явные настройки системы безопасности можно прочитать подробно в разделе по [конфигурации безопасности](../reference/configuration/index.md#security).
+
+"Встроенная" настройка безопасности добавляет в систему суперпользователя, а также реализует набор ролей безопасности для удобного управления пользователями.
+
+## Роли
+
+Роль | Описание
+--- | ---
+`ADMINS` | Неограниченные права на всю схему кластера.
+`DATABASE-ADMINS` | Права на управление базами, схемой и доступами на схеме, без доступа к данным.
+`ACCESS-ADMINS` | Права на управление доступами на схеме, без доступа к данным.
+`DDL-ADMINS` | Права на управление схемой, без доступа к данным.
+`DATA-WRITERS` | Права на доступ к схемным объектам, и на чтение и изменение данных.
+`DATA-READERS` | Права на доступ к схемным объектам, и на чтение данных.
+`METADATA-READERS` | Права на доступ к схемным объектам, без доступа к данным.
+`USERS` | Никаких прав, общая группа всех пользователей.
+
+## Группы
+
+Роли реализуются с помощью иерархии пользовательских групп и необходимого набора разрешений этим группам. Возможности групп задаются с помощью разрешений, выданных на корне схемы кластера.
+
+Группы включаются друг в друга и таким образом по цепочке наследуют соответствующие разрешения:
+
+{% 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` также определяется как общая группа всех локальных пользователей. При последующем создании локальных пользователей они будут автоматически становиться членами группы `USERS`.
+
+[//]: # (TODO: добавить ссылку на раздел про работу с пользователями)
+
diff --git a/ydb/docs/ru/core/security/index.md b/ydb/docs/ru/core/security/index.md
index e7b05f76854f..b5a3179974e7 100644
--- a/ydb/docs/ru/core/security/index.md
+++ b/ydb/docs/ru/core/security/index.md
@@ -5,6 +5,7 @@
Основные материалы:
- [{#T}](access-management.md)
+- [{#T}](builtin-security.md)
- [{#T}](audit-log.md)
- Шифрование:
@@ -15,4 +16,4 @@
- Концепции:
- [{#T}](../concepts/auth.md)
- - [{#T}](../concepts/connect.md)
\ No newline at end of file
+ - [{#T}](../concepts/connect.md)
diff --git a/ydb/docs/ru/core/security/toc_p.yaml b/ydb/docs/ru/core/security/toc_p.yaml
index 3431bae533e6..44a90ede69ce 100644
--- a/ydb/docs/ru/core/security/toc_p.yaml
+++ b/ydb/docs/ru/core/security/toc_p.yaml
@@ -1,6 +1,8 @@
items:
- name: Управление доступом
href: access-management.md
+- name: Настройки безопасности по-умолчанию
+ href: builtin-security.md
- name: Аудитный лог
href: audit-log.md
- name: Шифрование