Обзор сканеров безопасности для проверки конфигурации Terraform

edbfd3cf92043296b0e40145ad9762a5.jpg

Для работы с облачными провайдерами существует способ управления инфраструктурой как кодом (англ. Infrastructure-as-Code, сокр. Iac). Для этих задач используется широко известный инструмент под названием Terraform.

В основном он используется для работы с такими провайдерами, как Amazon Web Services, Microsoft Azure, Google Cloud Platform, Oracle Cloud. Также Terraform поддерживает работу с необлачными решениями, в их числе Active Directory, Docker, VMware vSphere.

Как и при использовании любой другой технологии, при работе с конфигурацией Terraform могут возникать различные проблемы безопасности — несанкционированный доступ, инъекционные атаки, внедрение вредоносного кода, инсайдерские угрозы. В статье рассмотрим популярные утилиты, которые помогут выявить такие проблемы в конфигурационных файлах Terraform.

Утилиты для проверки Terraform-конфигурации

Tfsec

Официальный сайт: github.com

Документация: github.io

Лицензия: Open-source

Преимущества:

  • Кроссплатформенность. Tfsec можно запустить на Windows, macOS и Linux/Unix. Также поддерживается запуск в контейнере Docker и возможность сборки из исходного кода;

  • Высокая скорость работы;

  • Сотни встроенных модулей для поиска уязвимостей;

  • Функционал по созданию отчетов. Поддерживаются форматы JSON, SARIF, CSV, CheckStyle, JUnit, text, Gif;

  • Наличие встраиваемого плагина для различных IDE (JetBrains, VSCode, Vim);

  • Поддержка пользовательских (кастомных) правил.

Tfsec — сканер безопасности, использующий метод статического анализа кода для поиска потенциальных уязвимостей в конфигурационных файлов Terraform. Tfsec разработан известной компанией в сфере информационной безопасности — Aqua Security. Утилита проверяет синтаксис, модули, функции на наличие угроз и корректность конфигурации. Включает поддержку таких провайдеров, как AWS, Azure, CloudStack, DigitalOcean, Google Cloud, Oracle Cloud.

Установка

Установим и запустим утилиту на ОС Ubuntu 22.04. Для установки достаточно выполнить одну команду:

curl -s https://raw.githubusercontent.com/aquasecurity/tfsec/master/scripts/install_linux.sh | bash

103a41b47f55c975026d4c473740f88b.png

Запуск

Для запуска утилиты достаточно ввести команду tfsec в директории, где хранится конфигурация Terraform. Также можно указать полный путь до директории, например, tfsec /root/aws/aws_ec2_ebs_docker_host.

В качестве примера просканируем конфигурацию сервиса Amazon EC2. В директории с конфигурацией Terraform запускаем tfsec:

tfsec

e009686e6a45141221c2e5cdf174f5c5.png

Как можно увидеть на скриншоте выше, tfsec нашел уязвимость в конфигурации Terraform. Разберем формат вывода на примере найденной проблемы безопасности:

Result #1 CRITICAL Security group rule allows egress to multiple public internet addresses.
Сначала указывается степень критичности найденной уязвимости. В данном случае она была обозначена как критическая (CRITICAL). В качестве степени tfsec использует значения CRITICAL, HIGH, MEDIUM, LOW.

CRITICAL — максимально серьезная уязвимость, а LOW — самая низкая.

Далее следует описание текущей проблемы безопасности. Из него видно, что уязвимость заключается в том, что сервис доступен из внешней сети и к нему может получить доступ каждый пользователь.

security.tf:20
Указывается имя файла (security.tf) и строка, где была найдена уязвимость (строка под номером 20).

