Validación de Plantillas de CloudFormation con CNF-Nag y CFN-Lint

Carlos A. Galvis
Pragma
Published in
5 min readApr 26, 2024

En un entorno DevOps, la automatización y la validación son esenciales para garantizar la eficiencia y la seguridad de tu infraestructura en la nube. En este artículo, exploraremos cómo integrar la validación de plantillas de AWS CloudFormation en un pipeline de integración continua utilizando herramientas como AWS CodePipeline y AWS CodeBuild, a través de CNF-Nag y CFN-Lint.

¿Qué es CFN-Lint?

Es una herramienta de linting diseñada específicamente para analizar y validar plantillas de AWS CloudFormation. Realiza análisis estático del código en las plantillas para identificar posibles problemas, como errores sintácticos, configuraciones inseguras o ineficientes, y prácticas no recomendadas.

El comando de la CLI de AWS aws cloudformation validate, es la solución más común utilizada para verificar sus pilas, pero como el comando no tiene la capacidad de verificar IAM_CAPABILITY', no puede validar eficazmente los recursos de IAM, sin embargo, cfn-lint se puede utilizar como método alternativo para aws cloudformation validate y validar todo Cloudformation, incluidos los recursos de IAM, esta herramienta está disponible en el repositorio github de código abierto de awslabs.

Al utilizar cfn-lint, podrá validar eficazmente los recursos de IAM dentro de las pilas de CloudFormation antes de la implementación, en lugar de esperar a llegar a las etapas de implementación del proceso de entrega continua para tener que adivinar el motivo por el cual sus pilas fallan.

¿Qué es CFN-Nag?

CFN-Nag es una popular herramienta de código abierto desarrollada por Stelligent y proporcionada a la comunidad de código abierto para ayudar a identificar problemas de seguridad desde el principio en una plantilla de AWS CloudFormation . (CloudFormation Nested Stack Automatic Guardrails) incluye un conjunto de reglas automáticas diseñadas para evaluar plantillas de AWS CloudFormation, especialmente aquellas que hacen uso de pilas anidadas, que cubre áreas como seguridad, eficiencia, confiabilidad y buenas prácticas en general.

CFN-Nag busca patrones en las plantillas de AWS CloudFormation que puedan indicar una infraestructura insegura, como por ejemplo:

  • IAM y políticas de recursos (S3 Bucket, SQS, etc.): Coincide con políticas que son demasiado permisivas de alguna manera (por ejemplo, comodines en acciones o principios).
  • Reglas de entrada y salida del grupo de seguridad: Coincide con reglas que son demasiado liberales (por ejemplo, una regla de ingreso abierta a 0.0.0.0/0 , el rango de puertos 1–65535 está abierto).
  • Registros de acceso: Busca registros de acceso que no estén habilitados para los recursos aplicables (por ejemplo, Elastic Load Balancers y CloudFront Distributions).
  • Cifrado: Cifrado (del lado del servidor) que no está habilitado ni aplicado para los recursos aplicables (por ejemplo, volúmenes de EBS o para llamadas PutObject en un depósito S3).

En la siguiente imagen se muestra un ejemplo de una infraestructura para la implementación de estas herramientas en el ciclo de vida desarrollo:

La canalización funciona de la siguiente manera:

un desarrollador crea plantillas de CloudFormation para aprovisionar recursos de infraestructura en AWS, cuando esté listo, el desarrollador envía las plantillas a un repositorio de AWS CodeCommit que luego activará el proceso de infraestructura, las herramientas CFN-Nag y CFN-Lint se ejecutarán en paralelo dentro de un entorno CodeBuild para validar las plantillas. CFN-Nag comparará las plantillas con vulnerabilidades de seguridad conocidas, mientras que CFN-Lint aplicará las mejores prácticas y verificará el cumplimiento de la especificación de CloudFormation, si las plantillas no pasan las pruebas de verificación, la canalización se detendrá en un estado de falla para evitar problemas de implementación, si las plantillas pasan la verificación, CodeDeploy creará o actualizará las pilas de CloudFormation para cada plantilla, si la etapa de deploy falla, la canalización se detendrá en un estado de falla para indicar un problema de implementación, de lo contrario, las pilas se crearán o actualizarán para aprovisionar los recursos de AWS deseados.

