linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • База знаний
  • Шпаргалка
  • Capstone
  • Собеседование
home/terraform/kb/Security/tf-trivy-tfsec

kb/security ── Security ── intermediate

Trivy и tfsec: security-сканеры HCL

tfsec, оригинальный security-сканер от Aqua, написан на Go, быстрый. С 2023 года слит в Trivy, у того теперь модуль `trivy config` для IaC, та же база правил (AVD-* идентификаторы). Альтернатива Checkov: меньше правил, но быстрее, бинарь без зависимостей. В CI обычно: либо Trivy/tfsec, либо Checkov, не оба.

view as markdownaka: trivy, tfsec, terraform-trivy, terraform-tfsec

Что они и почему два

tfsec появился в 2019, Go-приложение от Aqua Security, security-сканер под Terraform. Быстрый (десятки мс на средний проект), single-binary, без Python-зависимостей.

В 2023 Aqua слила tfsec в Trivy, мульти-инструмент того же вендора (сканер контейнерных образов, SBOM, IaC). Теперь IaC-сканинг, это trivy config <dir>. Правила и движок те же, что в tfsec. Сам tfsec как самостоятельный проект deprecated, но команды и идентификаторы правил часто остались в legacy-пайплайнах.

Правило это: используешь Trivy. Если ты на legacy-pipeline с tfsec миграция тривиальна. См. tf-trivy-tfsec раздел про миграцию.

Запуск Trivy

bash
trivy config .

Сканирует все поддерживаемые форматы в текущей директории: Terraform, CloudFormation, Kubernetes, Dockerfile.

Вывод:

Tests: 28 (SUCCESSES: 25, FAILURES: 3, EXCEPTIONS: 0)
Failures: 3 (UNKNOWN: 0, LOW: 0, MEDIUM: 2, HIGH: 1, CRITICAL: 0)
main.tf (terraform)
  AVD-AWS-0086 (HIGH): No public access block so not blocking public acls
    ...
  AVD-AWS-0089 (MEDIUM): S3 Bucket does not have logging enabled.
    ...

Только Terraform:

bash
trivy config --skip-dirs node_modules --type terraform .

Конкретные severity:

bash
trivy config --severity HIGH,CRITICAL .

Exit-code: 0 при no-issues по умолчанию. --exit-code 1 ставит exit 1 при любых findings (для CI).

tfsec → trivy migration

tfsectrivy
tfsec .trivy config .
tfsec --exclude aws-s3-encryption-customer-keytrivy config --ignore-policy aws-s3-encryption-customer-key
tfsec --tfvars-file dev.tfvarstrivy config --tf-vars dev.tfvars
.tfsec/config.yamltrivy.yaml
finding-ID: AWS001finding-ID: AVD-AWS-0086 (новые)

Правила те же, но переименовали идентификаторы. Если был tfsec:ignore:AWS001 в HCL, заменить на trivy:ignore:AVD-AWS-0086.

Suppression

Inline:

hcl
#trivy:ignore:AVD-AWS-0089
resource "aws_s3_bucket" "logs" {
  bucket = "no-logging-on-purpose"
}

Несколько правил:

hcl
#trivy:ignore:AVD-AWS-0089
#trivy:ignore:AVD-AWS-0086
resource "aws_s3_bucket" "public_assets" {
  # ...
}

Файл-конфиг trivy.yaml:

yaml
ignored-policies:
  - AVD-AWS-0086

Trivy/tfsec не требует причины в комментарии, это отличие от Checkov. Команды часто добавляют convention типа #trivy:ignore:AVD-AWS-0086 # see ADR-014 для трассируемости.

Trivy/tfsec vs Checkov

АспектTrivy/tfsecCheckov
ЯзыкGoPython
УстановкаОдин бинарь (curl + chmod)pip install (Python-env)
СкоростьБыстрее (миллисекунды)Заметно медленнее (секунды на средний проект)
Правила~150 для Terraform~600 для Terraform
Покрытие cloud-провайдеровAWS, GCP, Azure, Oracle, DigitalOceanте же + Kubernetes-policies
Custom-rulesYAML или RegoPython-class или YAML (с 3.0)
SARIF-outputДаДа
ПоддерживаетсяДа (через Trivy)Да (Prisma Cloud)

Реалистично: оба ловят похожие классы проблем. Checkov шире, Trivy быстрее. Многие команды берут что-то одно, чтобы не плодить совпадающие suppression'ы. Если выбираешь, Trivy для CI-скорости, Checkov для policy-spec'ов.

CI-интеграция

