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/ Для получения более подробной информации.
Время — это в среднем 20 выполнений подряд. Измерение проводилось на Ubuntu 20.04.2 LTS с AMD Ryzen 5 3600/64 ГБ оперативной памяти. Цель сканирования была parser.go Анкет ↩
И Semgrep, и Comby написаны в OCAML. ↩
Оригинал: «https://dev.to/y0n3uchy/build-your-own-lint-rules-for-terraform-with-shisho-5fb7»