Pasos para la configuración:

  • Crea un repositorio en AWS CodeCommit para almacenar tus plantillas de CloudFormation.
  • Crea un pipeline en AWS CodePipeline que esté conectado al repositorio de CodeCommit.
  • Define las etapas del pipeline, como Source (CodeCommit), Build (CodeBuild), y Deploy (por ejemplo, AWS CloudFormation para implementar las plantillas validadas).
  • Crea proyectos de AWS CodeBuild para ejecutar la validación de plantillas de CloudFormation.
  • Configura los pasos del BuildSpec para que ejecuten CFN-Lint y CFN-Nag sobre las plantillas de CloudFormation.

Configurar CFN-Lint:

CFN-Lint está disponible en el repositorio de aws-labs en el siguiente enlace https://github.com/awslabs/cfn-python-lint, puede instalarlo ejecutando pip install cfn-lint.

Ejemplo de código BuildSpec para CFN-Lint:

version: 0.2
phases:
install:
commands:
- pip3 install awscli --upgrade --quiet
- pip3 install cfn-lint --quiet
build:
commands:
- for FILE in $(find . -name "*.yaml"); do
echo "Validating Template - ${FILE}";
echo "Artifact:" ${PWD};
echo " ";
cfn-lint $FILE;
if [ $? -eq 0 ]; then
echo "Executed successfully without errors";
else
echo "Terminated unsuccessfully";
fi;
echo "------------------------";
done;

En este buildspec se validan todas las templates .ymal que existen en repositorio, y en el log se muestra si el resultado del análisis de cfn-lint de cada plantilla termina satisfactoriamente o con errores.

Resultado del análisis:

Sin errores:

Validating Template - ./Lambda.yaml
Artifact: /codebuild/output/src1622765177/src

Executed successfully without errors
-------------------------

Con errores:

Validating Template - ./cloudfront.yaml
Artifact: /codebuild/output/src1622765177/src

E3045 A bucket with AccessControl set should also have OwnershipControl configured
./cloudfront.yaml:115:7

W3045 Consider using AWS::S3::BucketPolicy instead of AccessControl
./cloudfront.yaml:115:7

Terminated unsuccessfully
-------------------------

Configurar CFN-Nag:

Para utilizar CFN-Nag desde su estación de trabajo, necesitará tener instalado Ruby v.2.5 o superior. CFN-Nag está disponible en el repositorio https://github.com/stelligent/cfn_nag, se puede instalar ejecutandogem install cfn-nag.

Ejemplo de código BuildSpec para CFN-Nag:

version: 0.2
phases:
install:
runtime-versions:
ruby: 2.6
commands:
- env && ls -l && ruby -v
- gem install cfn-nag
build:
commands:
- export LANG=en_US.UTF-8
- export LANGUAGE=en_US.UTF-8
- export LC_ALL=en_US.UTF-8
- for FILE in $(find . -name "*.yaml"); do
echo "Validating Template - ${FILE}";
echo "Artifact:" ${PWD};
echo " ";
cfn_nag_scan --input-path=$FILE;
if [ $? -eq 0 ]; then echo "Executed successfully without errors";
else echo "Terminated unsuccessfully";
fi;
echo "--------------------------";
done;

En este buildspec se validan todas las templates .ymal que existen en repositorio, y en el log se muestra si el resultado del análisis de cfn-nag de cada plantilla termina satisfactoriamente o con errores.

Resultado del análisis:

Validating Template - ./SNS.yaml
Artifact: /codebuild/output/src1453857922/src

WARN W47
SNS Topic should specify KmsMasterKeyId property

Failures count: 0
Warnings count: 1
Executed successfully without errors
--------------------------

Al integrar la validación de plantillas de CloudFormation en un pipeline de integración continua proporciona una forma automatizada de garantizar la calidad y la seguridad de tu infraestructura en la nube. Al utilizar herramientas como CFN-Lint y CFN-Nag, puedes identificar y corregir problemas potenciales antes de implementar tus plantillas en entornos de producción.

Referencias:

https://aws.amazon.com/es/blogs/opensource/using-aws-codepipeline-and-open-source-tools-for-at-scale-infrastructure-deployment/

https://github.com/aws-cloudformation/cfn-lint

https://github.com/stelligent/cfn_nag

--

--