Для работы с облачными провайдерами существует способ управления инфраструктурой как кодом (англ. 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
Запуск
Для запуска утилиты достаточно ввести команду tfsec
в директории, где хранится конфигурация Terraform. Также можно указать полный путь до директории, например, tfsec /root/aws/aws_ec2_ebs_docker_host.
В качестве примера просканируем конфигурацию сервиса Amazon EC2. В директории с конфигурацией Terraform запускаем tfsec:
tfsec
Как можно увидеть на скриншоте выше, 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
Где:
--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 нашел уязвимости:
Разберем формат вывода на примере одной из найденной проблемы безопасности:
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;
Установка
Установим 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
Для того чтобы просканировать отдельный файл, необходимо использовать опцию --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.