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

Пошаговый лайфхак по настройке прав доступа на уровне записей и полей без головной боли

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

В статье разберёмся‚ какие параметры и значения нужно прописывать‚ чтобы сузить права доступа до конкретных записей и полей в реляционных и NoSQL системах. Примеры приведены для PostgreSQL‚ MySQL 8‚ Oracle‚ SQL Server и MongoDB 7.x (актуальны на ).

Общая терминология

  • Row-Level Security (RLS) — ограничение доступа к отдельным строкам (записям).
  • Column-Level Security (CLS) — ограничение доступа к отдельным столбцам (полям).
  • Политика (Policy) — объект‚ описывающий условие фильтрации (WHERE).
  • Маскировка (Masking) — динамическое скрытие или замена значения поля.

PostgreSQL 16+

2.1 Row-Level Security

Для включения RLS и задания параметров:

ALTER TABLE orders ENABLE ROW LEVEL SECURITY;

CREATE POLICY p_sales_only
ON orders
FOR ALL
TO role_sales
USING (sales_region = current_setting('app.region')::int);

Ключевые значения параметров:

  • current_setting(‘app.region’) — читаем runtime переменную‚ заданную командой SET app.region = 42;.
  • FOR ALL — применяется к SELECT‚ INSERT‚ UPDATE‚ DELETE.
  • TO role_sales — ограничиваем роль.

2.2 Column-Level Security

GRANT SELECT (order_id‚ client_name‚ total) ON orders TO role_accounting;
REVOKE SELECT (cost_price) ON orders FROM role_accounting;

MySQL 8.0+

3.1 Row-Level Security через VIEW + DEFINER

CREATE VIEW v_orders AS
SELECT *
FROM orders
WHERE region_id = @@session.region_filter;

SET SESSION region_filter = 42;

GRANT SELECT ON v_orders TO 'sales'@'%';

Значения параметров:

  • @@session.region_filter — пользовательская переменная сессии.
  • DEFINER = 'admin'@'localhost', чтобы VIEW использовалась с правами владельца.

3.2 Column Masking (MySQL Enterprise)

ALTER TABLE orders
MODIFY cost_price INT MASKED WITH (FUNCTION = 'partial(1‚"XXX"‚1)');

SQL Server 2022

4.1 Row-Level Security

CREATE FUNCTION dbo.fn_orders_policy(@region AS int)
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN SELECT 1 AS fn_securitypredicate_result
WHERE @region = CAST(SESSION_CONTEXT(N'UserRegion') AS int);

CREATE SECURITY POLICY sp_orders
ADD FILTER PREDICATE dbo.fn_orders_policy(region_id)
ON dbo.orders
WITH (STATE = ON);

Значения параметров:

  • SESSION_CONTEXT(N'UserRegion') — ключ-значение‚ задаётся через EXEC sp_set_session_context @key = N'UserRegion'‚ @value = 42;.

4.2 Column-Level Masking

ALTER TABLE orders
ALTER COLUMN cost_price ADD MASKED WITH (FUNCTION = 'partial(1‚"XXX"‚1)');

Oracle 21c

5.1 Virtual Private Database (VPD)

BEGIN
 DBMS_RLS.ADD_POLICY(
 object_schema => 'app'‚
 object_name => 'orders'‚
 policy_name => 'p_region_filter'‚
 policy_function => 'f_orders_rls'‚
 statement_types => 'select‚update‚delete');
END;
/

Функция f_orders_rls возвращает строку 'region_id = SYS_CONTEXT('USERENV'‚'CLIENT_REGION')'.

5.2 Column Masking (Redaction)

BEGIN
 DBMS_REDACT.ADD_POLICY(
 object_name => 'orders'‚
 column_name => 'cost_price'‚
 policy_name => 'redact_cost'‚
 function_type => DBMS_REDACT.PARTIAL‚
 expression => 'SYS_CONTEXT(''USERENV''‚''SESSION_USER'') != ''analyst''');
END;
/

MongoDB 7.x

6.1 Field-Level Encryption (FLE2)

db.createCollection("orders"‚ {
 encryptedFields: {
 fields: [
 {
 path: "cost_price"‚
 bsonType: "double"‚
 queries: { queryType: "equality" }

 } ]
 }
});

Доступ к ключам шифрования управляется ролями KMIP.

6.2 Row-Level через $redact

db.orders.aggregate([
 { $redact: {
 $cond: {
 if: { $eq: ["$region"‚ "$$USER_REGION"] }‚
 then: "$$KEEP"‚
 else: "$$PRUNE"
 }
 }}
]);

Переменная USER_REGION передаётся через let в driver’е.

Контрольный чек-лист

  1. Определите контекст: сессия‚ роль‚ клиентский контекст или JWT-токен.
  2. Выберите механизм: RLS/CLS/Policy/Redaction/Masking/Encryption.
  3. Задайте параметры:
    • PostgreSQL: SET app.param = 'value'‚ current_setting('app.param').
    • SQL Server: sp_set_session_context @key‚ @value.
    • Oracle: SYS_CONTEXT('namespace'‚'key').
    • MongoDB: переменные $$USER_XXX в агрегации или ключи KMS для FLE.
  4. Проверьте права: EXPLAIN (PostgreSQL)‚ SET SHOWPLAN (SQL Server)‚ EXPLAIN PLAN (Oracle).
  5. Протестируйте откат: ALTER TABLE ... DISABLE ROW LEVEL SECURITY‚ DROP POLICY.

Настройка ограничений на уровне записей и полей сводится к двум шагам: определить фильтрующую функцию (WHERE или SESSION_CONTEXT) и привязать её к политике. Главное — корректно задать значения параметров‚ которые будут разрешать или запрещать доступ в рантайме.