Рубрики
Uncategorized

Создайте свои собственные правила Lint для Terraform с Shisho

TL; DR: Shisho-это анализатор статического кода с открытым исходным кодом, который позволяет вам создавать свои собственные правила Lint для … Tagged с помощью Terraform, Security, DevOps, Codequality.

TL; DR: Shisho-это анализатор статического кода с открытым исходным кодом, который позволяет вам создавать свои собственные правила Lint для кодов Terraform. Вы можете легко найти и рефакторировать конкретные шаблоны кода с помощью удобного языка конфигурации.

Строительство Linter/Static Analyanzer слишком сложно

Каждый разработчик хочет избежать встраивания проблем в свое программное обеспечение, в то время как проблемы, как правило, скучны. Итак, где появится статический анализатор Linter/A: они будут большим сторонником вас и вашей команды, обнаружив общие ошибки с предварительно определенными правилами до Ошибки отправляются в мир.

Иногда вы захотите обеспечить соблюдение пользовательских правил для вашего кода, чтобы стандартизировать лучшие практики, специфичные для вашей команды. Когда вы хотите предотвратить использование членов вашей команды uniform_bucket_level_access в Google_Storage_Bucket Например, ресурсы, такие как следующий фрагмент, вы надеетесь, что есть гибкий линтер, который позволяет быстро добавлять пользовательские правила:

resource "google_storage_bucket" "test" {
  project  = var.project
  name     = "${var.project}-test"
  location = var.location
  uniform_bucket_level_access = true
  force_destroy               = true
}

Однако Добавить и поддерживать пользовательские правила довольно сложно ! Вам нужно научиться писать пользовательские правила для каждый Язык программирования вашей команды использует, хотя разные языки программирования имеют разные линщики или анализаторы, с различными DSL и API. Эта сложность является одной из серьезных проблем стандартных линтера/статических анализаторов.

Shisho: настраиваемый анализатор статического кода

Shisho, легкий статический кодовый анализатор, поможет вам создать пользовательские правила Lint для вашей кодовой базы. Я объясню, что и как это.

Flatt-Security/Shisho

Легкий статический анализатор для нескольких языков программирования

Шишо — легкий статический анализатор для разработчиков.

Пожалуйста, смотрите документацию об использовании для получения дополнительной информации.

Попробуйте на детской площадке

Вы можете попробовать Шишо в Наша игровая площадка Анкет

Попробуйте с Docker

Вы можете попробовать Шишо в своей машине следующим образом:

echo "func test(v []string) int { return len(v) + 1; }" | docker run -i ghcr.io/flatt-security/shisho-cli:latest find "len(:[...])" --lang=go
echo "func test(v []string) int { return len(v) + 1; }" > file.go
docker run -i -v $(PWD):/workspace ghcr.io/flatt-security/shisho-cli:latest find "len(:[...])" --lang=go /workspace/file.go

Установить с предварительно построенными двоичными файлами

Когда вы захотите запустить Shisho за пределами контейнеров Docker, пожалуйста, следуйте инструкциям ниже:

Linux/macOS

Запустите следующие команды:

# Linux
wget https://github.com/flatt-security/shisho/releases/latest/download/build-x86_64-unknown-linux-gnu.zip -O shisho.zip
unzip shisho.zip
chmod +x ./shisho
mv ./shisho /usr/local/bin/shisho
# macOS
wget https://github.com/flatt-security/shisho/releases/latest/download/build-x86_64-apple-darwin.zip -O shisho.zip
unzip shisho.zip
chmod +x ./shisho
mv ./shisho /usr/local/bin/shisho

Тогда вы увидите…

Найти коды

Прежде всего, Shisho позволяет нам запустить поиск кода AST-Aware по вашему коду. Вот пример команда, которая находит событие uniform_bucket_level_access Внутри Google_Storage_Bucket ресурс:

docker run -i -v $(pwd):/workspace ghcr.io/flatt-security/shisho-cli:latest find "
resource \"google_storage_bucket\" :[_] {
  :[...]
  uniform_bucket_level_access = true
  :[...]
}
" --lang hcl ./code.tf

Команда сделает следующие выходы в вашей консоли:

Здесь : [_] это Анонимная метавариза , который соответствует произвольному одиночному узлу в AST (например, вызов функции, идентификатор и т. Д.). Точно так же : [...] это Anonymous Ellipsis Metavariable , который соответствует нулю или более узлов в Ast. Эти операторы — что -то вроде группы захвата в регулярных выражениях. Они позволяют искать ваш код структурированным, но гибким образом.

Вы также можете определить Правило , который включает в себя шаблон и объяснение для этого. Следующий фрагмент YAML является примером правил, описывающих использование uniform_bucket_level_access запрещено:

version: "1"
rules:
  - id: sample-policy
    language: hcl
    pattern: |
      resource "google_storage_bucket" :[_] {
        :[...X]
        uniform_bucket_level_access = true
        :[...Y]
      }
    message: |
      Our team policy prohibits the use of uniform bucket-level access.

Вы можете найти шаблоны, выполнив Shisho Найти путь/to/rule.yaml path/to/search команда, в результате чего следующие выходы:

