В статье разберёмся‚ какие параметры и значения нужно прописывать‚ чтобы сузить права доступа до конкретных записей и полей в реляционных и 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’е.
Контрольный чек-лист
- Определите контекст: сессия‚ роль‚ клиентский контекст или JWT-токен.
- Выберите механизм: RLS/CLS/Policy/Redaction/Masking/Encryption.
- Задайте параметры:
- 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. - Проверьте права:
EXPLAIN(PostgreSQL)‚SET SHOWPLAN(SQL Server)‚EXPLAIN PLAN(Oracle). - Протестируйте откат:
ALTER TABLE ... DISABLE ROW LEVEL SECURITY‚DROP POLICY.
Настройка ограничений на уровне записей и полей сводится к двум шагам: определить фильтрующую функцию (WHERE или SESSION_CONTEXT) и привязать её к политике. Главное — корректно задать значения параметров‚ которые будут разрешать или запрещать доступ в рантайме.