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 @@ - - -
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/_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` | Требовать токен пользователя.
Допустимые значения:
+[//]: # (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: Шифрование