Cree reglas AWS Config personalizadas mediante AWS CloudFormation Guard políticas - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Cree reglas AWS Config personalizadas mediante AWS CloudFormation Guard políticas

Creado por Andrew Lok (AWS), Kailash Havildar (AWS), Nicole Brown (AWS) y Tanya Howell (AWS)

aws-config-custom-ruleRepositorio de código: -cloudformation-guard

Entorno: PoC o piloto

Tecnologías: seguridad, identidad, conformidad; administración y gobernanza

Servicios de AWS: AWS CloudFormation; AWS Config

Resumen

AWS Configlas reglas le ayudan a evaluar sus AWS recursos y su estado de configuración objetivo. Hay dos tipos de AWS Config reglas: administradas y personalizadas. Puede crear reglas personalizadas con AWS Lambda funciones o con AWS CloudFormation Guard(GitHub), un policy-as-code idioma.

Las reglas creadas con Guard proporcionan un control más detallado que las reglas administradas y, por lo general, son más fáciles de configurar que las reglas Lambda totalmente personalizadas. Este enfoque proporciona a los ingenieros y arquitectos la capacidad de crear reglas sin necesidad de conocer Python, Nodejs o Java, que son necesarios para implementar reglas personalizadas a través de Lambda.

Este patrón proporciona plantillas, ejemplos de código y enfoques de implementación viables que le ayudarán a adoptar reglas personalizadas con Guard. Al usar este patrón, un administrador puede usarlo AWS Config para crear reglas de cumplimiento personalizadas que tengan atributos de elementos de configuración. Por ejemplo, los desarrolladores pueden utilizar las políticas de Guard en relación con los elementos de AWS Config configuración para supervisar de forma continua el estado de los elementos desplegados AWS y no relacionados con AWS los recursos, detectar infracciones de las reglas e iniciar automáticamente las correcciones.

Objetivos

Después de leer este patrón, debería poder:

Requisitos previos y limitaciones

Requisitos previos 

  • Una activa Cuenta de AWS

  • AWS Config, configurado en su Cuenta de AWS

Limitaciones

  • Las reglas personalizadas de Guard solo pueden consultar pares clave-valor en un registro JSON de un elemento de configuración de destino

Arquitectura

La sintaxis de Guard se aplica a una AWS Config regla como política personalizada. AWS Config captura el JSON jerárquico de cada uno de los recursos especificados. El JSON del elemento de AWS Config configuración contiene pares clave-valor. Estos atributos se utilizan en la sintaxis de Guard como variables que se asignan a su valor correspondiente. 

A continuación se explica la sintaxis de Guard. Las variables del elemento de configuración JSON se utilizan y se anteponen con un % carácter.

# declare variable let <variable name> = <'value'> # create rule and assign condition and policy rule <rule name> when <CI json key> == <"CI json value"> { <top level CI json key>.<next level CI json key> == %<variable name> }

Escenario 1: volúmenes de Amazon EBS

El escenario 1 implementa una regla AWS Config personalizada que usa la sintaxis de Guard para validar el cumplimiento de los volúmenes cifrados. Esta regla verifica que la unidad esté en uso y que el tipo de unidad sea gp3.

El siguiente es un ejemplo de un elemento de AWS Config configuración para el escenario 1. Hay tres pares clave-valor en este elemento de configuración que se utilizan como variables en la política de Guard: volumestatusvolumeencryptionstatus, y. volumetype Además, la resourceType clave se usa como filtro en la política de Guard.

{ "version": "1.3", "accountId": "111111111111", "configurationItemCaptureTime": "2023-01-15T19:04:45.402Z", "configurationItemStatus": "ResourceDiscovered", "configurationStateId": "4444444444444", "configurationItemMD5Hash": "", "arn": "arn:aws:ec2:us-west-2:111111111111:volume/vol-222222222222", "resourceType": "AWS::EC2::Volume", "resourceId": "vol-222222222222", "awsRegion": "us-west-2", "availabilityZone": "us-west-2b", "resourceCreationTime": "2023-01-15T19:03:22.247Z", "tags": {}, "relatedEvents": [], "relationships": [ { "resourceType": "AWS::EC2::Instance", "resourceId": "i-33333333333333333", "relationshipName": "Is attached to Instance" } ], "configuration": { "attachments": [ { "attachTime": "2023-01-15T19:03:22.000Z", "device": "/dev/xvda", "instanceId": "i-33333333333333333", "state": "attached", "volumeId": "vol-222222222222", "deleteOnTermination": true, "associatedResource": null, "instanceOwningService": null } ], "availabilityZone": "us-west-2b", "createTime": "2023-01-15T19:03:22.247Z", "encrypted": false, "kmsKeyId": null, "outpostArn": null, "size": 8, "snapshotId": "snap-55555555555555555", "state": "in-use", "volumeId": "vol-222222222222", "iops": 100, "tags": [], "volumeType": "gp2", "fastRestored": null, "multiAttachEnabled": false, "throughput": null, "sseType": null }, "supplementaryConfiguration": {} }

