Назад к обновлениям
New releaseAug 1, 2026

threatcl v0.6.5

Документирование ваших моделей угроз с помощью HCL

Поделиться

threatcl

Моделирование угроз с помощью HCL

Что случилось с hcltm?

hcltm был переименован в threatcl. Добро пожаловать!

Обзор

[!TIP] Хотите прочитать новую документацию? Перейдите на threatcl.dev

Существует множество различных способов документирования модели угроз. От простого текстового файла до более подробных документов Word и полностью инструментированных моделей угроз в централизованном решении. Двумя наиболее ценными атрибутами модели угроз являются возможность четко документировать угрозы и возможность реализовывать значимые изменения.

threatcl стремится предоставить подход с приоритетом DevOps для документирования системной модели угроз, сосредотачиваясь на следующих целях:

  • Простой формат текстового файла
  • Простой пользовательский опыт на основе CLI
  • Интеграция с системами контроля версий (VCS)

Этот репозиторий является домом для программного обеспечения CLI threatcl. Спецификация threatcl spec основана на HCL2, языке конфигурации HashiCorp, который стремится быть "приятным для чтения и написания человеком, а также вариантом на основе JSON, который легче генерировать и анализировать машинам". Спецификация threatcl находится по адресу github.com/threatcl/spec. Сочетание программного обеспечения CLI threatcl и спецификации threatcl позволяет практикам определить системную модель угроз на HCL, например:```hcl threatmodel "Tower of London" { description = "A historic castle" author = "@xntrik"

attributes { new_initiative = "true" internet_facing = "true" initiative_size = "Small" }

information_asset "crown jewels" { description = "including the imperial state crown" information_classification = "Confidential" }

usecase { description = "The Queen can fetch the crown" }

third_party_dependency "community watch" { description = "The community watch helps guard the premise" uptime_dependency = "degraded" }

threat "Crown theft" { description = "Someone who isn't the Queen steals the crown" impacts = ["Confidentiality"]

control "Guards" {
  description = "Trained guards patrol tower"
  risk_reduction = 75
}

}

data_flow_diagram_v2 "dfd name" { // ... see below for more information }

}

См. [Диаграмму потоков данных](#data-flow-diagram) для получения дополнительной информации о том, как создавать диаграммы потоков данных, которые могут быть автоматически преобразованы в PNG.

Чтобы увидеть пример того, как ссылаться на предопределенные библиотеки элементов управления для [OWASP Proactive Controls](https://owasp.org/www-project-proactive-controls/) и [AWS Security Checklist](https://d1.awsstatic.com/whitepapers/Security/AWS_Security_Checklist.pdf), смотрите [examples/tm3.hcl](https://github.com/threatcl/threatcl/blob/HEAD/examples/tm3.hcl). Также у нас есть [MITRE ATT&CK Controls](https://attack.mitre.org/mitigations/enterprise/) [здесь](https://github.com/threatcl/threatcl/blob/HEAD/examples/MITRE_ATTACK_controls.hcl).

Вы также можете включить внешнюю модель угроз в свою собственную, чтобы ссылаться на всю ее информацию и использовать ее. В качестве примера смотрите [examples/including-example/corp-app.hcl](https://github.com/threatcl/threatcl/blob/HEAD/examples/including-example/corp-app.hcl).

Чтобы увидеть полное описание спецификации, смотрите [здесь](https://github.com/threatcl/threatcl/blob/HEAD/spec.hcl) или запустите:```bash
threatcl generate boilerplate

threatcl также будет обрабатывать JSON-файлы, но с одной оговоркой: модули импорта и переменные не будут работать. Вы можете посмотреть examples/tm1.json в качестве примера.

Почему HCL?

HCL — это основной язык конфигурации, используемый в продуктах HashiCorp, в частности в Terraform — их программном обеспечении с открытым исходным кодом для инфраструктуры как кода. Я некоторое время работал в HashiCorp, и этот язык мне действительно полюбился; кроме того, если DevOps-инженеры и разработчики программного обеспечения используют этот язык, то упрощение документации моделей угроз соответствует целям threatcl.

