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

Идентификация
- То, что субъект знает
- То, что субъекту принадлежит
- То, что является неотьемлемой характеристикой субъекта
Многофакторная идентификация
- Если для входа требуются пароль и, например, ответ на секретный вопрос (который тоже является “знанием”), то это не многофакторная аутентификация, а всего лишь двухэтапная проверка в рамках одного фактора.
Авторизация

Дискретный уровень доступа
Каждый объект имеет владельца
Владелец полностью контролирует доступ к своему объекту
Права доступа определяются на основе списков контроля доступа (ACL)
SELECT *
FROM pg_class
Виды привилегий
- SYSTEM PRIVILEGES
- DATABASE PRIVILEGES
- SCHEMA PRIVILEGES
- TABLE PRIVILEGES
- COLUMN PRIVILEGES
- ROW-LEVEL PRIVILEGES
Модель доступа: Владелец объекта
- B PostgreSQL каждый объект базы данных имеет владельца, который создаёт этот объект. Этот владелец обладает полным контролем над объектом.
- По умолчанию владелец объекта может передавать свои права другим ролям, позволяя им выполнять определённые действия с объектом.
Модель доступа: Пользователи и группы
- Реализована через концепцию ролей, которая служит для управления доступом и правами пользователей к объектам базы данных. В этой системе каждая роль может выступать как в роли пользователя, так и в роли группы пользователей.
Роли
B PostgreSQL понятие “пользователь” является частным случаем роли. Каждая роль может иметь или не иметь возможность входа в систему (login privilege). Если у роли установлено свойство LOGIN, она может использоваться как учетная запись пользователя.
Роли могут быть членами других ролей. Это позволяет организовать группы пользователей - например, создать роль developers, которой будут принадлежать все разработчики, и назначить этой роли общие привилегии.
Создание CREATE ROLE {Name) {attr1, attr2, …}
Изменение ALTER ROLE developer WITH PASSWORD ’newsecret';
LOGIN
SUPERUSER
CREATEDB
CREATEROLE
PASSWORD ‘secret’
Наследование привилегий
- роль, являющаяся членом другой роли, по умолчанию автоматически наследует все привилегии (права доступа) этой родительской роли.
- GRANT role1 to role2
- REVOKE role1 FROM role2
Смена владельца
- ALTER {obj} OWNER TO {role1}
- Владеет роли и роли включающиеся в нее
Привилегии таблиц
- SELECT
- INSERT
- UPDATE
- REFERENCES
- DELETE
- TRUNCATE
- TRIGGER
Привилегии БД
- CREATE
- CONNECT
- TEMPERARY
%%Оффтоп Truncate
- TRUNCATE не проверяет каждую строку для удаления, а просто освобождает данные, удаляя содержимое таблицы целиком.
- Вместо того, чтобы логировать каждое удаление строки, TRUNCATE записывает в журнал меньший объем информации.
- При использовании TRUNCATE не вызываются триггеры, определенные для операций удаления.
- Если TRUNCATE выполняется в транзакционном блоке, то операция может быть отменена командой ROLLBACK до фиксации транзакции.%%
Привилегии схем
- CREATE
- USAGE
- Права доступа к схеме влияют на возможность создания новых объектов, но сами по себе не контролируют доступ к уже существующим объектам. Для этого необходимо назначать соответствующие привилегии непосредственно на уровне объектов
Состояние

Strict

Diagnostics


Подпрограммы PL / pgSQL

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

Условные операторы
- IF
- CASE (не возвращает значение)
IF

Оффтоп
Схема public
- Создаётся по умолчанию при создании новой базы данных.
- Объекты, в ней, доступны всем пользователям, если не настроены отдельные ограничения.
- При создании объектов не указана какая-либо другая схема, они автоматически создаются в public.
Модель доступа
Привилегии БД
- CREATE
- CONNECT
- TEMPERARY
Оффтоп
Стандартные БД
- Когда создаётся новая база данных без явного указания шаблона, используется база данных template1.
- Template - это «чистая» база данных, которая не изменялась после установки PostgreSQL. Она содержит минимальное количество объектов и служит эталоном.
Привилегии схем
- CREATE
- USAGE
- Права доступа к схеме влияют на возможность создания новых объектов, но сами по себе не контролируют доступ к уже существующим объектам. Для этого необходимо назначать соответствующие привилегии непосредственно на уровне объектов
Мандатный доступ

Мандатный уровень доступа (Mandatory Access Control - MAC)
используется в системах, где требуется высший уровень безопасности и централизованный контроль. В отличие от дискреционной модели, где владелец решает, кому предоставить доступ, в МАС доступ определяется системными политиками.
- “Нет права давать права”
- Протоколирование ВСЕХ действий
- Защита от копирования
Шифрование БД
- прозрачное шифрование
- на уровне столбцов
- на уровне приложения
Угроза действий привилегированных пользователей
- Принцип разделения обязанностей
- Принцип наименьших привилегий
Для чего они используются
Циклы
- For
- While
- Loop
Циклы имеют операторы ЕХІТ и CONTINUE
For

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

- BEFORE/AFTER - Выполняется перед действием или после. Если используем перед, то мы можем менять данные.
- FROM - на какую то таблицу
- FOR ROW/STATEMENT - На весь запрос целиком или на каждую строчку. У стейтмент триггера нет информации об измененных данных
- WHEN - содержит условие, определяющее будет ли вызываться функция или нет.
Переменные триггера
- NEW - Содержит новую строку
- OLD - Содержит старую строку
- TG_NAME - Содержит название триггера
- TG_OP - Содержит название операции
- TG_TABLE_NAME - Содержит название таблицы
Пример триггера

Плюсы
- Инкапсулирование функциональности
- Изоляция пользователей от таблиц.
- В некоторых случаях ускорение выполнения (Предкомпиляция)
Минусы
- Повышение нагрузки на БД
- Миграция между СУБД вызывает проблемы. Обратной совместимости нет совсем.
В чем отличие?
| • Функция имеет возвращаемый тип и возвращает значение | • Может не возвращать значение или возвращать через OUTPUT параметры |
| • Использование DML запросов внутри функции невозможно. В функциях разрешены только SELECT-запросы | • Использование DML-запросов возможно в хранимой процедуре. |
| • Вызов хранимой процедуры из функции невозможно | • Использование или же управление транзакциями возможно в хранимой процедуре |
| • Вызов функции внутри SELECT запросов возможен | • Вызов хранимой процедуры из SELECT запросов невозможно |
Создание функции


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

Типы переменных
- IN
- OUT
- INOUT
- RETURN
Привилегии доступа
- Definer - Создателя
- Invoker - Вызывающего

- ! это перегрузка процедур, а не функций и ретурна нет (в процедурах), только ин и аут

Категории изменчивости
- Volatile - возвращаемое значение может быть произвольно менять на одних и тех же входных.
- Stable - Значение не меняется в рамках одного оператора, функция не может менять таблицы (Оптимизатор может кэшировать результаты в пределах команды)
- Immutable - значение не меняется, функция детерминирована, функция не может менять таблицы (Можно вызывать на этапе планирования запроса)

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

🌱 Авторы:
salt-caramel
notakeith