Введение
Моделирование угроз — это практический способ анализа потенциальных уязвимостей системы до того, как она подвергнется атаке. Вместо того чтобы сразу переходить к инструментам, вы сначала определяете, что именно требует защиты, где данные пересекают границы доверия, как злоумышленник может перемещаться по системе и какие меры контроля снижают риски.
В этой лабораторной работе вы проанализируете небольшой локальный сервис аутентификации и заполните структурированную модель угроз в файле 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-модели.
Этот рабочий процесс помогает связать мышление в области безопасности с наблюдаемым поведением системы, вместо того чтобы рассматривать моделирование угроз как отдельный письменный отчет.



