Лекция 10. Безопасная система
Что такое безопасная система?
Безопасная система — это система, которая защищена от несанкционированного доступа, использования, раскрытия, нарушения, модификации или уничтожения, тем самым обеспечивая конфиденциальность, целостность и доступность данных и функций.
CIA Triad
- Confidentiality — конфиденциальность.
- Integrity — целостность.
- Availability — доступность.
Определение пользователя
- Идентификация — процесс, когда информационная система определяет, существует конкретный пользователь или нет, с помощью идентификатора (логин, e-mail, номер телефона и т.п.).
- Аутентификация — процесс, когда пользователь вводит ключ (пароль, пин-код и т.п.), подтверждая своё право на доступ к учётной записи.
- Авторизация — процесс определения того, какие действия позволено совершать аутентифицированному пользователю.

Факторы идентификации (аутентификации)
- То, что субъект знает (пароль, PIN, ответ на секретный вопрос).
- То, что субъекту принадлежит (телефон, ключ, токен).
- То, что является неотъемлемой характеристикой субъекта (биометрия: отпечаток, лицо, голос).
Многофакторная аутентификация
Если для входа требуются пароль и, например, ответ на секретный вопрос (который тоже является «знанием»), то это не многофакторная аутентификация, а лишь двухэтапная проверка в рамках одного фактора. Настоящая MFA — это сочетание факторов из разных категорий.
Авторизация

Дискреционная модель доступа (DAC)
- Каждый объект имеет владельца.
- Владелец полностью контролирует доступ к своему объекту.
- Права доступа определяются на основе списков контроля доступа (ACL).
SELECT * FROM pg_class;
Виды привилегий
SYSTEM PRIVILEGESDATABASE PRIVILEGESSCHEMA PRIVILEGESTABLE PRIVILEGESCOLUMN PRIVILEGESROW-LEVEL PRIVILEGES
Владелец объекта
- В PostgreSQL каждый объект БД имеет владельца, который создаёт этот объект. Владелец обладает полным контролем над объектом.
- По умолчанию владелец может передавать свои права другим ролям.
Пользователи и группы
Реализованы через концепцию ролей. В этой системе каждая роль может выступать как в роли пользователя, так и в роли группы пользователей.
Роли
- В PostgreSQL «пользователь» — частный случай роли. Каждая роль может иметь или не иметь возможность входа в систему (
LOGIN). Если у роли установленоLOGIN, она может использоваться как учётная запись. - Роли могут быть членами других ролей (например, роль
developersдля всех разработчиков с общими привилегиями).
CREATE ROLE name [attr1, attr2, ...];
ALTER ROLE developer WITH PASSWORD 'newsecret';
Атрибуты:
LOGINSUPERUSERCREATEDBCREATEROLEPASSWORD 'secret'
Наследование привилегий
Роль, являющаяся членом другой роли, по умолчанию автоматически наследует все привилегии родительской роли.
GRANT role1 TO role2;
REVOKE role1 FROM role2;
Смена владельца
ALTER {obj} OWNER TO {role1};
Сменить владельца может сам владелец и роли, в которые он входит.
Привилегии таблиц
SELECTINSERTUPDATEREFERENCESDELETETRUNCATETRIGGER
Привилегии БД
CREATECONNECTTEMPORARY
Привилегии схем
CREATEUSAGE
Права доступа к схеме влияют на возможность создания новых объектов, но сами по себе не контролируют доступ к уже существующим объектам. Для этого назначаются привилегии непосредственно на уровне объектов.
Схема public
- Создаётся по умолчанию при создании новой базы данных.
- Объекты в ней доступны всем пользователям, если не настроены отдельные ограничения.
- При создании объектов без явного указания схемы они автоматически создаются в
public.
Стандартные БД (шаблоны)
- При создании новой БД без явного указания шаблона используется база
template1. - Template — «чистая» база данных, которая не изменялась после установки PostgreSQL. Она содержит минимальное количество объектов и служит эталоном.
Мандатная модель доступа (MAC)

