Blog de Amazon Web Services (AWS)
Como mejorar la seguridad de tus aplicaciones AWS CDK con Checkov y CFN-Guard
Por Manuel Quijano
Con la creciente complejidad de las arquitecturas de la nube, es fundamental garantizar que nuestras aplicaciones y recursos estén configurados correctamente antes de su despliegue. Checkov y CFN-Guard son dos herramientas open-source esenciales para desarrolladores de AWS que desean verificar automáticamente sus aplicaciones con el AWS Cloud Development Kit (CDK) antes de desplegarlas a AWS. En este artículo, te guiaré a través de los pasos para integrar estas herramientas y cómo pueden ayudarte a crear aplicaciones más seguras y eficientes.
¿Qué es Checkov?
Checkov es una herramienta de análisis estático de código open-source para la infraestructura como código (IaC). Puede escanear archivos Terraform, AWS CloudFormation, Kubernetes, entre otros, y detectar problemas relacionados con la seguridad, eficiencia y cumplimiento de las mejores prácticas.
¿Qué es CFN-Guard?
CFN-Guard es una herramienta de AWS open-source que permite establecer y aplicar reglas de cumplimiento a las plantillas de CloudFormation. Es especialmente útil para las empresas que necesitan cumplir con políticas específicas de configuración.
Verificación de aplicaciones CDK
Cuando desarrollas una aplicación con CDK, defines tus recursos y configuraciones utilizando lenguajes de programación populares como Python, Typescript, JavaScript, Java, C#/Net y Go. Antes del despliegue, CDK sintetiza esta definición en una plantilla de CloudFormation. Es en esta etapa donde Checkov y CFN-Guard pueden ser integrados.
Nota: Checkov y CFN-Guard pueden ser utilizados directamente con AWS CloudFormation.
Pre requisitos:
Para este recorrido, debes tener los siguientes requisitos previos:
- Una instalación local y experiencia en el uso de AWS CDK.
- Una instalación local de Checkov. Consulta esta documentación para más información.
- Una instalación local de CFN-Guard. Consulta esta documentación para más información.
Pasos
1. Crear una aplicación de AWS CDK
En esta sección crearás y sintetizarás una pequeña aplicación de AWS CDK v2 con un topic (tema) de Amazon Simple Notification System (Amazon SNS). Si no estás familiarizado con el uso de AWS CDK, aprende a instalar y configurar el CDK de AWS siguiendo las instrucciones de este repositorio de GitHub de código abierto.
Ejecuta los siguientes comandos para crear la aplicación de AWS CDK usando Typescript:
mkdir CdkTest
cd CdkTest
npx cdk init app --language typescript
- Reemplaza el contenido de lib/cdk_test-stack.ts por lo siguiente:
import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";
import * as sns from "aws-cdk-lib/aws-sns";
export class CdkTestStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const topic = new sns.Topic(this, "Topic", {
displayName: "My topic",
});
}
}
Este código importa las dependencias necesarias de CDK y crea una clase llamada CDKTest . Dentro del constructor de esta clase se instancia un objeto de la clase de sns para crear un topic llamado “My topic”.
- Ejecuta los siguientes comandos para instalar dependencias y sintetizar nuestra aplicación de ejemplo:
npm install
npx cdk synth -q
Deberías ver una plantilla de AWS CloudFormation con un topic de SNS en cdk.out/CdkTestStack.template.json
- Ejecuta el siguiente comando para validar nuestra plantilla con Checkov:
checkov --framework cloudformation --quiet -f cdk.out/*.template.json
El resultado de ejecutar el comando es una validación fallida, ya que el topic de SNS no está encriptado:
Checkov incluye más de 750 políticas predefinidas para comprobar si hay problemas comunes de configuración. Checkov también soporta la creación y la contribución de políticas personalizadas.
- Crear reglas para CFN-Guard
Para usar CFN-Guard es necesario crear un archivo con las reglas de CFN-Guard. Para más información sobre la creación de este archivo consulta la siguiente documentación. También el siguiente repositorio puede ser de utilidad para crear el archivo de reglas.
Ejecuta el siguiente comandos para crear un nuevo archivo de reglas:
touch rules.guard
Pega el siguiente código en el archivo rules.guard que acabas de crear:
let sns_encrypted_kms = Resources.*[ Type == "AWS::SNS::Topic"
Metadata.guard.SuppressedRules not exists or
Metadata.guard.SuppressedRules.* != "SNS_ENCRYPTED_KMS"
]
rule SNS_ENCRYPTED_KMS when %sns_encrypted_kms !empty {
%sns_encrypted_kms.Properties.KmsMasterKeyId exists
}
En el ejemplo de arriba solo he agregado una regla de CFN-Guard que asegura que todos los topics de SNS que se creen en CDK estén encriptados usando AWS Key Management Service. Sin embargo, tú puedes agregar las que necesites para satisfacer las reglas de seguridad de tu organización.
Ejecuta el siguiente comando para validar nuestras plantillas de CloudFormation con las reglas que acabamos de crear:
cfn-guard validate \
--rules rules.guard \
--show-summary fail --data cdk.out/*.template.json
El resultado de ejecutar el comando es una validación fallida debido a que el topic de SNS no está encriptado:
- Corregir validaciones fallidas
Para corregir las validaciones fallidas de Checkov como CFN-Guard es necesario corregir nuestro código en nuestro archivo de cdk_test-stack.ts.
Reemplaza el contenido de lib/cdk_test-stack.ts por lo siguiente:
import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";
import * as sns from "aws-cdk-lib/aws-sns";
export class CdkTestStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const topic = new sns.Topic(this, "Topic", {
displayName: "My topic",
masterKey: new cdk.aws_kms.Key(this, "Key", {
enableKeyRotation: true,
}),
});
}
}
Hemos agregado una propiedad más a nuestro topic de SNS para poder pasar las validaciones de Checkov y CFN-Guard. Le agregamos una llave de encriptación de AWS KMS con rotación administrada por CDK. Para más información sobre esta propiedad consulte la documentación del CDK para crear un topic de SNS.
Ejecuta el siguiente comando para sintetizar nuestros cambios a AWS CloudFormation:
npx cdk synth -q
Ejecuta el siguiente comando para validar nuestra plantilla con Checkov:
checkov --framework cloudformation --quiet -f cdk.out/*.template.json
El resultado va a ser diferente en esta ocasión, ya que las validaciones van a pasar:
Ejecuta el siguiente comando para validar nuestra plantilla con CFN-Guard:
cfn-guard validate \
--rules rules.guard \
--show-summary fail --data cdk.out/*.template.json
y el resultado:
- Suprimir errores
En algunos casos es necesario suprimir algunos errores que no son relevantes a nuestro caso de uso. Por ejemplo, si quisiéramos suprimir los siguientes errores de Checkov y CFN-Guard:
// Checkov
Check: CKV_AWS_26: "Ensure all data stored in the SNS topic is encrypted"
FAILED for resource: AWS::SNS::Topic.TopicBFC7AF6E
File: /cdk.out/CdkTestStack.template.json:3-11
Guide: https://docs.paloaltonetworks.com/content/techdocs/en_US/prisma/prisma-cloud/prisma-cloud-code-security-policy-reference/aws-policies/aws-general-policies/general-15.html
3 | "TopicBFC7AF6E": {
4 | "Type": "AWS::SNS::Topic",
5 | "Properties": {
6 | "DisplayName": "My topic"
7 | },
8 | "Metadata": {
9 | "aws:cdk:path": "CdkTestStack/Topic/Resource"
10 | }
11 | },
// CFN-Guard
Resource = TopicBFC7AF6E {
Type = AWS::SNS::Topic
CDK-Path = CdkTestStack/Topic/Resource
Rule = SNS_ENCRYPTED_KMS {
ALL {
Check = %sns_encrypted_kms[*].Properties.KmsMasterKeyId EXISTS {
RequiredPropertyError {
PropertyPath = /Resources/TopicBFC7AF6E/Properties[L:4,C:17]
MissingProperty = KmsMasterKeyId
Reason = Could not find key KmsMasterKeyId inside struct at path /Resources/TopicBFC7AF6E/Properties[L:4,C:17]
Code:
2. "Resources": {
3. "TopicBFC7AF6E": {
4. "Type": "AWS::SNS::Topic",
5. "Properties": {
6. "DisplayName": "My topic"
7. },
}
}
}
}
}
Tendríamos que agregar el siguiente código en nuestro archivo de cdk_test-stack.ts :
import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";
import * as sns from "aws-cdk-lib/aws-sns";
export class CdkTestStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const topic = new sns.Topic(this, "Topic", {
displayName: "My topic",
});
// Suprimir Errores de Checkov y Cfn-Guard
const cfnTopic = topic.node.defaultChild as sns.CfnTopic;
cfnTopic.cfnOptions.metadata = {
guard: {
SuppressedRules: [
"SNS_ENCRYPTED_KMS"
]
},
checkov: {
skip: [
{ "id": "CKV_AWS_26" }
]
}
};
}
}
Conclusión
La combinación de Checkov y CFN-Guard ofrece una verificación robusta de tus aplicaciones de AWS CDK. Esta integración garantiza no sólo la seguridad, sino también el cumplimiento de las políticas y las mejores prácticas de tu organización. Al adoptar estas herramientas, puedes asegurarte de que tus despliegues en AWS sean más seguros y eficientes.
Acerca del Autor
Manuel Quijano es un Arquitecto de Soluciones en AWS especializado en Infraestructura como Código (IaC), DevOps y Developer Experience. Manuel trabaja con clientes de AWS para proporcionar orientación y asistencia técnica en prácticas de DevOps, IaC y mejores prácticas de desarrollo.
|
|
Revisores Técnicos
José Antonio Gómez es Arquitecto de Soluciones en AWS y trabaja con empresas de software como servicio. Se especializa en infraestructura como código y servicios de desarrollo de AWS.
|
|
Servio Tulio Reyes Castillo es arquitecto de soluciones en AWS México. Le interesan las ciencias de la computación y las tecnologías aeroespaciales.
|