Перейти к содержимому

Управление доступом

Authorization RadixDB основана на catalog и deny-by-default. Каждый non-bootstrap statement требует действующий session Principal, database CONNECT, schema USAGE и privilege либо ownership для целевой операции.

Штатный TCP server связывает login/password authentication с теми же catalog Principal IDs. Обычный TCP, опциональный TLS и loopback-only bootstrap recovery описаны в «Аутентификации».

Principal является execution identity. Role объединяет privileges и может быть выдана Principal или другой Role. Их имена используют одно normalized catalog namespace.

CREATE PRINCIPAL alice;
CREATE ROLE report_reader;
GRANT CONNECT ON DATABASE application TO alice;
GRANT USAGE ON SCHEMA public TO alice;
GRANT SELECT (id, title) ON TABLE reports TO report_reader;
GRANT report_reader TO alice;

Membership рекурсивна и всегда активна; SET ROLE отсутствует. Cycles отклоняются, а authorization раскрывает не более 65 536 subjects. WITH ADMIN OPTION позволяет member выдавать Role дальше:

GRANT report_reader TO alice WITH ADMIN OPTION;
REVOKE ADMIN OPTION FOR report_reader FROM alice RESTRICT;
REVOKE report_reader FROM alice CASCADE;

Role grants сохраняют provenance grantor. RESTRICT является default и не даёт удалить authority, на которой ещё держатся downstream memberships. Явный CASCADE удаляет только зависимые paths этого grant; независимые paths сохраняются. REVOKE ADMIN OPTION FOR снимает право делегирования, не удаляя саму membership. Cycles отклоняются.

Target Privileges
DATABASE name CONNECT
SCHEMA name USAGE, CREATE
TABLE name SELECT, INSERT, UPDATE, DELETE
FUNCTION name(types) EXECUTE
PROCEDURE name(types) EXECUTE

Target TABLE также обозначает view для SELECT; отдельной формы ON VIEW нет. Function и procedure targets используют input argument types для выбора overload.

SELECT, INSERT и UPDATE принимают column lists. Table-level privilege покрывает все columns. Column-only SELECT предназначен для однозначной single-table projection; joins и subqueries с этой relation требуют table-level SELECT. Predicates и expressions, читающие target columns, также требуют SELECT независимо от write privileges.

GRANT INSERT (id, title), UPDATE (title) ON TABLE reports TO report_editor;
GRANT SELECT (id, title) ON TABLE reports TO report_reader WITH GRANT OPTION;
REVOKE GRANT OPTION FOR SELECT (id, title) ON TABLE reports
FROM report_reader CASCADE;

WITH GRANT OPTION разрешает делегировать только выданный privilege и subset columns. Grants сохраняют provenance grantor; RESTRICT защищает зависимые grants, а явный CASCADE удаляет зависимые paths, не затрагивая независимые.

Bootstrap owner обходит обычные object checks. Owner объекта также имеет неявные права на него. Creator становится owner таблицы, view, function или procedure. Ownership transfer доступен только для tables, functions и procedures, а target должен быть существующим Principal:

ALTER TABLE reports OWNER TO alice;
ALTER FUNCTION calculate_total(INTEGER) OWNER TO alice;
ALTER PROCEDURE refresh_reports() OWNER TO alice;

Только bootstrap может создавать schemas, Principals, Roles и Jobs. Schema USAGE разрешает name resolution, а независимый schema privilege CREATE — создание объектов. Ни одно из прав не подразумевает другое. Для создания index или trigger дополнительно требуется ownership target table.

Principals и Roles поддерживают lifecycle со stable ID:

ALTER PRINCIPAL alice DISABLE;
ALTER PRINCIPAL alice ENABLE;
ALTER PRINCIPAL alice RENAME TO alice_archive;
ALTER ROLE report_reader RENAME TO report_viewer;
DROP PRINCIPAL alice_archive RESTRICT;
DROP ROLE report_viewer CASCADE;

DROP по умолчанию использует RESTRICT; явный CASCADE согласованно удаляет catalog grants, memberships, ownership и Jobs RUN AS, не оставляя dangling edges. Rename не меняет ObjectId, а удалённый ID не переиспользуется.

Authorization читает transaction-visible catalog на каждом statement entry. Она применяется к prepared statements, cached plans, public ORM reads и procedural SQL. Поэтому committed REVOKE действует на следующем выполнении без ожидания refresh plan cache. Catalog changes GRANT и REVOKE атомарны.

Object grants хранятся отдельно по grantor, grantee и target. Owners и bootstrap имеют implicit authority; другой subject делегирует только effective grant с grant option. Grantor может отозвать только собственный provenance path.

RadixDB 1.2 не реализует row-level security и CREATE POLICY. Также нет grants для PUBLIC, default privileges, explicit deny, SET ROLE и public SQL-команды для просмотра effective grants. Реализуйте row predicates в проверенных views или application queries, но не называйте это RLS.

У routines есть дополнительная граница privilege elevation. Перед применением SECURITY DEFINER, triggers или Jobs прочитайте «Безопасность routines».