Общие сведения
В данном разделе собрана информация о системе контроля доступа к таблицам и другим узлам Кипариса (пользователям, группам, аккаунтам, чанкам, транзакциям и т. д.).
Любой пользовательский запрос проходит через прокси, которые аутентифицируют пользователя, то есть проверяют его подлинность. На основе содержащегося в запросе токена, полученного с помощью протокола OAuth, прокси определяет имя пользователя, инициировавшего запрос. Если токен в запросе не указан, то считается, что запрос задан от пользователя guest. После прохождения аутентификации, на последующих этапах обработки пользовательского запроса токен не используется. Подробнее о токенах можно прочитать в разделе Аутентификация.
Авторизацией (выдачей разрешений) занимается мастер-сервер Кипариса. Решение о предоставлении или отказе в доступе зависит от:
- Вида доступа (чтение, запись и т.д.);
- Пользователя, инициировавшего запрос;
- Объекта, к которому запрашивается доступ.
В случае отказа в праве доступа формируется сообщение в котором указаны детали: имя пользователя, которому отказано в доступе, объект, к которому запрашивался доступ, и тип доступа.
Если от прокси приходит запрос, помеченный именем несуществующего пользователя, то мастер-сервер вернёт ошибку No such user. Такая ситуация потенциально возможна, поскольку получение токена и регистрация пользователя в системе — два действия, выполняемые на различных сервисах (получение токена происходит с помощью сервиса OAuth, а регистрация — на мастер-сервере YTsaurus).
В системе YTsaurus поддерживаются списки пользователей и групп. Обобщенно пользователи и группы называются субъектами. Членами групп могут быть произвольные субъекты: как пользователи, так и другие группы. Система гарантирует, что отношение «вхождение в группу» не содержит циклов. При авторизации решения принимаются на основе транзитивного замыкания. Таким образом, пользователь A может быть членом группы C как напрямую (входить непосредственно в состав группы С), так и косвенно (A входит в группу B, а группа B — в группу C).
У каждого объекта в системе YTsaurus существует список контроля доступа (Access Control List или ACL). Данный список хранится в атрибуте @acl объекта и состоит из отдельных записей (Access Control Entry или ACE), где каждая запись содержит перечень субъектов, тип доступа и ряд других параметров, приведённых в таблице раздела Авторизация. Подробнее читайте в секции Как правильно использовать ACL.
Пользователи, группы
В Кипарисе хранятся:
- Список всех зарегистрированных пользователей. Список хранится по адресу
//sys/usersи представляет собой узел типаuser_map. - Список всех зарегистрированных групп. Хранится по адресу
//sys/groupsи представляет собой узел типаgroup_map.
Внимание
Каждый пользователь и группа определяется уникальным именем. При этом пользователи и группы располагаются в одном пространстве имён, то есть имена пользователей и групп не могут совпадать.
Как посмотреть списки пользователей и групп
- Чтобы просмотреть список пользователей, на боковой панели перейдите в раздел Users или введите в адресной строке браузера:
https://<host-root>/<cluster-name>/users - Чтобы просмотреть список групп, перейдите в раздел Groups или введите в адресной строке браузера:
https://<host-root>/<cluster-name>/groups
- Получить список пользователей:
yt --proxy <cluster-name> list //sys/users - Получить список групп:
yt --proxy <cluster-name> list //sys/groups
Важно
Узлы //sys/users и //sys/groups не являются таблицами, поэтому списки пользователей и групп нельзя получить с помощью SELECT запроса.
Пользователи имеют тип системного объекта user. Группы имеют тип объекта group.
Как получить информацию о пользователе или группе
Перейдите на страницу пользователя или группы и нажмите значок
справа.
Чтобы получить сведения о конкретном пользователе, используйте команду yt --proxy <cluster-name> get //sys/users/<user-name>/@<attr-name>. Например:
$ yt --proxy <cluster-name> get //sys/users/vasya/@type
"user"
Посмотреть список всех доступных атрибутов у пользователя можно командой:
$ yt --proxy <cluster-name> get //sys/users/vasya/@
{
"id" = "ffffffff-fffffffe-101f5-1407420e";
"type" = "user";
"builtin" = %true;
...
}
Аналогично, чтобы получить сведения о конкретной группе, используйте команду yt --proxy <cluster-name> get //sys/groups/<group-name>/@<attr-name>. Например:
$ yt --proxy <cluster-name> get //sys/groups/admins/@type
"group"
Системные субъекты
В системе 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 обратитесь к администратору системы.