Моделирование угроз в простом сервисе аутентификации

КибербезопасностьBeginner
Практиковаться сейчас

Введение

Моделирование угроз — это практический способ анализа потенциальных уязвимостей системы до того, как она подвергнется атаке. Вместо того чтобы сразу переходить к инструментам, вы сначала определяете, что именно требует защиты, где данные пересекают границы доверия, как злоумышленник может перемещаться по системе и какие меры контроля снижают риски.

В этой лабораторной работе вы проанализируете небольшой локальный сервис аутентификации и заполните структурированную модель угроз в файле security-model.json. Эта модель — не просто текстовый отчет: каждый шаг добавляет в JSON конкретные записи, которые проверяются специальным скриптом.

Анализ сервиса аутентификации

На этом этапе вы изучите небольшой сервис, который будете моделировать. Моделирование угроз начинается с наблюдения за поведением системы: что делает приложение, какие файлы использует и какая информация может представлять интерес для злоумышленника.

Сначала перейдите в директорию проекта:

cd /home/labex/project

Выведите список подготовленных файлов:

ls -l

Вы должны увидеть такие файлы, как app.py, users.json, sessions.json, security-model.json, а также директорию uploads.

Теперь попросите демонстрационное приложение показать доступные маршруты (routes). Маршрут — это точка входа в приложение, которая принимает определенный тип запроса:

python3 app.py routes

Вывод должен показать четыре маршрута:

/login - принимает имя пользователя и пароль, затем создает токен сессии
/files - выводит список файлов, принадлежащих вошедшему в систему пользователю
/download - считывает запрошенное имя файла из директории uploads
/admin - показывает записи учетных записей только администраторам

Наконец, запустите текущий инструмент проверки модели. Он сообщит об отсутствии разделов, так как модель намеренно пуста:

python3 model-check.py all

Вы должны увидеть сообщения о том, что в каждом разделе отсутствуют необходимые записи. Это отправная точка для остальной части лабораторной работы.

Определение активов

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

Используйте cat для проверки базы данных пользователей:

cat users.json

Файл содержит имена пользователей, пароли и роли. Это делает user_credentials (учетные данные пользователей) и admin_records (записи администраторов) важными активами.

Изучите файл сессий и директорию загрузок:

cat sessions.json
ls -l uploads

Файл сессий может содержать токены входа, а директория uploads — личный контент пользователей. Они соответствуют активам session_tokens и private_uploads.

Теперь обновите массив assets в файле security-model.json. Команда ниже использует Python here-document. Конструкция here-document передает строки между маркерами PY в python3 как короткий скрипт:

python3 - <<'PY'
import json
from pathlib import Path

path = Path("security-model.json")
model = json.loads(path.read_text())
model["assets"] = [
    "user_credentials",
    "session_tokens",
    "private_uploads",
    "admin_records",
]
path.write_text(json.dumps(model, indent=2) + "\n")
PY

Проверьте только раздел активов:

python3 model-check.py assets

Ожидаемый результат:

assets: complete

Определение границ доверия

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

Снова посмотрите на список маршрутов:

python3 app.py routes

Маршруты /login, /files и /download получают входные данные со стороны пользователя и передают их в логику сервера. В этой небольшой модели это граница browser_to_server.

Маршрут /download считывает имена из запроса, а затем обращается к директории uploads. Это создает границу server_to_filesystem. Маршрут /admin отделяет обычных пользователей от данных, доступных только администраторам, поэтому он создает границу user_to_admin_area.

Добавьте эти границы в модель:

python3 - <<'PY'
import json
from pathlib import Path

path = Path("security-model.json")
model = json.loads(path.read_text())
model["trust_boundaries"] = [
    "browser_to_server",
    "server_to_filesystem",
    "user_to_admin_area",
]
path.write_text(json.dumps(model, indent=2) + "\n")
PY

Проверьте раздел границ доверия:

python3 model-check.py trust_boundaries

Ожидаемый результат:

trust_boundaries: complete

Добавление векторов атак

На этом этапе вы добавите векторы атак. Вектор атаки — это конкретный способ, с помощью которого злоумышленник может переместиться от точки входа к активу. Это суть моделирования угроз: связывание активов и границ с реалистичным поведением злоумышленника.

Попробуйте выполнить попытку входа с демонстрационными учетными данными:

python3 app.py login alice wonderland

Результатом будет токен сессии:

session-alice-demo

Это поведение показывает, почему пароли и токены сессий имеют значение. Слабый пароль может привести к credential_guessing (подбору учетных данных), а украденный токен — к session_token_theft (краже токена сессии).

Маршрут /download принимает имя файла, поэтому небрежная реализация может привести к path_traversal (обходу пути). Маршрут /admin защищает записи администратора, поэтому отсутствие проверки ролей может привести к admin_area_abuse (злоупотреблению правами администратора).

Добавьте эти векторы атак в модель:

python3 - <<'PY'
import json
from pathlib import Path

path = Path("security-model.json")
model = json.loads(path.read_text())
model["attack_paths"] = [
    "credential_guessing",
    "session_token_theft",
    "path_traversal",
    "admin_area_abuse",
]
path.write_text(json.dumps(model, indent=2) + "\n")
PY

Проверьте раздел векторов атак:

python3 model-check.py attack_paths

Ожидаемый результат:

attack_paths: complete

Выбор мер противодействия

На этом этапе вы завершите создание модели, добавив меры противодействия. Мера противодействия — это контроль, который снижает вероятность или влияние вектора атаки. Хорошие модели угроз связывают каждый важный вектор атаки как минимум с одним практическим методом контроля.

Используйте следующие пары для нашего сервиса:

  • credential_guessing можно уменьшить с помощью rate_limit_login (ограничение частоты попыток входа).
  • session_token_theft можно уменьшить с помощью protect_session_tokens (защита токенов сессий).
  • path_traversal можно уменьшить с помощью validate_download_paths (проверка путей загрузки).
  • admin_area_abuse можно уменьшить с помощью enforce_admin_authorization (принудительная авторизация администратора).

Добавьте меры противодействия в модель:

python3 - <<'PY'
import json
from pathlib import Path

path = Path("security-model.json")
model = json.loads(path.read_text())
model["mitigations"] = [
    "rate_limit_login",
    "protect_session_tokens",
    "validate_download_paths",
    "enforce_admin_authorization",
]
path.write_text(json.dumps(model, indent=2) + "\n")
PY

Теперь запустите полную проверку модели:

python3 model-check.py all

Все разделы должны быть заполнены:

assets: complete
trust_boundaries: complete
attack_paths: complete
mitigations: complete

Вы также можете просмотреть итоговую структурированную модель:

cat security-model.json

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

Резюме

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

Этот рабочий процесс помогает связать мышление в области безопасности с наблюдаемым поведением системы, вместо того чтобы рассматривать моделирование угроз как отдельный письменный отчет.