Autores: Wilmar Alejandro Velez Londoño, Expert Engineer I & Javier Alberto Sepúlveda Gómez, Senior Functional Consultant, Sophos Solutions.

Terraform es una herramienta de software de código abierto creada por haschiCorp y está desarrollada en Go, la herramienta nos permite administrar cientos de servicios y aprovisionar infraestructura en nubes tanto públicas como privadas mediante un único flujo de trabajo. Con Terraform podemos codificar nuestra infraestructura, reducir el error humano y aumentar la automatización mediante el aprovisionamiento de infraestructura como código.

Terraform es compatible con cualquier sistema operativo. Cada sistema operativo tiene su binario y a través de este es posible interactuar con las APIs de los proveedores de nube. El flujo de trabajo de aprovisionamiento de Terraform se basa en tres comandos: plan, apply y destroy. Todos estos comandos requieren un directorio de trabajo inicializado y actúan solo en el espacio de trabajo seleccionado, démosle una revisión rápidamente:

(HashiCorp, s.f.)

TERRAFORM PLAN

Permite crear un plan de ejecución el cual nos deja visualizar qué recursos se van a crear en el proveedor de nube con la definición que se está creando.

TERRAFORM APPLY

El comando “terraform apply” repite el proceso de “terraform plan” utilizando la API del proveedor de infraestructura salvo que solicita la confirmación del usuario antes de realizar cualquier cambio.

TERRAFORM DESTROY

Antes de la versión 1.0 de Terraform solo se podía utilizar el comando “terraform destroy” para destruir la infraestructura, ahora es posible utilizar el comando mencionado como una opción de “terraform apply” quedando “terraform apply -destroy”. También es posible especular para ver cuál sería el efecto de destruir infraestructura, ejecutando el comando “terraform plan -destroy”.

Ahora que tenemos los conceptos básicos de Terraform realicemos una demostración implementando CI/CD con las herramientas DevOps de AWS y aplicando conceptos de DevSecOps para infraestructura como código (IaC).  Uno de los objetivos fundamentales de IaC es poder tratar los componentes de infraestructura como si se tratase de una aplicación por tanto el código debe pasar por el ciclo de vida de desarrollo usual.

Con el fin de validar la configuración adecuada del ambiente y alineamiento con buenas prácticas usaremos checkov para cumplir con el escaneo de vulnerabilidades y configuración de nube que en posts posteriores abordaremos en profundidad.

PREREQUISITOS

  • Una cuenta de AWS
  • Terraform version ≥ 15.0
  • Python ≥3.7
  • Checkov
Figura 1 Diagrama de arquitectura

Los pasos de implementación serán los que se muestran en la Figura 1:

  1. Realizamos un Git Push a AWS CodeCommit
  2. Enviamos un archivo de configuración de Terraform y una especificación de compilación a una fuente de AWS CodePipeline.
  3. AWS CodePipeline invoca automáticamente AWS CodeBuild y descarga los archivos fuente.
  4. AWS CodeBuild instala y ejecuta Terraform de acuerdo con la especificación de compilación, luego instala Checkov que nos ayuda a analizar código estático para escanear configuraciones incorrectas que puedan generar problemas de seguridad o cumplimiento.
  5. Terraform almacena los archivos de estado en AWS S3
  6. Por último, se crean recursos con los archivos de definición de Terraform.
  7. Reporte checkov en formato junitxml

DEMOSTRACIÓN

1. Iniciamos creando un repositorio de AWS CodeCommit, te dejo un enlace con las instrucciones para que crees un repositorio, y de igual forma configures el acceso al mismo.
Creación de un repositorio de AWS CodeCommit – AWS CodeCommit

La figura 2 muestra como ya con el repositorio configurado hemos realizado nuestro primer commit a la rama master.

Figura 2 initial commit AWS CodeCommit

2. Creamos una canalización de AWS CodePipeline, te dejo un enlace con las instrucciones para que crees una canalización.

Nota: CodePipeline admite diferentes fuentes, como AWS S3 o GitHub; si se siente cómodo con esos servicios, puede sustituirlos mientras avanza en esta demostración. En esta demostración usaremos el repositorio de AWS CodeCommit creado anteriormente.
Creación de una canalización en CodePipeline – AWS CodePipeline

