Общие сведения

В данном разделе собрана информация о системе контроля доступа к таблицам и другим узлам Кипариса (пользователям, группам, аккаунтам, чанкам, транзакциям и т.д.).

Любой пользовательский запрос проходит через прокси, которые аутентифицируют пользователя, то есть проверяют его подлинность. На основе содержащегося в запросе токена, полученного с помощью протокола OAuth, прокси определяет имя пользователя, инициировавшего запрос. Если токен в запросе не указан, то считается, что запрос задан от пользователя guest. После прохождения аутентификации, на последующих этапах обработки пользовательского запроса токен не используется. Подробнее о токенах можно прочитать в разделе Аутентификация.

Авторизацией (выдачей разрешений) занимается мастер-сервер Кипариса. Решение о предоставлении или отказе в доступе зависит от:

  1. Вида доступа (чтение, запись и т.д.);
  2. Пользователя, инициировавшего запрос;
  3. Объекта, к которому запрашивается доступ.

В случае отказа в праве доступа формируется сообщение в котором указаны детали: имя пользователя, которому отказано в доступе, объект, к которому запрашивался доступ, и тип доступа.

В системе YTsaurus поддерживаются списки пользователей и групп. Обобщенно пользователи и группы называются субъектами.

У каждого объекта в системе YTsaurus существует список контроля доступа (Access Control List или ACL). Данный список хранится в атрибуте @acl объекта и состоит из отдельных записей (Access Control Entry или ACE), где каждая запись содержит перечень субъектов, тип доступа и ряд других параметров, приведённых в таблице раздела Авторизация.

Пользователи, группы

Список всех зарегистрированных пользователей системы хранится в Кипарисе по адресу //sys/users. Каждый пользователь определяется уникальным именем. Если от прокси приходит запрос, помеченный именем несуществующего пользователя, то мастер-сервер вернет ошибку No such user. Такая ситуация потенциально возможна, поскольку получение токена и регистрация пользователя в системе — два действия, выполняемые на различных сервисах (получение токена происходит с помощью сервиса OAuth, а регистрация — на мастер-сервере YTsaurus).

Список всех зарегистрированных групп располагается по адресу //sys/groups. Каждая группа также определяется уникальным именем.

Внимание

Пользователи и группы располагаются в одном пространстве имен, то есть имена пользователей и групп не могут совпадать.

Членами групп могут быть произвольные субъекты: как пользователи, так и другие группы. Система гарантирует, что отношение "вхождение в группу" не содержит циклов. При авторизации решения принимаются на основе транзитивного замыкания. Таким образом, пользователь A может быть членом группы C как напрямую (входить непосредственно в состав группы С), так и косвенно (A входит в группу B, а группа B — в группу C).

Системные субъекты

В системе YTsaurus присутствует набор субъектов, выполняющих системные функции. Таких субъектов нельзя удалить. К системным субъектам относятся:

  1. Пользователи guest, root, scheduler и job;
  2. Группы everyone, users, superusers.

Атрибуты субъектов

В таблице ниже представлен список атрибутов, которые имеются у всех субъектов.

Атрибут Тип Описание
name string Имя субъекта (непустая строка)
member_of array<string> Список имен групп, которым непосредственно принадлежит данный субъект
member_of_closure array<string> Список имен групп, которым принадлежит субъект (прямо или косвенно)
aliases array<string> Список имен, которые могут использоваться в ACL в качестве ссылки на данный субъект

Атрибуты пользователей

Помимо атрибутов, присущих всем субъектам, пользователи имеют атрибуты, представленные в таблице ниже.

Атрибут Тип Описание Обязательный
banned bool Заблокирован ли пользователь Нет
access_time DateTime Время последнего запроса от пользователя. Да
access_counter integer Общее число запросов, заданных пользователем. Да
request_rate double Количество запросов в секунду от пользователя. Да
request_rate_limit double Ограничение на количество запросов в секунду от пользователя. По умолчанию 100. Да
request_queue_size_limit double Длина очереди запросов. По умолчанию 100. Да
usable_accounts array<string> Список аккаунтов, которые пользователю разрешено использовать. Да

