← На главную стенда

ЛР-1. Инвентаризация и классификация данных учебной транспортной БД

Дисциплина «Безопасность систем баз данных» · база transport_lab · режим только чтение

Важно про SQL-блоки

В Adminer нужно вставлять только SQL-текст. Для этого используйте кнопку «Копировать SQL» у каждого запроса. Не копируйте подписи, тройные обратные кавычки или слово sql.

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. Проверка сессии

SQL
SELECT current_user, current_database();

Запишите результат и ответьте: под какой ролью вы подключены, к какой БД и почему используется не административная учётная запись.

6. Задание 2. Инвентаризация таблиц

SQL
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. Изучение структуры

SQL
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:

SQL
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. Примеры данных

Сотрудники

SQL
SELECT
    employee_no,
    full_name,
    email,
    phone,
    position_code,
    status
FROM transport.employees
ORDER BY id
LIMIT 10;

Пассажиры

SQL
SELECT
    customer_no,
    full_name,
    email,
    phone,
    document_ref,
    loyalty_level
FROM transport.passengers
ORDER BY id
LIMIT 10;

Платежи

SQL
SELECT
    payment_ref,
    amount,
    currency,
    method,
    status,
    provider_token_ref
FROM transport.payments
ORDER BY id
LIMIT 10;

Эксплуатационные события

SQL
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. Связанные данные

SQL
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;
  1. Стала ли итоговая выборка чувствительнее, чем отдельные таблицы?
  2. Какие риски появляются при объединении идентификационных, маршрутных и платёжных данных?
  3. Почему ограничения доступа только на уровне одной таблицы недостаточно для оценки риска?

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 по указанию преподавателя), содержащий:

  1. ФИО и номер стенда;
  2. результат current_user/current_database();
  3. список 12 предметных таблиц;
  4. описание минимум пяти таблиц;
  5. классификацию минимум восьми объектов;
  6. ответы по связанному запросу;
  7. простую модель доступа;
  8. вывод 5–8 предложений.

Пароль от стенда в отчёт не включать.

14. Критерии зачёта

15. Домашнее задание

Подготовьте матрицу доступа к passengers, trips, payments, maintenance_records, operational_events для ролей operator, dispatcher, manager, auditor. Для каждой пары укажите SELECT / INSERT / UPDATE / DELETE / нет доступа и краткое обоснование.

Команды в стенде не выполнять. Это проектирование будущей RBAC-модели.