Перевод статьи подготовлен в преддверии старта курса "Infrastructure as a code in Ansible".


Также хотим порекомендовать вам супер-интенсив «IaC Ansible» за 5 дней которого вы научитесь делать выкатку кода простым и приятным процессом в духе "нажми одну кнопку", делать сетап новой машины полностью автоматизированным, автоматически поддерживать актуальными все проверки и триггеры в мониторинге и узнавать о проблемах еще до того, как они наступили и многое другое.


В моей последней статье (ссылка) мы рассмотрели модель управления «инфраструктура как код» (IaC), ее важность, причины ее применения многими компаниями, а также возможные способы повышения безопасности конвейера IaC.

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

Теперь давайте разберем реальный пример того, как можно автоматически проконтролировать корректность методов разработки в конвейерах IaC для среды AWS посредством сотен проверок на соответствие правилам AWS Well-Architected Framework (безопасность, оптимизация затрат, производительность, высокие стандарты профессиональной деятельности и надежность) и другим стандартам.

Вот общее представление того, над чем мы будем работать:

Исходные требования

Для формирования нужной нам среды вам понадобятся следующие элементы:

Приступим к созданию вашего первого конвейера «инфраструктура как код» (IaC) с проверкой применения правильных методов разработки!

Этап 1. Установка подключаемого модуля безопасности в среду программирования и получение токена API для сканирования шаблонов CloudFormation

После установки среды VSCode IDE не забудьте также установить подключаемый модуль Cloud Conformity Security, как показано здесь:

  • VSCode Marketplace — подключаемый модуль Cloud Conformity — ССЫЛКА

Расширение для сканирования шаблонов Cloud One — Conformity Template Scanner
Расширение для сканирования шаблонов Cloud One — Conformity Template Scanner

Создайте свою учетную запись в Cloud One — Conformity, воспользовавшись приведенной здесь ссылкой (создать учетную запись), войдите в нее и сформируйте токен API.

В среде Cloud Conformity: щелкните имя пользователя вверху справа и выберите > User Settings (Настройки пользователя) > API Keys (Ключи API) > New API Key (Создать ключ API), чтобы создать ключ API, который будет использоваться в подключаемом модуле VSCode. Обязательно скопируйте ключ и сохраните его в надежном месте. Получить его еще раз невозможно.

Скопируйте ключ API и вернитесь в среду VSCode 

1. Щелкните значок расширений (слева) и нажмите Extension Settings (Настройки расширений) ?? для записи сканера шаблонов Cloud Conformity Template Scanner.

2. В среде Cloud Conformity выберите Edit in settings.json (Изменить файл settings.json). Перейдите к разделу ApiKey.

3. Введите ключ API, сформированный на предыдущем шаге, и сохраните изменения.

Теперь шаблоны CloudFormation можно сканировать с использованием сотен проверок на соответствие правилам AWS Well-Architected Framework и другим стандартам, гарантируя превосходное качество разрабатываемой облачной инфраструктуры.

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

Чтобы испытать расширение в работе, откройте указанный выше шаблон CloudFormation с помощью VSCode, после чего откройте палитру команд, нажав:

  • macOS: ? + ? + P

  • Windows/Linux: Ctrl + Shift + P

Найдите элемент Cloud One Conformity: Scan the Current Open Template (Cloud One Conformity: сканировать открытый шаблон) и нажмите <Enter>, после чего автоматически начнется сканирование этого шаблона CloudFormation:

Результат сканирования появится на второй вкладке под названием Scan Result (Результат сканирования), как на приведенном ниже изображении. Также можно воспользоваться облачной базой знаний, которая поможет лучше понять выявленные нарушения рекомендуемых методов, а также узнать способы их устранения в вашем шаблоне CloudFormation или в производственных средах:

Превосходно, первый этап автоматизации безопасности IaC завершен. 

Этап 2. Создание конвейера CI/CD средствами AWS с последующей интеграцией в него сканера шаблонов Conformity

На первом этапе мы показали, как можно выполнять сканирование перед отправкой новой версии кода в репозиторий. Однако иногда разработчик может забыть сделать это и сохранить шаблон CFT, в котором есть проблемы. Сейчас мы создадим шлюз безопасности, который поможет предотвратить появление новых ресурсов, не соответствующих методам разработки, рекомендуемым вашей компанией.