yaml
# .github/workflows/security.yml
jobs:
  trivy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Trivy config scan
        uses: aquasecurity/trivy-action@0.24.0
        with:
          scan-type: config
          scan-ref: .
          severity: HIGH,CRITICAL
          exit-code: 1
          format: sarif
          output: trivy-results.sarif
      - name: Upload SARIF
        if: always()
        uses: github/codeql-action/upload-sarif@v3
        with:
          sarif_file: trivy-results.sarif

Получишь findings во вкладке Security и обязательный fail на HIGH/CRITICAL.

Custom-rules через Rego

Trivy умеет читать пользовательские правила в Rego (тот же язык, что у OPA, см. tf-policy-as-code):

rego
# policies/costcenter.rego
package custom.costcenter
__rego_metadata__ := {
    "id": "AVD-CUSTOM-001",
    "title": "CostCenter tag required",
    "severity": "MEDIUM",
}
__rego_input__ := {
    "selector": [{"type": "defsec", "subtypes": [{"service": "s3"}]}],
}
deny[res] {
    bucket := input.aws.s3.buckets[_]
    not bucket.tags.CostCenter
    res := {
        "msg": sprintf("S3 bucket %s missing CostCenter tag", [bucket.name.value]),
    }
}

Подключение:

bash
trivy config --config-policy ./policies .

Подводные камни

  • AVD-идентификаторы, нестабильные. Раньше были AWS001, потом переименовали в AVD-AWS-0086. Старые tfsec-suppress'ы продолжат «работать» (no-op), но реально правило теперь под другим именем. Перепроверь после миграции.

  • Trivy сканирует всё подряд по дефолту. В одной директории с Dockerfile и .tf он сделает оба скана. Если хочешь только Terraform --type terraform (или --scanners config для всех IaC форматов).

  • Severity, мнение вендора. Что-то «MEDIUM» по Trivy может быть «CRITICAL» для твоей среды. Не доверяй вендорной градации слепо; делай свой --severity-фильтр или soft-fail на низких уровнях.

  • trivy.yaml vs CLI-флаги, конфликты. Если оба, CLI выигрывает. Команды путают; держи конфиг в одном месте.

  • Не покрывает state. Это сканер сорсов, не runtime. Что уже задеплоено и работает, не его задача. Для drift'а, tf-drift-detection; для скана уже созданного, Trivy умеет AWS-account-scan, но это другой режим.

  • Suppression без причины, болото. Trivy не требует ёе, в отличие от Checkov. Командой добавь convention: #trivy:ignore:X, reason. Без этого через полгода никто не знает, почему ignore.

§ команды

bash
trivy config .

Сканирует все .tf, .yaml, Dockerfile в текущей директории. Default-severity: всё кроме UNKNOWN.

bash
trivy config --severity HIGH,CRITICAL .

Только высокие. Стандартный режим CI gate.

bash
trivy config --tf-vars dev.tfvars .

Подсунуть var-файл: частичная раскрутка интерполяций.

bash
trivy config --format sarif --output trivy.sarif .

Output для GitHub Security tab.

§ см. также

  • tf-checkovCheckov: статический анализ HCLCheckov, Python-сканер от Prisma Cloud, проверяет `.tf` и `plan.json` против ~2000 встроенных правил (CKV_AWS_*, CKV_K8S_*, etc.). Запускается на HCL до plan'а (быстрее) или на JSON-plan (богаче, видит вычисленные значения). Suppressions делаются комментарием в HCL или в файле конфигурации; baseline-файл фиксирует найденные issues как «приемлемые на сейчас», чтобы новые сразу ломали CI.
  • tf-policy-as-codeOPA + Rego, policy as code для Terraform planPolicy-as-code = правила («все S3 шифрованы», «никаких IAM с *») написаны кодом, гонятся в CI, fail'ят PR. OPA, стандарт, Rego, язык. conftest, обёртка с CLI-friendly выводом; читает plan.json, прогоняет правила, exit 0/1. Зрелее и дороже на старте, чем Checkov, но позволяет cross-resource правила любой сложности.
  • tf-sensitivesensitive в Terraform: про логи, не про шифрование`sensitive = true` у variable/output/local прячет значение от CLI-вывода и логов. В state и .tfstate.backup значение **открытое**. Это redaction, не encryption. Реально секретное, храни в Secrets Manager или Vault, читай через data-source, плана не сохраняй в артефактах. `nonsensitive()` нужен в редких случаях когда sensitive-флаг каскадируется и мешает.
  • tf-secrets-in-stateСекреты и Terraform state: где хранить и как читатьState содержит всё что прошло через apply, пароли, ключи, токены в открытом виде. Решения: хранить секреты в Secrets Manager / Vault / KMS, читать через data-source, шифровать backend (S3 SSE-KMS), OIDC вместо access-keys для CI. «sensitive=true», про логи, не про шифрование.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки