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

**Дисциплина:** «Безопасность систем баз данных»  
**Учебный стенд:** «БСУБД — учебный стенд информационной системы водного транспорта»  
**База данных:** `transport_lab`  
**Режим работы:** только чтение (`SELECT`)  
**Продолжительность:** одна практическая пара

## 1. Цель работы

Научиться:

- ориентироваться в структуре готовой БД;
- определять, какие данные хранятся в таблицах и отдельных полях;
- выделять данные, для которых требуется ограничение доступа;
- связывать тип данных с базовыми нормативными требованиями;
- формулировать простой принцип разграничения доступа по ролям.

В этой лабораторной работе вы **не администрируете PostgreSQL** и не изменяете данные. Настройка ролей, `GRANT/REVOKE`, RLS и аудит будут изучаться в следующих работах.

## 2. Что вы получаете

Преподаватель выдаёт:

- адрес вашего рабочего стенда;
- имя пользователя вида `sNN_student`;
- пароль;
- номер рабочего места `sNN`.

Все данные в учебной БД синтетические. ФИО, телефоны, документы, адреса и другие значения не относятся к реальным людям.

## 3. Правила работы

Разрешено:

- просматривать структуру БД;
- выполнять `SELECT`;
- сортировать, фильтровать и объединять разрешённые таблицы;
- использовать `information_schema` для инвентаризации доступных объектов.

Не требуется и не следует выполнять:

- `CREATE`, `ALTER`, `DROP`;
- `INSERT`, `UPDATE`, `DELETE`;
- `GRANT`, `REVOKE`;
- попытки получить административные права;
- запросы к закрытым системным данным PostgreSQL.

Если команда отклонена по правам доступа, не пытайтесь обходить ограничение.

## 4. Вход в стенд

Откройте выданный преподавателем адрес.

В интерфейсе подключения используйте параметры, выданные преподавателем. База данных:

`transport_lab`

После входа откройте SQL-консоль.

## 5. Задание 1. Проверка своей сессии

Выполните:

```sql
SELECT current_user, current_database();
```

Запишите результат в отчёт.

Ответьте:

1. Под какой ролью вы подключены?
2. К какой БД подключены?
3. Почему для лабораторной работы используется не административная учётная запись?

## 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;
```

Выберите минимум **пять** таблиц и кратко опишите:

- назначение таблицы;
- ключевые поля;
- с какими другими объектами она связана;
- содержит ли она данные, доступ к которым следует ограничивать.

Обязательно включите в выбранные пять таблиц:

- `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. Нормативная привязка

Для этой работы достаточно использовать три базовых источника.

### 152-ФЗ «О персональных данных»

Применяйте к информации, относящейся к прямо или косвенно определённому или определяемому физическому лицу. Для целей работы обратите внимание прежде всего на понятие персональных данных и требование обеспечивать их безопасность при обработке.

### 149-ФЗ «Об информации, информационных технологиях и о защите информации»

Используйте как общий закон о категориях доступа к информации и необходимости защиты информации от неправомерного доступа, изменения, уничтожения, копирования и иных неправомерных действий.

### 98-ФЗ «О коммерческой тайне»

Не считайте любую коммерчески значимую информацию коммерческой тайной автоматически. Режим коммерческой тайны устанавливается обладателем информации и требует организационных мер, в том числе определения перечня защищаемой информации и ограничения доступа к ней.

Для трёх выбранных вами объектов укажите:

1. применимый нормативный источник;
2. какое требование из него важно для проектирования доступа к БД;
3. какую меру защиты БД вы предложили бы.

Не требуется цитировать закон дословно или указывать большое количество статей.

## 12. Задание 7. Простая модель доступа

Для пяти таблиц заполните таблицу:

| Таблица | Кто в организации должен иметь доступ | Зачем | Кому доступ не нужен |
|---|---|---|---|
| `passengers` |  |  |  |
| `trips` |  |  |  |
| `payments` |  |  |  |
| `maintenance_records` |  |  |  |
| `operational_events` |  |  |  |

Пока не требуется писать `GRANT` или создавать роли. Нужно сформулировать **бизнес-необходимость доступа**.

## 13. Что сдавать

Один файл с именем:

`ИБ-41_Фамилия_ЛР-1.md`

Допустим также формат DOCX/PDF по указанию преподавателя.

В файле должны быть:

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

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

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

Работа зачтена, если студент:

- самостоятельно вошёл в свой стенд;
- подтвердил свою DB-сессию;
- корректно проинвентаризировал предметные таблицы;
- выполнил разрешённые `SELECT`;
- отличает персональные, платёжные, коммерческие, операционные и технические данные;
- понимает, что режим доступа определяется назначением данных и ролями пользователей;
- связал минимум три объекта с нормативными требованиями;
- не пытался обходить ограничения стенда;
- сдал результат в установленном формате.

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

Подготовьте черновую матрицу доступа к пяти таблицам:

- `passengers`;
- `trips`;
- `payments`;
- `maintenance_records`;
- `operational_events`.

Используйте роли:

- `operator`;
- `dispatcher`;
- `manager`;
- `auditor`.

Для каждой пары «роль — таблица» укажите предполагаемые права:

- `SELECT`;
- `INSERT`;
- `UPDATE`;
- `DELETE`;
- либо «нет доступа».

К каждому нетривиальному решению добавьте краткое обоснование.

**Не выполнять эти команды в стенде.** Домашнее задание является проектированием будущей модели RBAC и подготовкой к следующей лабораторной.

---

### Краткая нормативная памятка

Актуальность нормативных актов необходимо проверять на дату выполнения работы. Для ЛР-1 используются:

- Федеральный закон от 27.07.2006 № 152-ФЗ «О персональных данных»;
- Федеральный закон от 27.07.2006 № 149-ФЗ «Об информации, информационных технологиях и о защите информации»;
- Федеральный закон от 29.07.2004 № 98-ФЗ «О коммерческой тайне».