El siguiente es un ejemplo del uso de la sintaxis de Guard para definir las variables y las reglas en el escenario 1. En el siguiente ejemplo:

  • Las tres primeras líneas definen las variables mediante el let comando.  Se les asigna un nombre y un valor que se derivan de los atributos del elemento de configuración.

  • El bloque de compliancecheck reglas agrega una dependencia condicional de cuándo que busca un par resourceType clave-valor que coincida. AWS::EC2::Volume Si se encuentra una coincidencia, la regla pasa por el resto de los atributos de JSON y busca coincidencias en las tres condiciones siguientes: stateencrypted, y. volumeType

let volumestatus = 'available' let volumetype = 'gp3' let volumeencryptionstatus = true rule compliancecheck when resourceType == "AWS::EC2::Volume" { configuration.state == %volumestatus configuration.encrypted == %volumeencryptionstatus configuration.volumeType == %volumetype }

Para ver la política personalizada completa de Guard que implementa esta regla personalizada, consulta awsconfig-guard-cft.yaml o awsconfig-guard-tf-ec2vol.json en el repositorio de código. GitHub Para ver el código de HashiCorp Terraform que implementa esta política personalizada en Guard, consulta .json en el repositorio de código. awsconfig-guard-tf-example

Escenario 2: cumplimiento GuardDuty

El escenario 2 implementa una regla AWS Config personalizada que usa la sintaxis de Guard para validar el GuardDuty cumplimiento de Amazon. Esta regla verifica que las GuardDuty grabadoras tengan habilitadas las protecciones Amazon S3 y Amazon EKS. También verifica que los GuardDuty resultados se publiquen cada 15 minutos. Este escenario podría implementarse en todos Cuentas de AWS y Regiones de AWS en una organización (en AWS Organizations).

El siguiente es un ejemplo de un elemento de AWS Config configuración para el escenario 2. Hay tres pares clave-valor en este elemento de configuración que se utilizan como variables en la política de Guard: FindingPublishingFrequencyS3Logs, y. Kubernetes Además, la resourceType clave se usa como filtro en la política.

{ "version": "1.3", "accountId": "111111111111", "configurationItemCaptureTime": "2023-11-27T13:34:28.888Z", "configurationItemStatus": "OK", "configurationStateId": "7777777777777", "configurationItemMD5Hash": "", "arn": "arn:aws:guardduty:us-west-2:111111111111:detector/66666666666666666666666666666666", "resourceType": "AWS::GuardDuty::Detector", "resourceId": "66666666666666666666666666666666", "resourceName": "66666666666666666666666666666666", "awsRegion": "us-west-2", "availabilityZone": "Regional", "resourceCreationTime": "2020-02-17T02:48:04.511Z", "tags": {}, "relatedEvents": [], "relationships": [], "configuration": { "Enable": true, "FindingPublishingFrequency": "FIFTEEN_MINUTES", "DataSources": { "S3Logs": { "Enable": true }, "Kubernetes": { "AuditLogs": { "Enable": true } } }, "Id": "66666666666666666666666666666666", "Tags": [] }, "supplementaryConfiguration": { "CreatedAt": "2020-02-17T02:48:04.511Z" } }

El siguiente es un ejemplo del uso de la sintaxis de Guard para definir las variables y las reglas en el escenario 2. En el siguiente ejemplo:

  • Las tres primeras líneas definen las variables mediante el let comando.  Se les asigna un nombre y un valor que se derivan de los atributos del elemento de configuración.

  • El bloque de compliancecheck reglas agrega una dependencia condicional de cuándo que busca un par resourceType clave-valor que coincida. AWS::GuardDuty::Detector Si se encuentra una coincidencia, la regla pasa por el resto de los atributos de JSON y busca coincidencias en las tres condiciones siguientes: S3Logs.EnableKubernetes.AuditLogs.Enable, y. FindingPublishingFrequency