С помощью такого шлюза можно отслеживать и выполнять аудит всех изменений в реальном времени и только затем производить развертывание в среду AWS. 

В этом разделе мы покажем, как использовать сканер шаблонов в конвейере CI/CD с AWS CodeCommitAWS CodeBuild и AWS CodePipeline. Приступим.

CodeCommit будет использоваться в качестве репозитория для размещения нашего кода. Многие люди и компании со всего мира используют для этого GitHub, GitLab и BitBucket. Чтобы ваша среда VSCode могла перемещать код в CodeCommit, нужно будет кое-что настроить.

Создание репозитория Git в AWS CodeCommit

  • Создайте пользователя IAM с разрешением использовать CodeCommit и доступом только с помощью ключа SSH. (Сведения о разрешении для Git и рекомендации приведены по этой ссылке от AWS.)

Перейдите в раздел Security credentials (Учетные данные безопасности) > HTTPS Git credentials for AWS CodeCommit (Учетные данные Git HTTPS для AWS CodeCommit), чтобы сформировать учетные данные.

Загрузите учетные данные и сохраните их в надежное место.

Подробнее об этой процедуре на сайте AWS > ССЫЛКА.

  • Создайте репозиторий AWS CodeCommit.

Можно выполнить команду git clone на своем компьютере и легко перенести на него git config.

git clone https://git-codecommit.us-east-1.amazonaws.com/v1/repos/{ИМЯ ВАШЕГО РЕПОЗИТОРИЯ}

Теперь можете воспользоваться собственным шаблоном CloudFormation или взять плохой шаблон CloudFormation, который я предоставил ранее, для передачи в AWS CodeCommit.

git add .

git commit -m "First Commit"

git push

Итак, первое сохранение в AWS CodeCommit выполнено. Теперь давайте перейдем к AWS CodeBuild и AWS CodePipeline.

Создание CodeBuild для автоматического сканирования шаблонов CloudFormation

Решение AWS CodeBuild очень похоже на GitHub Actions, Azure DevOps и GitLab. Это технология CI/CD, с помощью которой можно создавать новые проекты, автоматизировать процессы и развертывать новые приложения или инфраструктуры.

Мы будем использовать CodeBuild с определенным образом контейнера для запуска сканера шаблонов Conformity с целью выявления возможных проблем перед развертыванием новой IaC в производственной среде.

  • Создание проекта построения в AWS CodeBuild

Я буду использовать стандартный образ от AWS, но вы можете взять другой образ управления или создать собственный для автоматизации подобного типа.

Вот конфигурация для приведенного ниже образа:

Environment image: Managed Image
Operationg System: Amazon Linux 2
Runtime: StandardImage: aws/codebuild/amazonlinux2-x8664-standard:3.0
Image version: Always use the latest
Environment type: Linux
Service Role: New
Role Name: <NEW ROLE NAME>

Вот конфигурация для приведенного ниже образа:

Environment Variables
CC_API_KEY = <YOUR API KEY FROM CLOUD ONE - CONFORMITY>
CC_REGION = <REGION SELECTED TO CREATE YOUR CONFORMITY TENANT>
CC_RISK_LEVEL = <RISK LEVEL NOT BE ACCEPT>
CFN_TEMPLATE_FILE_LOCATION = <YOUR CLOUDFORMATION TEMPLATE PATH>
STACK_NAME = <THE CLOUDFORMATION STACK NAME

Вот конфигурация для приведенного ниже образа:

Build specifications: Insert build commands
Build Commands:version: 0.2phases:
    install:
        runtime-versions:
            python: 3.7
    pre_build:
        commands:
            - pip3 install awscli --upgrade --user
    build:
        commands:
            - pip3 install -r https://raw.githubusercontent.com/OzNetNerd/Cloud-Conformity-Pipeline-Scanner/master/requirements.txt
            - wget https://raw.githubusercontent.com/OzNetNerd/Cloud-Conformity-Pipeline-Scanner/master/src/scanner.py
            - CC_API_KEY=`jq -r '.CC_API_KEY' <<< $CC_API_KEY`
            - python3 scanner.py
            
    post_build:
        commands:
            - aws cloudformation deploy --template-file $CFN_TEMPLATE_FILE_LOCATION --stack-name $STACK_NAME --no-fail-on-empty-changese