14    resource «aws_security_group_rule» «outgoing_any» {

15      security_group_id = »

16      type              = «egress»

17      from_port         = 0

18      to_port           = 0

19      protocol          = »-1»

20  [   cidr_blocks       = [»0.0.0.0/0»]

21    }
Блок кода, в котором найдена уязвимость с пронумерованными строками.

aws-ec2-no-public-egress-sgr
ID правила, которое хранится в базе данных tfsec.

Impact Your port is egressing data to the internet 
Описание, в котором указано, какое влияние оказывает найденная уязвимость.

Resolution Set a more restrictive cidr range
Решение найденной уязвимости.

По умолчанию tfsec выводит результаты своей работы в консоль. Для записи результатов в отдельный файл необходимо воспользоваться командой:

tfsec --out results -f json

d0d79708391a7a3718e627c85dea726f.png

Где:
--out results — имя файла, в который будут записаны результаты работы tfsec;
-f json — формат файла, в который будут записаны результаты работы tfsec. Вместо json можно указать любой другой поддерживаемый формат — sarif, csv, checkstyle, junit, text, gif.

Terrascan

Официальный сайт: github.com

Документация: runterrascan.io

Лицензия: Open-source

Преимущества:

  • Кроссплатформенность. Утилита работает на Windows, macOS и Linux/Unix. Также поддерживается запуск в контейнере Docker;

  • Более 500 встроенных политик для поиска уязвимостей;

  • Встраивание в процессы CI/CD. Документация доступна по ссылке. 

Terrascan — статический анализатор кода для сканирования конфигурационных файлов Iac. Содержит большое количество встроенных правил. Поддерживает системы AWS, Azure, GCP, а также Kubernetes, файлы Dockerfile и GitHub.

Установка

Установим и запустим утилиту на ОС Ubuntu 22.04. Для установки необходимо выполнить следующие шаги:

1) Скачиваем последнюю актуальную версию утилиты:

curl -L "" class="formula inline">(curl -s https://api.github.com/repos/tenable/terrascan/releases/latest | grep -o -E "https://.+?_Linux_x86_64.tar.gz")" > terrascan.tar.gz

2) Разархивируем скачанный архив:

tar -xf terrascan.tar.gz terrascan && rm terrascan.tar.gz

3) Копируем бинарный файл terrascan в директорию /usr/local/bin и удаляем файл terrascan из текущей директории:

install terrascan /usr/local/bin && rm terrascan

4) Проверяем, что утилита успешно установилась, запустив ее без параметров:

terrascan

Запуск

Перед началом сканирования обновим базу правил terrascan при помощи команды:

terrascan init

В качестве примера просканируем конфигурацию сервиса Amazon EC2. В директории с конфигурацией Terraform запускаем terrascan:

terrascan scan

Как можно увидеть на скриншоте выше, terrascan нашел уязвимости:

a56e920c7f96ae3ce7a66be934b96bd2.png

Разберем формат вывода на примере одной из найденной проблемы безопасности:

Description: Security Groups — Unrestricted Specific Ports — (HTTP,80)
Описание найденной уязвимости. Здесь сообщается, что был найден стандартный порт — 80. Рекомендуется использовать диапазон нестандартных (зарегистрированных) портов для обеспечения безопасности;

File: security.tf 
Файл, в котором была найдена уязвимость. 

Module Name: root 
Имя используемого модуля terrascan, который обнаружил уязвимость.

Plan Root: ./
Путь до директории, в которой была найдена уязвимость.

Line: 225 
Строка кода, в которой была найдена уязвимость.

Severity: HIGH 
Степень критичности найденной уязвимости. В качестве степени критичности terrascan использует значения HIGH, MEDIUM, LOW. Здесь HIGH — это высокая уязвимость, а LOW — низкая.

В конце каждого сканирования выводится итоговый отчет, который включает в себя следующие параметры:

Scan Summary -

File/Folder         : /root/aws/aws_ec2_ebs_docker_host

IaC Type            : terraform

Scanned At          : 2024–04–24 13:01:48.922916892 +0000 UTC

Policies Validated  : 142

Violated Policies   : 7

Low                 : 1

Medium              : 1

High                : 5

Policies Validated — количество политик, которые были задействованы при сканировании, Violated Policies —количество политик, по которым были найдены уязвимости.

По умолчанию terrascan выводит результат работы в терминал. Для записи в файл необходимо воспользоваться командой:

terrascan scan -o json > results

Где:
-o json — тип формата, в котором будет сохранен результат работы утилиты. Поддерживаются форматы human, json, yaml, xml;
> results — перенаправить вывод утилиты в файл с именем results.

Checkov

Официальный сайт: github.com

Документация: checkov.io

Лицензия: Open-source

Преимущества:

  • Утилита разработана компанией Palo Alto Networks. Также в создании участвуют авторы продукта Prisma Cloud;

  • Поддержка сервисов Terraform, Terraform plan, Cloudformation, AWS SAM, Kubernetes, Helm, Kustomize, Dockerfile, Serverless, Bicep, OpenAPI;

  • Более 1000 встроенных политик;

  • Наличие функционала по созданию собственных правил.

Установка

Установим Checkov на Ubuntu 22.04. Установка производится при помощи пакетного менеджера pip для Python. Для начала убедитесь, что у вас установлен pip. Для этого в терминале выполните команду:

pip3

Если в ответ вернулась фраза «Command 'pip3' not found», то установите pip при помощи команды:

apt -y install python3-pip

После этого можно установить Checkov:

pip3 install checkov

