ЛР-1. Инвентаризация и классификация данных учебной транспортной БД
Дисциплина «Безопасность систем баз данных» · база transport_lab · режим только чтение
1. Цель работы
- ориентироваться в структуре готовой БД;
- определять, какие данные хранятся в таблицах и полях;
- выделять данные, для которых требуется ограничение доступа;
- связывать тип данных с базовыми нормативными требованиями;
- формулировать простой принцип разграничения доступа по ролям.
В этой работе вы не администрируете PostgreSQL и не изменяете данные. GRANT/REVOKE, RLS и аудит будут в следующих лабораторных.
2. Что вы получаете
Преподаватель выдаёт адрес стенда sNN, логин вида sNN_student и пароль. Все данные в БД синтетические.
3. Правила работы
- просматривать структуру БД;
- выполнять
SELECT; - сортировать, фильтровать и объединять разрешённые таблицы;
- использовать
information_schemaдля списка таблиц и столбцов; - смотреть внешние ключи через
pg_constraint.
CREATE / ALTER / DROP;INSERT / UPDATE / DELETE;GRANT / REVOKE;- получение административных прав;
- обход ограничений.
4. Вход
Откройте свой адрес https://sNN.ksoib.ru, выберите PostgreSQL, подключитесь к базе transport_lab под выданной учётной записью и откройте «SQL-запрос».
5. Задание 1. Проверка сессии
SELECT current_user, current_database();Запишите результат и ответьте: под какой ролью вы подключены, к какой БД и почему используется не административная учётная запись.
6. Задание 2. Инвентаризация таблиц
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'transport'
AND table_type = 'BASE TABLE'
ORDER BY table_name;В предметную инвентаризацию входят 12 таблиц:
stations, routes, route_stops, vehicles, employees, passengers, trips, bookings, payments, shipments, maintenance_records, operational_events.
7. Задание 3. Изучение структуры
SELECT
table_name,
column_name,
data_type
FROM information_schema.columns
WHERE table_schema = 'transport'
ORDER BY table_name, ordinal_position;Перечень столбцов не показывает внешние ключи. Для роли sNN_student список FK в information_schema обычно пустой: студент не владеет таблицами. Связи смотрите в pg_constraint:
SELECT
src.relname AS table_name,
con.conname AS constraint_name,
pg_get_constraintdef(con.oid) AS definition
FROM pg_constraint AS con
JOIN pg_class AS src ON src.oid = con.conrelid
JOIN pg_namespace AS nsp ON nsp.oid = src.relnamespace
WHERE nsp.nspname = 'transport'
AND con.contype = 'f'
ORDER BY table_name, constraint_name;В учебной схеме 17 внешних ключей. Выберите минимум пять таблиц. Обязательно включите passengers, payments, operational_events. Для каждой опишите назначение, ключевые поля, связи и необходимость ограничения доступа.
8. Задание 4. Примеры данных
Сотрудники
SELECT
employee_no,
full_name,
email,
phone,
position_code,
status
FROM transport.employees
ORDER BY id
LIMIT 10;Пассажиры
SELECT
customer_no,
full_name,
email,
phone,
document_ref,
loyalty_level
FROM transport.passengers
ORDER BY id
LIMIT 10;Платежи
SELECT
payment_ref,
amount,
currency,
method,
status,
provider_token_ref
FROM transport.payments
ORDER BY id
LIMIT 10;Эксплуатационные события
SELECT
event_code,
occurred_at,
severity,
trip_id,
vehicle_id,
actor_employee_id,
source_system,
source_ip
FROM transport.operational_events
ORDER BY occurred_at
LIMIT 10;9. Задание 5. Связанные данные
SELECT
p.customer_no,
p.full_name,
b.booking_ref,
b.fare_amount,
b.currency,
py.payment_ref,
py.amount,
py.status
FROM transport.passengers AS p
JOIN transport.bookings AS b
ON b.passenger_id = p.id
LEFT JOIN transport.payments AS py
ON py.booking_id = b.id
ORDER BY b.id, py.id
LIMIT 10;- Стала ли итоговая выборка чувствительнее, чем отдельные таблицы?
- Какие риски появляются при объединении идентификационных, маршрутных и платёжных данных?
- Почему ограничения доступа только на уровне одной таблицы недостаточно для оценки риска?
10. Задание 6. Классификация данных
Заполните минимум восемь строк:
| Таблица / поле | Что моделирует | Категория | Ограничить доступ? | Обоснование |
|---|---|---|---|---|
passengers.full_name | ФИО пассажира | |||
passengers.document_ref | идентификатор документа | |||
employees.email | контакт сотрудника | |||
payments.amount | сумма операции | |||
payments.provider_token_ref | идентификатор платёжного провайдера | |||
shipments.sender_name | отправитель | |||
maintenance_records.cost_amount | стоимость обслуживания | |||
operational_events.source_ip | источник события |
Категории: персональные; финансовые/платёжные; коммерческие; служебные/операционные; технические и журнальные; общие/справочные.
11. Нормативная привязка
Для ЛР-1 достаточно трёх источников: 152-ФЗ «О персональных данных», 149-ФЗ «Об информации, информационных технологиях и о защите информации», 98-ФЗ «О коммерческой тайне».
Для трёх выбранных объектов укажите: применимый источник, важное для проектирования доступа требование и предлагаемую меру защиты БД.
12. Задание 7. Простая модель доступа
| Таблица | Кто должен иметь доступ | Зачем | Кому доступ не нужен |
|---|---|---|---|
passengers | |||
trips | |||
payments | |||
maintenance_records | |||
operational_events |
Писать GRANT и создавать роли пока не требуется.
13. Что сдавать
Один файл ИБ-41_Фамилия_ЛР-1.md (либо DOCX/PDF по указанию преподавателя), содержащий:
- ФИО и номер стенда;
- результат
current_user/current_database(); - список 12 предметных таблиц;
- описание минимум пяти таблиц;
- классификацию минимум восьми объектов;
- ответы по связанному запросу;
- простую модель доступа;
- вывод 5–8 предложений.
Пароль от стенда в отчёт не включать.
14. Критерии зачёта
- вход в стенд и подтверждение DB-сессии;
- инвентаризация таблиц;
- корректные SELECT;
- обоснованная классификация;
- нормативная привязка минимум трёх объектов;
- понимание минимально необходимого доступа.
15. Домашнее задание
Подготовьте матрицу доступа к passengers, trips, payments, maintenance_records, operational_events для ролей operator, dispatcher, manager, auditor. Для каждой пары укажите SELECT / INSERT / UPDATE / DELETE / нет доступа и краткое обоснование.
Команды в стенде не выполнять. Это проектирование будущей RBAC-модели.