Вот как Shisho позволяет создавать свои собственные правила ворса для кодов Terraform. Вы можете использовать Shisho в трубопроводе CI со своими собственными правилами, не говоря уже о своей местной машине. Пожалуйста, смотрите Узнайте Shisho Для получения более подробной информации.

Рефакторные коды

Кроме того, правила Shisho могут включать в себя то, как должны быть исправлены обнаруженные шаблоны кода. Следующий фрагмент YAML описывает пользовательское правило ворса, которое предполагает использование uniform_bucket_level_access должно быть удалено:

version: "1"
rules:
  - id: sample-policy
    language: hcl
    pattern: |
      resource "google_storage_bucket" :[NAME] {
        :[...X]
        uniform_bucket_level_access = true
        :[...Y]
      }
    message: |
      Our team policy prohibits use of uniform bucket-level access.
    rewrite: |
      resource "google_storage_bucket" :[NAME] {
        :[X]
        :[Y]
      }

После того, как это правило будет проведено по вашим кодам и использованию uniform_bucket_level_access обнаружен, Шишо предлагает изменения после правила Переписать раздел как:

Сценарии использования

Вы можете использовать Shisho Для стандартизации вашей кодовой базы Анкет Кроме того, это может быть средством проведения «Безопасность как код» или «Политика как код» !

Например, когда вы хотите сохранить свою команду Ebs тома зашифровано, вы можете определить правило следующим образом:

version: '1'
rules:
  - id: 'unencrypted-ebs-volume'
    language: hcl
    message: |
      There was unencrypted EBS module.
    pattern: |
      resource  "aws_ebs_volume" :[NAME] {
        :[...X]
      }
    constraints:
      - target: X
        should: not-match
        pattern: |
          encrypted = true
    rewrite: |
      resource "aws_ebs_volume" :[NAME] {
        :[X]
        encrypted = true
      }

Если вы хотите, чтобы ваши коллеги следовали Конвенции о присвоении ресурсов, следующее правило будет работать хорошо:

version: "1"
rules:
  - id: "invalid-resource-name"
    language: hcl
    message: |
      A resource was named badly.
    pattern: |
      resource  :[_] :[NAME] {
        :[...]
      }
    constraints:
      - target: NAME
        should: not-match-regex
        pattern: '"team1-.*"'

Правило сообщит результат, подобный:

Почему Шишо?

«Современный статический анализ: как лучшие инструменты расширяют возможности творчества» Объясняет, что хорошие анализаторы кода или линщики часто совместимый, формируемый, эффективный и управляемый сообществом и это Semgrep хорошо работает с этих точек зрения. SEMGREP также является GREP-подобным (или SED-подобным) программным обеспечением, которое позволяет нам найти ошибки с полезными DSL.

Что касается Shisho, он, по крайней мере, совместимый (так как он открыт из открытых источников), формируется (хотя необходимы некоторые усилия; см. Выпуск #7 ). Более того, Шишо удивительно эффективен ! Вот результат микроэлемента Semgrep , Комби (аналогичный инструмент) и Шишо 1 :

263.1 мс Комби (1.7.0) Время Комби ‘Лен (…)’ ‘ parser.go -match-only &> /dev / нулевой
530,0 мс SEMGREP (0,62,0) время semgrep -e ‘len (…)’ parser.go &> /dev / нулевой
22,8 мс Шишо (0,1,2-альфа.2) время Shisho Найти ‘Len (: […])’ parser.go &> /dev /null

Фактически, Шишо стремится уточнить существующие инструменты и сделать его более целесообразным для участия в крупных проектах. Вы можете использовать Shisho для своего монорепо без колебаний. Для вашей информации эта скорость поддерживается Ржавчина 2 Анкет

С другой стороны, это правда, что Шишо не хватает некоторых особенностей Semgrep и Comby. Например, Semgrep имеет функция для сопоставления шаблонов с информацией типа Пока Шишо этого не делает. Semgrep также имеет SEMGREP реестр , в котором вы можете поделиться своими собственными правилами ворса для всемирного сообщества. Теперь я прилагаю усилия для разработки и реализации этих функций. Быть в курсе!

Что теперь?

В этой статье объясняется использование Shisho для кодов Terraform, но Shisho расширяет другие языковые поддержки! Особенно поддержка Dockerfile будет отправлена в ближайшее время. Вы можете следовать @y0n3uchy Чтобы увидеть новости о Shisho и Star Наш проект GitHub поощрять нас:-)

Кроме того, я выпущу SaaS, который поддерживает ваши рабочие процессы разработки Terraform с этим двигателем. Смотрите https://shisho.dev/ Для получения более подробной информации.

  1. Время — это в среднем 20 выполнений подряд. Измерение проводилось на Ubuntu 20.04.2 LTS с AMD Ryzen 5 3600/64 ГБ оперативной памяти. Цель сканирования была parser.go Анкет ↩

  2. И Semgrep, и Comby написаны в OCAML. ↩

Оригинал: «https://dev.to/y0n3uchy/build-your-own-lint-rules-for-terraform-with-shisho-5fb7»