Вы можете использовать threatcl с JSON, но при этом теряется часть функциональности. Подробнее см. в папке examples/.

Почему не просто документировать их в MD?

Мне понравилась идея использовать формат, с которым можно взаимодействовать программно.

Благодарности и ссылки

Одной из возможностей threatcl является автоматическое создание диаграмм потоков данных из HCL-файлов. Для этого используется пакет go-dfd от Marqeta и Блейка Хичкока. Обязательно посмотрите их статью в блоге о Моделях угроз на скорости DevOps.

Кроме того, хочу выразить благодарность Джейми Финнигану и Талхе Тарику из HashiCorp за то, что позволили мне продолжить работу над этим инструментом с открытым исходным кодом даже после того, как я закончил работу в HashiCorp.

Также спасибо команде IriusRisk за спецификацию OpenThreatModel.

threatcl cli

Установка

Загрузите последнюю версию из релизов и переместите бинарный файл threatcl в ваш PATH.

Установка с помощью Homebrew

Установите threatcl с помощью Homebrew — формула находится в homebrew-core:```bash brew install threatcl

## Запуск с Docker```bash
docker run --rm -it ghcr.io/threatcl/threatcl:latest

Проверка релизов (происхождение сборок)

Каждый помеченный релиз включает SLSA происхождение сборки — подписанные в Sigstore, безключевые аттестации, созданные конвейером релиза GitHub Actions (GitHub OIDC → Fulcio, без ключей подписи). Вы можете проверить, что бинарный файл или образ контейнера действительно создан из рабочего процесса релиза этого репозитория с помощью GitHub CLI (gh attestation verify — не требуется дополнительных инструментов или доверенных ключей).

Проверьте загруженный архив (или файл SHA256SUMS):```bash gh attestation verify threatcl_.tar.gz --repo threatcl/threatcl

Проверьте образ контейнера (тег автоматически разрешается в его дайджест):```bash
gh attestation verify oci://ghcr.io/threatcl/threatcl:<version> --repo threatcl/threatcl

Чтобы закрепить точный образ, который вы запускаете, вычислите дайджест самостоятельно и проверьте (и загрузите) по дайджесту:```bash digest=$(docker buildx imagetools inspect ghcr.io/threatcl/threatcl: --format '{{ .Manifest.Digest }}') gh attestation verify oci://ghcr.io/threatcl/threatcl@${digest} --repo threatcl/threatcl

См. [docs/SLSA.md](https://github.com/threatcl/threatcl/blob/HEAD/docs/SLSA.md) для получения полной информации о цепочке поставок.

## Запуск с GitHub Actions

`threatcl` можно напрямую интегрировать в ваши репозитории GitHub с помощью https://github.com/threatcl/threatcl-action. Это один из идеальных способов управления вашими моделями угроз, который помогает достичь цели интеграции в ваши системы контроля версий.

## Сборка из исходного кода

1. Клонируйте этот репозиторий.
2. Перейдите в каталог `threatcl`
3. `make bootstrap`
4. `make build`

Для получения дополнительной помощи по участию в `threatcl` смотрите [CHANGELOG.md](https://github.com/threatcl/threatcl/blob/HEAD/CHANGELOG.md).

## Использование

Для получения справки по любой подкоманде используйте флаг `-h`.```bash
$ threatcl
Usage: threatcl [--version] [--help] <command> [<args>]

Available commands are:
    cloud        Interact with ThreatCL Cloud services
    dashboard    Generate markdown files from existing HCL threatmodel file(s)
    dfd          Generate Data Flow Diagram PNG or DOT files from existing HCL threatmodel file(s)
    export       Export threat models into other formats
    generate     Generate an HCL Threat Model
    list         List Threatmodels found in HCL file(s)
    mcp          Model Context Protocol (MCP) server for threatcl
    mermaid      Output raw mermaid source from 'mermaid' blocks in existing HCL threatmodel file(s)
    query        Execute GraphQL queries against threat model data
    server       Start a GraphQL API server for threat models
    terraform    Parse output from 'terraform show -json'
    validate     Validate existing HCL Threatmodel file(s)
    view         View existing HCL Threatmodel file(s)

(Необязательный) Файл конфигурации

Большинство команд threatcl имеют флаг -config, который позволяет указать файл config.hcl. HCL в этом файле может использоваться для переопределения некоторых атрибутов по умолчанию threatcl. Они перечислены ниже:

  • Размеры инициатив - по умолчанию: "Undefined", "Small", "Medium", "Large"
  • Размер инициативы по умолчанию - по умолчанию: "Undefined"
  • Классификации информации - по умолчанию: "Restricted", "Confidential", "Public"
  • Классификация информации по умолчанию - по умолчанию: "Confidential"
  • Типы воздействия - по умолчанию: "Confidentiality", "Integrity", "Availability"
  • Элементы STRIDE - по умолчанию: "Spoofing", "Tampering", "Info Disclosure", "Denial Of Service", "Elevation Of Privilege"
  • Классификации зависимости от времени безотказной работы - по умолчанию: "none", "degraded", "hard", "operational"
  • Классификация зависимости от времени безотказной работы по умолчанию - по умолчанию: "none"

Например:```hcl initiative_sizes = ["S", "M", "L"] default_initiative_size = "M" info_classifications = ["1", "2"] default_info_classification = "1" impact_types = ["big", "small"] strides = ["S", "T"] uptime_dep_classifications = ["N", "D"] default_uptime_dep_classification = "N"

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

## Команды Cloud

Посетите https://threatcl.dev/cloud/overview/ чтобы узнать больше о подкомандах `cloud`.

## List и View

Команды `threatcl list` и `threatcl view` можно использовать для вывода списка и просмотра данных из HCL-файлов спецификации `threatcl`.```bash
$ threatcl list examples/*
#  File              Threatmodel      Author
1  examples/tm1.hcl  Tower of London  @xntrik
2  examples/tm1.hcl  Fort Knox        @xntrik
3  examples/tm2.hcl  Modelly model    @xntrik

Проверка

Команда threatcl validate используется для проверки HCL-файла спецификации threatcl.```bash $ threatcl validate examples/* Validated 3 threatmodels in 3 files

### Инварианты

`threatcl validate` может также применять общеорганизационные инварианты — машинно-проверяемые
правила, такие как "нет публичных конечных точек без аутентификации" или "все
функции с выходом в интернет должны документировать аудит логирования" — к каждой
проверенной модели угроз:```bash
$ threatcl validate -invariants=invariants.hcl ./models/
Validated 4 threatmodels in 3 files
Invariant violation [error] 'threats_have_implemented_controls': threat 'Credential theft' in threatmodel 'Payments' (models/payments.hcl): Every threat must have at least one implemented control
Checked 3 invariants against 4 threatmodels: 1 errors, 0 warnings, 1 exemptions

Инварианты живут в собственном HCL-файле, нацелены на конкретную коллекцию (угрозы, средства контроля, процессы DFD, потоки ...) и выражают своё условие как нативное выражение HCL. Они поддерживают уровни серьёзности error/warning и исключения для отдельных моделей с обоснованием. См. docs/invariants.md.

Export

Команда threatcl export используется для экспорта модели угроз (или моделей) threatcl в нативное JSON-представление (по умолчанию), либо в представление json OTM, или даже обратно в hcl (что полезно для вывода свежего HCL из динамических моделей угроз). Вы также можете напрямую сохранить их в файл с помощью флага -output.```bash $ threatcl export -format=otm examples/tm1.hcl [{"assets":[{"description":"including the imperial state crown","id":"crown-jewels","name":"crown jewels","risk":{"availability":0,"confidentiality":0,"integrity":0}}],"mitigations":[{"attributes":{"implementation_notes":"They are trained to be guards as well","implemented":true},"description":"Lots of guards patrol the area","id":"lots-of-guards","name":"Lots of Guards","riskReduction":80}],"otmVersion":"0.2.0","project":{"attributes":{"initiative_size":"Small","internet_facing":true,"network_segment":"dmz","new_initiative":true},"description":"A historic castle","id":"tower-of-london","name":"Tower of London","owner":"@xntrik"},"threats":[{"categories":["Confidentiality"],"description":"Someone who isn't the Queen steals the crown","id":"threat-1","name":"Threat 1","risk":{"impact":0,"likelihood":null}}]},{"assets":[{"description":"Lots of gold","id":"gold","name":"Gold","risk":{"availability":0,"confidentiality":0,"integrity":0}}],"mitigations":[{"attributes":{"implemented":true},"description":"A large wall surrounds the fort","id":"big-wall","name":"Big Wall","riskReduction":80}],"otmVersion":"0.2.0","project":{"attributes":{"initiative_size":"Small","internet_facing":true,"new_initiative":false},"description":"A .. fort?","id":"fort-knox","name":"Fort Knox","owner":"@xntrik"},"threats":[{"categories":["Confidentiality"],"description":"Someone steals the gold","id":"threat-1","name":"Threat 1","risk":{"impact":0,"likelihood":null}}]}]

## Генерация

Команда `threatcl generate` используется для вывода общего шаблонного (`boilerplate`) файла спецификации `threatcl` HCL или для интерактивного опроса пользователя с последующим выводом файла спецификации `threatcl` HCL.

### Интерактивная генерация

См. следующий пример:```bash
threatcl generate interactive

Создание интерактивного редактора

Если вы предпочитаете работать напрямую в вашем $EDITOR, выполните:```bash threatcl generate interactive editor

Это откроет ваш редактор с минимальной HCL-моделью угроз. Если вы хотите проверить модель после создания, используйте флаг `-validate`.

## MCP

Команда `threatcl mcp` запускает локальный [MCP](https://modelcontextprotocol.io/introduction) сервер, позволяя вам взаимодействовать с HCL-файлами threatcl через MCP-хост, например, через AI/LLM-приложения, такие как [Claude Desktop](https://claude.ai/download), [Cursor](https://www.cursor.com/) или любые другие приложения, поддерживающие MCP.

Команда принимает один необязательный аргумент `-dir=<path>`, который позволяет дополнительным MCP-инструментам взаимодействовать с файлами внутри этого пути. Без этой настройки MCP-инструменты могут взаимодействовать со строками, но будут полагаться на другие механизмы MCP-хоста для взаимодействия с файловой системой.

Справедливости ради стоит отметить, что эта функциональность пока находится на стадии беты.

## LSP (Языковой сервер)

Команда `threatcl lsp` запускает сервер [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) через stdio, предоставляя редакторам с поддержкой LSP живую диагностику, автодополнение, всплывающие подсказки, символы документа и форматирование для HCL-моделей угроз threatcl.

Он запускается LSP-клиентом вашего редактора, а не вручную. Поскольку файлы threatcl используют расширение `.hcl` вместе с Terraform и другими HCL-диалектами, сопоставление с `*.tm.hcl` (или ограничение клиента вашей рабочей областью модели угроз) позволяет избежать конфликтов с языковым сервером Terraform.

См. [docs/lsp.md](https://github.com/threatcl/threatcl/blob/HEAD/docs/lsp.md) для настройки редакторов (Neovim, Helix, VS Code, Zed) и текущих ограничений.

## Сервер (GraphQL API)

Команда `threatcl server` запускает GraphQL API сервер, который предоставляет ваши модели угроз через HTTP для программных запросов и интеграции.

### Базовое использование```bash
# Start the server
$ threatcl server -dir ./examples

# With file watching for auto-reload
$ threatcl server -dir ./examples -watch

# Custom port
$ threatcl server -dir ./examples -port 3000

Перейдите по адресу http://localhost:8080, чтобы получить доступ к интерактивной среде GraphQL Playground.

Пример запроса```graphql

query { stats { totalThreatModels totalThreats implementedControls }

threatModels(filter: { internetFacing: true }) { name threats { description controls { name implemented } } } }

### Документация

Для полной документации API, справки по схеме, продвинутых запросов и примеров интеграции см.:
- **Полная документация API**: [docs/graphql-api.md](https://github.com/threatcl/threatcl/blob/HEAD/docs/graphql-api.md)
- **Примеры запросов**: [examples/graphql-queries.md](https://github.com/threatcl/threatcl/blob/HEAD/examples/graphql-queries.md)

## Запрос (GraphQL CLI)

Команда `threatcl query` выполняет GraphQL-запросы прямо из командной строки без запуска сервера. Это идеально подходит для автоматизации, CI/CD конвейеров и написания сценариев оболочки.

### Основное использование```bash
# Get statistics
$ threatcl query -dir ./examples -query '{ stats { totalThreats } }'

# Query from file
$ threatcl query -dir ./examples -file queries/get-stats.graphql

# Use in scripts
$ THREATS=$(threatcl query -dir ./examples \
    -query '{ stats { totalThreats } }' \
    -output compact | jq -r '.data.stats.totalThreats')
$ echo "Found $THREATS threats"

Форматы вывода

  • pretty (по умолчанию): Отформатированный JSON с отступами
  • json: То же, что и pretty
  • compact: Однострочный JSON для скриптинга

Запрос с переменными```bash

$ threatcl query -dir ./examples
-query 'query($author: String) { threatModels(filter: {author: $author}) { name } }'
-vars '{"author": "John Doe"}'

### Пример CI/CD```bash
#!/bin/bash
# Check if all controls are implemented before deployment

UNIMPLEMENTED=$(threatcl query -dir ./threatmodels \
  -query '{ stats { totalControls implementedControls } }' \
  -output compact | jq -r '.data.stats.totalControls - .data.stats.implementedControls')

if [ "$UNIMPLEMENTED" -gt 0 ]; then
  echo "ERROR: $UNIMPLEMENTED controls are not yet implemented"
  exit 1
fi

echo "All controls implemented, proceeding with deployment"

Смотрите docs/graphql-api.md для ознакомления с доступными запросами и схемой GraphQL.

Панель управления

Команда threatcl dashboard принимает файлы спецификации HCL формата threatcl и генерирует несколько файлов markdown и png, помещая их в выбранную папку.```bash $ threatcl dashboard -overwrite -outdir=dashboard-example examples/* Created the 'dashboard-example' directory Writing dashboard markdown files to 'dashboard-example' and overwriting existing files Successfully wrote to 'dashboard-example/tm1-toweroflondon.md' Successfully wrote to 'dashboard-example/tm1-fortknox.md' Successfully wrote to 'dashboard-example/tm2-modellymodel.png' Successfully wrote to 'dashboard-example/tm2-modellymodel.md' Successfully wrote to 'dashboard-example/dashboard.md'

### Пользовательские шаблоны Markdown

Команда `threatcl dashboard` также может принимать необязательные флаги для указания пользовательских шаблонов (в соответствии с [text/template](https://pkg.go.dev/text/template) от Golang).

Чтобы указать файл шаблона панели управления, используйте флаг `-dashboard-template`. Пример см. в [dashboard-template.tpl](https://github.com/threatcl/threatcl/blob/HEAD/examples/dashboard-template.tpl).

Чтобы указать файл шаблона модели угроз, используйте флаг `-threatmodel-template`. Пример см. в [threatmodel-template.tpl](https://github.com/threatcl/threatcl/blob/HEAD/examples/threatmodel-template.tpl).

### Пользовательское имя файла для индексного файла панели управления

Команда `threatcl dashboard` также может принимать необязательный флаг для указания имени файла для сгенерированного индексного файла панели управления. По умолчанию этот файл называется `dashboard.md`. Используйте флаг `-dashboard-filename` без расширения, чтобы изменить это имя файла.

## Диаграмма потоков данных

Согласно [спецификации](https://github.com/threatcl/threatcl/blob/HEAD/spec.hcl), `threatmodel` может содержать блоки `data_flow_diagram_v2`. Пример простой DFD доступен [здесь](https://github.com/threatcl/threatcl/blob/HEAD/examples/tm2.hcl). Старый одноразовый блок `data_flow_diagram` будет в какой-то момент объявлен устаревшим, поэтому лучше использовать именованные блоки `data_flow_diagram_v2`, чтобы можно было иметь несколько связанных DFD.

Команда `threatcl dfd` принимает HCL-файлы спецификации `threatcl` и генерирует несколько PNG-файлов, помещая их в выбранную папку.

Если HCL-файл не содержит блок `threatmodel` с блоком `data_flow_diagram` или `data_flow_diagram_v2`, то ничего не выводится.

Сама команда очень похожа на команду Dashboard.```bash
$ threatcl dfd -overwrite -outdir testout examples/*
Successfully created 'testout/tm2-modellymodel.png'

Если ваша threatmodel не включает diagram_link, но включает data_flow_diagram, то это также будет отображено при выполнении threatcl dashboard.

Mermaid

Согласно спецификации, threatmodel также может включать свободные блоки mermaid. В отличие от data_flow_diagram_v2 (который threatcl отображает за вас), блок mermaid встраивает необработанный исходный код mermaid дословно — mermaid определяет тип диаграммы (последовательность, состояние, блок-схема и т.д.) по первой строке содержимого.

Команда threatcl mermaid извлекает этот необработанный исходный код, чтобы его можно было передать в другие инструменты рендеринга. Она сама не отображает изображения.

По умолчанию исходный код выводится в STDOUT:```bash $ threatcl mermaid examples/tm2.hcl sequenceDiagram User->>App: credentials App->>Auth: verify Auth-->>App: token

Это упрощает передачу в рендерер, такой как [mermaid-cli](https://github.com/mermaid-js/mermaid-cli):```bash
$ threatcl mermaid model.hcl | mmdc -o diagram.svg -i -

Если имеется несколько блоков mermaid, выберите один с помощью -index=n, или запишите их все в каталог с помощью -outdir (один файл .mmd на блок). Вы также можете записать один блок в файл с помощью -out.```bash $ threatcl mermaid -outdir testout model.hcl Successfully created 'testout/model-mymodelloginsequence.mmd'

## Terraform

Команда `threatcl terraform` может извлекать ресурсы данных из вывода `terraform show -json` [документация здесь](https://www.terraform.io/docs/cli/commands/show.html) файлов планов или активных файлов состояния и преобразовывать их в черновики блоков `information_asset` для включения в файлы `threatcl`.

Если вы находитесь в папке с существующим состоянием, вы можете выполнить следующее:```bash
terraform show -json | threatcl terraform -stdin

Результат будет выглядеть примерно так:```bash information_asset "aws_rds_cluster default" { description = "cluster_identifier: aurora-cluster-demo, database_name: mydb" information_classification = "" source = "terraform state" } information_asset "aws_s3_bucket example" { description = "bucket: terraform-20211107232017071500000001" information_classification = "" source = "terraform state" }

Вы также можете просмотреть похожий вывод из файла плана, который еще не был применён с помощью Terraform, выполнив команду:```bash
terraform show -json <plan-file> | threatcl terraform -stdin

Если вы хотите обновить существующий threatcl файл модели угроз ("threatmodel.hcl"), вы можете с помощью:```bash terraform show -json | threatcl terraform -stdin -add-to-existing=threatmodel.hcl > new-threatmodel.hcl

С флагом `-add-to-existing` вы также можете указать `-tm-name=<string>`, если необходимо указать конкретную модель угроз из исходного файла, если их несколько. Также можно применить классификацию по умолчанию с флагом `-default-classification=Confidential`.

Эти команды также могут принимать файл в качестве входных данных; в этом случае опустите флаг `-stdin`.

Ресурсы Terraform, известные `threatcl`, жестко закодированы в [pkg/terraform/terraform.go](https://github.com/threatcl/threatcl/blob/HEAD/pkg/terraform/terraform.go). Если вы хотите, чтобы команда `threatcl terraform` выводила другие ресурсы `information_asset`, которые там отсутствуют, вы можете предоставить свою собственную версию этого json через флаг `-tf-collection=<json file>`.

Категории