Атрибуты групп

Помимо атрибутов, присущих всем субъектам, группы имеют атрибуты, представленные в таблице ниже.

Атрибут Тип Описание
members array<string> Список имен членов группы (пользователей и других групп).

Управление группами

Примечание

На больших кластерах управление группами напрямую доступно только администраторам YTsaurus.

Чтобы создать новую группу, используется команда create. При создании не нужно указывать путь объекта, но требуется указать атрибут name.

yt create group --attributes '{name=my_group}'

Удаляются группы командой remove. При удалении группа автоматически удаляется из всех ACL, где она участвовала.

yt remove //sys/groups/my_group

Авторизация

Модуль авторизации на мастер-сервере решает следующую задачу: разрешить ли пользователю U доступ типа P для объекта O? Вариантов ответа может быть два: разрешить или не разрешать. Разберем все три компонента (U, P и O) по-отдельности.

В качестве U может выступать любой пользователь системы. Отметим, что U не может быть группой, хотя членство в группах учитывается при принятии решения. Если U — это root, то запрос доступа автоматически удовлетворяется.

Тип доступа P иначе также называется правом (permission). Права, которые поддерживаются системой YTsaurus представлены в таблице.

Право Описание
read Обозначает чтение значения или получение информации об объекте либо его атрибутах.
write Обозначает изменение состояния объекта или его атрибутов.
use Применяется к аккаунтам, пулам и бандлам и означает использование (то есть возможность вписать новые объекты в квоту данного аккаунта, запустить операции в пуле или переложить динамическую таблицу в бандл).
administer Обозначает изменение дескриптора доступа объекта.
create Применяется только к схемам и обозначает создание объектов данного типа.
remove Обозначает удаление объекта.
mount Обозначает монтирование, размонтирование, перемонтирование и решардирование динамической таблицы.
manage Применяется только к операциям (не к узлам Кипариса) и обозначает управление состоянием этой операции или её джобов.

Объект O означает произвольный объект системы: узел Кипариса, пользователя, группу, аккаунт, чанк, транзакцию и так далее.

Чтобы принять решение, система неявно строит эффективный список управления доступом (effective ACL) для объекта O. Эффективный список управления доступом — это объединение указанного на узле списка управления доступом и списков управления доступами, унаследованных от родителей. Любой список управления доступом (ACL) представляет собой список записей управления доступом (ACE). Порядок записей в этом списке не играет роли. Объект может наследовать свой ACL, за это отвечает атрибут inherit_acl = %true. При наследовании для каждой ACE определяется режим наследования (ключ inheritance_mode в записи acl). Последний может быть равен object_only, object_and_descendants, descendants_only и immediate_descendants_only.

Значение object_only означает, что данная запись влияет только на сам объект. При значении object_and_descendants — на объект и всех его потомков, включая непрямых. При значении descendants_only — только на потомков, включая непрямых. При значении immediate_descendants_only — только на прямых потомков (сыновей). Каждая запись имеет структуру представленную в таблице.

Атрибут Тип Описание
action SecurityAction Либо allow (разрешающая запись), либо deny (запрещающая запись).
subjects array<string> Список имен субъектов, на которые распространяется запись.
permissions array<Permission> Список прав доступа, на которые распространяется действие, указанное в атрибуте action.
inheritance_mode InheritanceMode Режим наследования данной ACE, по умолчанию object_and_descendants.

Как только эффективный список построен, решение о предоставлении или непредоставлении доступа принимается по следующей схеме:

  1. Если в списке есть хотя бы одна разрешающая запись для U и P и нет ни одной запрещающей записи для U и P, то доступ выдается.
  2. Иначе доступ запрещается.