Mandatory Access Control (MAC) используется в системах, где требуется высший уровень безопасности и централизованный контроль. В отличие от дискреционной модели, где владелец решает, кому предоставить доступ, в MAC доступ определяется системными политиками.
Ключевые принципы:
- «Нет права давать права» — пользователь не может перераспределять доступ по своему усмотрению.
- Протоколирование ВСЕХ действий.
- Защита от копирования.
Шифрование БД
- Прозрачное шифрование (Transparent Data Encryption, TDE) — шифрование на уровне файлов БД.
- На уровне столбцов — шифруются конкретные чувствительные поля.
- На уровне приложения — данные шифруются ещё до отправки в БД.
Угроза действий привилегированных пользователей
Защита от злоупотреблений администраторами:
- Принцип разделения обязанностей — критические действия требуют участия нескольких ролей.
- Принцип наименьших привилегий — каждому даётся ровно столько прав, сколько нужно для выполнения работы.
Хранимые процедуры и функции
Подпрограммы PL/pgSQL

Использование OUT-аргумента

Условные операторы
IF— возвращает или не возвращает значение в зависимости от ветки.CASE(в форме оператора) — не возвращает значение, выбирает блок инструкций для выполнения.
IF

Циклы
FORWHILELOOP
Циклы поддерживают операторы EXIT и CONTINUE.
FOR

Триггеры
Триггеры используются, когда мы хотим выполнить действия в момент изменения данных.

Опции триггера:
BEFORE/AFTER— выполняется перед действием или после. Если используемBEFORE, можно менять данные.FROM(точнееON) — на какую таблицу вешается триггер.FOR ROW/FOR STATEMENT— на каждую изменённую строку или на весь запрос целиком. УSTATEMENT-триггера нет информации об изменённых данных.WHEN— содержит условие, определяющее, будет ли вызываться функция.
Специальные переменные триггера
NEW— содержит новую строку.OLD— содержит старую строку.TG_NAME— название триггера.TG_OP— название операции (INSERT,UPDATE,DELETE).TG_TABLE_NAME— название таблицы.
Пример триггера

Плюсы хранимых процедур и триггеров
- Инкапсуляция функциональности.
- Изоляция пользователей от таблиц (доступ только через процедуры).
- В некоторых случаях ускорение выполнения (за счёт предкомпиляции).
Минусы
- Повышение нагрузки на БД.
- Миграция между СУБД вызывает проблемы — обратной совместимости нет совсем.
Состояние, Strict, Diagnostics

Функция vs Процедура
| Функция | Процедура |
|---|---|
| Имеет возвращаемый тип и возвращает значение | Может не возвращать значение или возвращать через OUT-параметры |
Использование DML-запросов внутри невозможно (только SELECT) | Использование DML-запросов возможно |
| Вызов хранимой процедуры из функции невозможен | Управление транзакциями (COMMIT, ROLLBACK) возможно внутри процедуры |
Вызов функции внутри SELECT-запросов возможен | Вызов хранимой процедуры из SELECT-запросов невозможен |
Создание функции

Особенности функций:
- Могут состоять из нескольких операторов SQL.
- Значение возвращается через
RETURN. - Нельзя использовать операторы управления транзакциями (
BEGIN,COMMIT,ROLLBACK). - Нельзя использовать служебные команды (например,
CREATE INDEX).

Типы параметров
IN— входной (по умолчанию).OUT— выходной.INOUT— и входной, и выходной.RETURN— возвращаемое значение (для функций).
Привилегии доступа
SECURITY DEFINER— функция выполняется с правами создателя (definer).SECURITY INVOKER— функция выполняется с правами вызывающего (invoker), по умолчанию.

Это перегрузка процедур, а не функций; в процедурах нет
RETURN, толькоINиOUT.

Категории изменчивости
VOLATILE— возвращаемое значение может произвольно меняться на одних и тех же входных. (По умолчанию.)STABLE— значение не меняется в рамках одного оператора, функция не может менять таблицы. Оптимизатор может кешировать результаты в пределах команды.IMMUTABLE— значение не меняется, функция детерминирована, функция не может менять таблицы. Может вызываться на этапе планирования запроса.

PL/pgSQL
PL/pgSQL — загружаемый процедурный язык для системы управления базами данных PostgreSQL:
- может быть использован для создания функций, процедур и триггеров;
- добавляет структуры управления к языку SQL;
- наследует все пользовательские типы, функции, процедуры и операторы;
- прост в использовании.
Структура блока
- Метка (опционально);
- Секция объявления переменных;
- Операторы;
- Обработка исключительных ситуаций.
Форма блока