let s3protection = true let kubernetesprotection = true let publishfrequency = 'FIFTEEN_MINUTES' rule compliancecheck when resourceType == "AWS::GuardDuty::Detector" { configuration.DataSources.S3Logs.Enable == %s3protection configuration.DataSources.Kubernetes.AuditLogs.Enable == %kubernetesprotection configuration.FindingPublishingFrequency == %publishfrequency }

Para ver la política personalizada completa de Guard que implementa esta regla personalizada, consulta awsconfig-guard-cft-gd.yaml en el repositorio de GitHub código. Para ver el código de HashiCorp Terraform que implementa esta política personalizada en Guard, consulta awsconfig-guard-tf-gd.json en el repositorio de código.

Herramientas

Servicios de AWS

  • AWS CloudFormationle ayuda a configurar AWS los recursos, aprovisionarlos de forma rápida y coherente y gestionarlos a lo largo de su ciclo de vida en Cuentas de AWS todas las regiones.

  • AWS Configproporciona una vista detallada de sus recursos Cuenta de AWS y de cómo están configurados. Le ayuda a identificar cómo se relacionan los recursos entre sí y cómo han cambiado sus configuraciones a lo largo del tiempo.

Otras herramientas

  • HashiCorp Terraform es una herramienta de infraestructura como código (IaC) de código abierto que le ayuda a usar el código para aprovisionar y administrar la infraestructura y los recursos de la nube.

Repositorio de código

El código de este patrón está disponible en el repositorio GitHub AWS Config with AWS CloudFormation Guard. Este repositorio de código contiene ejemplos de los dos escenarios descritos en este patrón.

Epics

TareaDescripciónHabilidades requeridas

(Opcional) Seleccione pares clave-valor para la regla.

Complete estos pasos si va a definir una política de Guard personalizada. Si utiliza uno de los ejemplos de políticas para el escenario 1 o 2, omita estos pasos.

  1. Inicie sesión en la AWS Config consola AWS Management Console y ábrala.

  2. En el panel de navegación de la izquierda, selecciona Recursos.

  3. En el inventario de recursos, elige el tipo de recurso para el que quieres crear una regla AWS Config personalizada.

  4. Elija Ver detalles.

  5. Seleccione Ver elemento de configuración (JSON). Esta sección se amplía para mostrar el elemento de configuración en formato JSON.

  6. Identifique los pares clave-valor para los que desea crear una regla AWS Config personalizada.

Administrador de AWS, ingeniero de seguridad

Cree la regla personalizada.

Utilice los pares clave-valor que identificó anteriormente o uno de los ejemplos de políticas de Guard proporcionados, siga las instrucciones de Creación de reglas de política AWS Config personalizadas para crear una regla personalizada.

Administrador de AWS, ingeniero de seguridad

Valide la regla personalizada.

Realice una de las siguientes acciones para validar la regla de protección personalizada:

  • Introduzca el siguiente comando en AWS Command Line Interface (AWS CLI).

    cfn-guard validate -r guard-s3.guard -d s3bucket-prod-pass.json
  • Siga las instrucciones del modo Detective en Evaluación de sus recursos con AWS Config reglas para implementar la regla AWS Config. Confirme que la sintaxis de Guard coincide correctamente con los recursos correspondientes de la cuenta o el archivo de destino.

Administrador de AWS, ingeniero de seguridad

Resolución de problemas

ProblemaSolución

Pruebe la política de Guard fuera de AWS Config

Las pruebas unitarias se pueden realizar en su dispositivo local o en un entorno de desarrollo integrado (IDE), como un AWS Cloud9 IDE. Para realizar pruebas unitarias, haga lo siguiente:

  1. Instale la AWS CloudFormation Guard CLI y sus dependencias.

  2. Guarde un ejemplo de CI con formato JSON en su estación de trabajo como un archivo.json.

  3. Guarde la GuardDuty política en su estación de trabajo como un archivo.guard.

  4. En la CLI de Guard, introduzca el siguiente comando para validar el archivo JSON de muestra mediante la política de Guard.

    cfn-guard validate \ -r guard-s3.guard \ -d s3bucket-prod-pass.json

Depura una regla AWS Config personalizada

En tu política de Guard, cambia el EnableDebugLogDelivery valor atrue. El valor predeterminado es false. Los mensajes de registro se almacenan en Amazon CloudWatch.

Recursos relacionados

AWS documentación

AWS publicaciones de blog y talleres

Otros recursos