«Запись для U и P» означает, что P упомянуто в списке permissions, а пользователь U (либо хотя бы одна группа, в которой он числится прямо или косвенно) — в списке subjects. Из представленного описания в частности следует, что если эффективный список пуст, то доступ будет запрещен.

Владелец объекта и пользователь owner

При создании объекта пользователем U, он также становится владельцем данного объекта, что находит отражение в атрибуте owner.

Примечание

Изменить владельца может лишь суперпользователь (член группы superusers).

Также в системе есть специальный фиктивный пользователь owner. Им невозможно аутентифицироваться, однако на него можно ссылаться в ACL в качестве субъекта. При этом в момент проверки прав owner заменяется на фактического владельца объекта. Это позволяет, например, описать ограничение «в данном каталоге удалять узлы могут только те, кто их создал» таким ACE:{action=allow; permissions=[remove]; subjects=[owner]; inheritance_mode = descendants_only}, при этом важно не забыть отключить наследование прав, указав inherit_acl = %false.

Управление операциями

Любая операция имеет связанный с ней ACL аналогично узлам Кипариса. Данный ACL можно получить из атрибута по пути runtime_parameters/acl операции.

Права доступа имеют следующую семантику:

  • право read отвечает за чтение live preview выходных и промежуточных данных операции, а также «артефактов» её джобов: stderr, fail context, входных данных отдельных джобов;
  • право manage отвечает управлению операцией, влияющему на её состояние, то есть действиям Abort, Complete, Suspend и Resume (кнопки для них находятся в правом верхнем углу страницы операции в веб-интерфейсе); а также действиям с джобами: Abort, Abandon и Send signal (кнопки для них находятся в выпадающем меню в правой части страницы Jobs в веб-интерфейсе YTsaurus);
  • использование Job Shell требует одновременно прав read и manage , так как наличие доступа через консоль позволяет читать или произвольным образом менять состояние джоба.

Существует возможность указать ACL для операции при её запуске. Для этого в спецификации операции необходимо указать секцию "acl" следующего содержания:

yt.run_map(..., spec={"acl": [{
 "action": "allow",
 "subjects": ["u1", "u2"],
 "permissions": ["read", "manage"],
}]})

Пользователь, запустивший операцию, и администраторы по умолчанию добавляются в результирующий ACL операции.

Как правильно использовать ACL

Представленная выше схема управления доступом весьма общая и гибкая. При ее использовании важно стараться ставить роли на максимально высоком уровне с наследованием один раз, а не управлять доступом на уровне отдельных таблиц. Наследование ACL поощряет группировать данные с общими правилами доступа в каталоги.

В нормальном режиме следует иметь исключительно разрешающие записи. Запрещающие записи можно выставлять для быстрого решения проблемы, если оказалось, что доступ чрезмерно расширен, затем следует проводить ревизию ACL, и решать проблему, корректируя разрешающие записи.

Не рекомендуется упоминать в ACL конкретных пользователей. При выдаче доступа вместо отдельных пользователей рекомендуется использовать группы с однотипными потребностями.

Наследование ACL следует использовать везде, кроме мест, где характер доступа радикально меняется. Например, на корне Кипариса по умолчанию установлена запись, разрешающая всем пользователям (кроме guest) выполнять чтение. В тех местах Кипариса, где хранится чувствительная с точки зрения безопасности информация, например списки токенов, доступ переопределяется с нуля.

Проверка ACL

Проверить наличие у пользователя определённого права на определённый узел Кипариса можно командой check-permission. Пример запуска команды:

$ yt check-permission yql write //tmp
{
  "action" = "allow";
  "object_id" = "1-3-411012f-1888ce1f";
  "object_name" = "node //tmp";
  "subject_id" = "c4-8aaa-41101f6-bec6113b";
  "subject_name" = "YTsaurus";
}

Запрос доступа

Для получения доступа к существующему аккаунту или директории в YTsaurus обратитесь к администратору системы.