Политики защиты строк

В современных базах данных безопасность информации является критически важным аспектом. PostgreSQL предлагает мощный механизм Row-Level Security (RLS), который позволяет администраторам гибко управлять доступом к данным на уровне отдельных строк таблицы.

Политики защиты строк (RLS) — механизм ограничения доступа к строкам таблицы на уровне запросов.

Цели:

  • Обеспечить безопасность данных без изменения приложения

  • Реализовать многопользовательские системы с разделением данных

  • Соответствовать требованиям GDPR, HIPAA и другим стандартам

Когда использовать:

  • Мультитенантные системы

  • Персональные данные пользователей

  • Системы с вертикальным разделением прав


Активация RLS

Создаем таблицу:
CREATE TABLE documents ( id SERIAL PRIMARY KEY, owner_id INTEGER, content TEXT, is_public BOOLEAN DEFAULT false );
Включаем RLS для таблицы:
ALTER TABLE documents ENABLE ROW LEVEL SECURITY;

Типы политик

Тип политики Описание Команда
SELECT Чтение CREATE POLICY select_policy ON documents FOR SELECT...
INSERT Вставка CREATE POLICY insert_policy ON documents FOR INSERT...
UPDATE Обновление CREATE POLICY update_policy ON documents FOR UPDATE...
DELETE Удаление CREATE POLICY delete_policy ON documents FOR DELETE...
ALL Все операции CREATE POLICY all_policy ON documents FOR ALL...

Примеры политик

Политика 1: Доступ только владельцу

CREATE POLICY owner_access ON documents USING (owner_id = current_user_id());

Политика 2: Публичные документы

CREATE POLICY public_access ON documents FOR SELECT USING (is_public = true);

Политика 3: Только свои документы + админы

CREATE POLICY admin_access ON documents USING (owner_id = current_user_id() OR current_user_is_admin());
Особые случаи
  • Обход политик: BYPASSRLS атрибут для суперпользователей

  • Изменение политик: ALTER POLICY...

  • Удаление: DROP POLICY policy_name ON table_name


Практические примеры

Задание 1: Базовая реализация

Создайте таблицу сообщений:

CREATE TABLE messages ( id SERIAL, sender_id INTEGER, receiver_id INTEGER, content TEXT );

Включите RLS и создайте политики:

ALTER TABLE messages ENABLE ROW LEVEL SECURITY; -- Отправитель и получатель видят сообщение CREATE POLICY message_access ON messages USING (sender_id = current_user_id() OR receiver_id = current_user_id());
Задание 2: Сложный сценарий

Создайте политику для HR-отдела:

CREATE POLICY hr_access ON employees USING (department = 'HR' AND current_user_is_hr());

Проверьте доступ с разных ролей

Задание 3: Аудит политик
SELECT * FROM pg_policies WHERE tablename = 'documents';

Механизм Row-Level Security в PostgreSQL предоставляет администраторам баз данных мощный инструмент для реализации сложных сценариев контроля доступа.


Комментарии

Добавить комментарий

Чтобы оставить комменатрий необходимо Авторизоваться