Общие сведения
В данном разделе собрана информация о системе контроля доступа к таблицам и другим узлам Кипариса (пользователям, группам, аккаунтам, чанкам, транзакциям и т.д.).
Любой пользовательский запрос проходит через прокси, которые аутентифицируют пользователя, то есть проверяют его подлинность. На основе содержащегося в запросе токена, полученного с помощью протокола OAuth, прокси определяет имя пользователя, инициировавшего запрос. Если токен в запросе не указан, то считается, что запрос задан от пользователя guest
. После прохождения аутентификации, на последующих этапах обработки пользовательского запроса токен не используется. Подробнее о токенах можно прочитать в разделе Аутентификация.
Авторизацией (выдачей разрешений) занимается мастер-сервер Кипариса. Решение о предоставлении или отказе в доступе зависит от:
- Вида доступа (чтение, запись и т.д.);
- Пользователя, инициировавшего запрос;
- Объекта, к которому запрашивается доступ.
В случае отказа в праве доступа формируется сообщение в котором указаны детали: имя пользователя, которому отказано в доступе, объект, к которому запрашивался доступ, и тип доступа.
В системе 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 присутствует набор субъектов, выполняющих системные функции. Таких субъектов нельзя удалить. К системным субъектам относятся:
- Пользователи
guest
,root
,scheduler
иjob
; - Группы
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 . |
Как только эффективный список построен, решение о предоставлении или непредоставлении доступа принимается по следующей схеме:
- Если в списке есть хотя бы одна разрешающая запись для
U
иP
и нет ни одной запрещающей записи дляU
иP
, то доступ выдается. - Иначе доступ запрещается.
«Запись для 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 обратитесь к администратору системы.