Запуск

Checkov может сканировать как целую директорию с конфигурационными файлами terraform, так и отдельные файлы. Чтобы просканировать сразу всю директорию, необходимо использовать опцию --directory:

checkov --directory /root/aws/aws_reverse_proxy

473739b1b716a4fdfe5780a6cac24677.png

Для того чтобы просканировать отдельный файл, необходимо использовать опцию --file:

checkov --file /root/aws/aws_reverse_proxy/lambda.tf

На примере сервиса AWS Lambda рассмотрим вывод утилиты:

Check: CKV_AWS_50: «X-Ray tracing is enabled for Lambda»

File: /lambda.tf:35–49

Guide: https://docs.prismacloud.io/en/enterprise-edition/policy-reference/aws-policies/aws-serverless-policies/bc-aws-serverless-4

35 | resource «aws_lambda_function» «viewer_request» {

36 |   provider = «aws.us_east_1» # because: error creating CloudFront Distribution: InvalidLambdaFunctionAssociation: The function must be in region 'us-east-1'

37 |

38 |   # lambda_zip.output_path will be absolute, i.e. different on different machines.

39 |   # This can cause Terraform to notice differences that aren’t actually there, so let’s convert it to a relative one.

40 |   # https://github.com/hashicorp/terraform/issues/7613#issuecomment-332238441

41 |   filename = »${substr (data.archive_file.lambda_zip.output_path, length (path.cwd) + 1, -1)}»

42 

43 |   source_code_hash = »${data.archive_file.lambda_zip.output_base64sha256}»

44 |   function_name    = »${local.prefix_with_domain}---viewer_request»

45 |   role             = »${aws_iam_role.this.arn}»

46 |   description      = »${var.comment_prefix}${var.site_domain} (request handler)»

47 |   handler          = «lambda.viewer_request»

48 |   runtime          = «nodejs8.10»

49 |   publish          = true

Check: CKV_AWS_50: «X-Ray tracing is enabled for Lambda»

Наименование и номер использованной политики, которая обнаружила уязвимость. Ознакомиться с политиками Checkov можно в соответствующем разделе на официальном сайте;

File: /lambda.tf:35–49
Имя файла, в котором была найдена уязвимость, и номера строк с уязвимостями;

Guide: https://docs.prismacloud.io/en/enterprise-edition/policy-reference/aws-policies/aws-serverless-policies/bc-aws-serverless-4
Ссылка на документацию официального сайта программы Prisma Cloud, в которой предоставлено описание найденной уязвимости и также перечислены шаги для ее исправления.

35 | resource «aws_lambda_function» «viewer_request» {

36 |   provider = «aws.us_east_1» # because: error creating CloudFront Distribution: InvalidLambdaFunctionAssociation: The function must be in region 'us-east-1'

37 |

38 |   # lambda_zip.output_path will be absolute, i.e. different on different machines.

39 |   # This can cause Terraform to notice differences that aren’t actually there, so let’s convert it to a relative one.

40 |   # https://github.com/hashicorp/terraform/issues/7613#issuecomment-332238441

41 |   filename = »${substr (data.archive_file.lambda_zip.output_path, length (path.cwd) + 1, -1)}»

42 |

43 |   source_code_hash = »${data.archive_file.lambda_zip.output_base64sha256}»

44 |   function_name    = »${local.prefix_with_domain}---viewer_request»

45 |   role             = »${aws_iam_role.this.arn}»

46 |   description      = »${var.comment_prefix}${var.site_domain} (request handler)»

47 |   handler          = «lambda.viewer_request»

48 |   runtime          = «nodejs8.10»

49 |   publish          = true

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

Чтобы сохранить результат работы Checkov в отдельный файл, необходимо использовать опцию  --output-file-path с указанием имени файла и формата, в котором будет сохранен отчет:

checkov --directory /root/aws/aws_reverse_proxy --output-file-path results.json

Помимо формата json, можно использовать csv, sarif, spdx и xml.

При работе с конфигурацией Terraform не стоит забывать про безопасность. Повысить уровень безопасности можно при помощи разнообразных утилит для сканирования конфигурационных файлов — Tfsec, Terrascan, Checkov. Каждая утилита использует свою базу правил для поиска уязвимостей, а также обладает различным функционалом. Благодаря этому вы сможете подобрать оптимальный инструмент, который подойдет под ваши задачи. С целью выявления большего количества возможных проблем безопасности можно использовать все 3 утилиты сразу.

НЛО прилетело и оставило здесь промокод для читателей нашего блога:
— 15% на заказ любого VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.

© Habrahabr.ru