En este punto ya hemos configurado AWS CodePipeline como se ve en la figura 3 y como fuente estamos usando AWS CodeCommit.

Figura 3 Stage Source AWS CodePipeline

3. Por último, usamos AWS CodeBuild como servicio de integración continua que compilara nuestro código fuente y nos ayudara a ejecutar pruebas.  Te dejo un enlace con las instrucciones y crees un servicio de compilación con AWS CodeBuild.
Creación de un proyecto de compilación (consola) – AWS CodeBuild
Nota: Para este laboratorio hemos generado un role con permisos sobre AWS S3, AWS CodeCommit, AWS CodeBuild, AWS CloudWatch Logs, y AWS Ec2. Recuerda siempre usar permisos de mínimo privilegio, en caso de que quieras interactuar con otros servicios debes asignar los permisos correspondientes.

Figura 4 Proyecto AWS CodeBuild

Una vez creado nuestro servicio de compilación agregamos a AWS codepipeline un stage de build.

Figura 5 Stage Source y Build AWS CodePipeline

Adicional este el buildspec que hemos configurado y que AWS CodeBuild utiliza para ejecutar una compilación con comandos de compilación.

Figura 6 Code buildspec AWS CodeBuild

El buildspec utiliza variables de entorno que se muestra en la figura 7.

Figura 7 Variables de entorno AWS Codebuild

Una vez nuestro entorno está configurado procedemos para probar nuestra compilación y simular que nuestras definiciones en Terraform están alineadas con las mejores prácticas.

En la figura 8 podemos visualizar la estructura de nuestro repositorio y cada una de las plantillas Terraform con sus definiciones.

Figura 8 Estructura repositorio


Iniciaremos haciendo un cambio en el repositorio para generar un Push con la variación en la rama master de AWS CodeCommit, esto a su vez dispara AWS CodePipeline e inicia un nuevo build con AWS CodeBuild el cual descarga el código fuente como primer stage, el segundo stage de build se encarga de descargar Terraform, luego instala checkov con Python y ejecuta los comandos que nos ayudaran con el scaneo de código estático, luego a generar un reporte, seguido a inicializar el directorio de trabajo, realizar un plan de la infraestructura y por ultimo aplicar o destruir la infraestructura.

Nuestro primer build está configurado para que falle en el stage de build porque no reúne las mejores prácticas al momento de desplegar infraestructura. Revisemos las siguientes figuras.

Figura 9 push AWS CodeCommit
Figura 10 Pipeline Failed
Figura 11 Failed stage build

Revisemos los logs del stage build que falló.

Figura 12 Install python 3.7
Figura 13 Download terraform and unzip
Figura 14 Install checkov
Figura 15Prebuild stage terraform scan
Figura 16 checkov terraform scan failed

En la figura 16 se puede visualizar como checkov rompe el pipeline por que encontró una recomendación de seguridad, a continuación, se corrige la recomendación y se repite el proceso.

Figura 17 Git status

Corregimos la recomendación de checkov y hacemos git Push al repositorio de CodeCommit.

Figura 18 Git Push origin master AWS CodeCommit

Revisamos los stages de CodePipeline.

Figura 19 Stages AWS CodePipeline

Revisemos los logs del stage build.

Figura 20 Install Python 3.7
Figura 21 Download terraform and unzip
Figura 22 Install checkov
Figura 23 Prebuild stage terraform scan
Figura 24 Reporte formato junit xml checkov
Figura 25 Terraform Init
Figura 26 Terraform plan
Figura 27 Terraform Apply
Figura 28 informe generado por pruebas funcionales.
Figura 29 Análisis código estático Checkov

Con esta demostración se puede configurar CD para desplegar el código de Terraform y pasarlo por validaciones haciendo uso de herramientas como Checkov que ayudan a que el despliegue de la infraestructura este bajo las mejores prácticas y libre de configuraciones indeseadas que pueden representar un riesgo. Servicios como AWS CodePipeline, AWS CodeBuild, AWS CodeCommit permiten automatizar implementaciones de infraestructura sin necesidad de aprovisionar recursos adicionales como máquinas virtuales o contenedores.

Deja una respuesta

Cerrar menú