Ссылка на Buildspec.yml на GitHub — https://raw.githubusercontent.com/fernandostc/IaC-Security-Automation/master/buildspec.yml

Примечание. Сканер шаблонов, который я использую в этом примере, был создан Уиллом Робисоном (Will Robison) — архитектором решений из компании Trend Micro — вот ссылка на этот проект на GitHub: https://github.com/OzNetNerd/Cloud-Conformity-Pipeline-Scanner

Теперь нажмите Create build project (Создать проект построения), чтобы завершить процесс. 

Создание секретного ключа в диспетчере секретов для хранения ключа API Cloud One — Conformity

Теперь нажмите Store (Сохранить), чтобы завершить процесс. 

Важно! Не забудьте создать политику, чтобы назначить своей службе ролей в CodeBuild следующее разрешение, с которым CodeBuild сможет получать значение от SecretManager:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "arn:aws:secretsmanager:us-east-1:<AWS Account ID>:secret:<Secret Key ARN>"
        }
    ]
}

Создание AWS CodePipeline для автоматизации триггера запуска сканирования шаблонов

AWS CodePipeline поможет автоматизировать процесс запуска сканера шаблонов после каждого обновления кода IaC. В CodePipeline можно создать несколько этапов, однако наш пример простой, для него достаточно одного этапа. Он очень прост для понимания.

Создадим новый конвейер в AWS CodePipeline

 

Можно задать имя конвейеру и создать новую роль службы, если до этого у вас ни одной роли службы не было.

Теперь нужно задать следующие параметры с учетом созданного ранее CodeCommit:

Source Provider (Поставщик исходного кода): <AWS CodeCommit>Repository Name (Имя репозитория): <CloudOneConformity или заданное вами ранее имя репозитория>Branch Name (Имя ветви): <master>

Теперь нужно задать информацию о процессе построения:

Build provider (Поставщик построения): <AWS CodeBuild>Project Name (Имя проекта): <IaC-Security-Automation или заданное вами ранее имя репозитория>

В данном случае мы не планируем использовать команды развертывания, поскольку развертывание мы выполняем внутри CodeBuild в рамках одного из этапов. Можно нажать Skip the deploy stage (Пропустить этап развертывания).

Можно просмотреть конфигурацию и нажать Create pipeline (Создать конвейер).

Тестирование автоматизированного конвейера

1. Создайте собственный шаблон CloudFormation или воспользуйтесь вот этим: ссылка.

2. Просканируйте шаблон CloudFormation с помощью подключаемого модуля Cloud One — Conformity и проверьте результат.

 

 

Удостоверьтесь, что остались некоторые проблемы, которые нужно устранить перед сохранением в производственную среду.

3. Шаблон можно отправить в репозиторий, чтобы проверить его работоспособность в конвейере. Это своеобразный тест перед исправлением всех проблем, найденных в шаблоне CloudFormation.

4. Сохраните новый код в CodeCommit:

git add .
git commit -m "Test Automation"
git push

5. Сохранение нового кода в CodeCommit приведет к запуску CodePipeline.

После завершения процесса автоматизации вы увидите, что оба этапа выполнены успешно.

ПРИМЕЧАНИЕ. В случае возникновения каких-либо проблем проверьте процесс построения. Перейдите к последнему построению и просмотрите его журналы. Они очень полезны для отладки в случае возникновения затруднений.

 

Заключение

Итак, у вас есть полностью автоматизированный конвейер IaC с AWS CodeCommit, AWS CodeBuild, AWS CodePipeline и Cloud One — Conformity, позволяющий анализировать всевозможные отклонения конфигурации в ходе процесса создания шаблонов CloudFormation.

Надеюсь, эта статья поможет вам и вашей группе не отступать в ходе разработки от передовых методов построения архитектур и эффективно работать над инновационными облачными решениями в сжатые сроки. Если вам нужна дополнительная информация, обязательно свяжитесь со мной!

Благодарности

Хочу сказать БОЛЬШОЕ спасибо некоторым людям, которые своими потрясающими отзывами помогли мне сделать эту статью лучше:

  • Raphael Bottino (Рафаэль Боттино)

  • Melissa Clow (Мелисса Клоу)

Если эта статья была вам полезна, жмите стрелочку вверх и пишите комментарии.


- Узнать подробнее о курсе"Infrastructure as a code in Ansible".


- Записаться на супер-интенсив «IaC Ansible»