View a markdown version of this page

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

Andrew Lok, Nicole Brown, Kailash Havildar y Tanya Howell, Amazon Web Services

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 de 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 las plantillas, los ejemplos de código y los enfoques de implementación viables para ayudarle 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:

  • Comprenda cómo el código de política de Guard interactúa con el AWS Config servicio.

  • Implemente el escenario 1, que es una regla AWS Config personalizada que utiliza 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.

  • Implemente el escenario 2, que es una regla AWS Config personalizada que utiliza la sintaxis de Guard para validar el GuardDuty cumplimiento de Amazon. Esta regla verifica que las GuardDuty grabadoras tengan habilitadas las protecciones Amazon Simple Storage Service (Amazon S3) y Amazon Elastic Kubernetes Service (Amazon EKS).

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 una 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. 

La siguiente es una explicación de 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 clave resourceType 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 comando let.  Se les asigna un nombre y un valor que se derivan de los atributos del elemento de configuración.

  • El bloque de reglas compliancecheck añade una dependencia condicional “when” que busca un par de clave-valor resourceType que coincida con 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: state, encrypted 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: FindingPublishingFrequency, S3Logs y Kubernetes. Además, la clave resourceType 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 comando let.  Se les asigna un nombre y un valor que se derivan de los atributos del elemento de configuración.

  • El bloque de reglas compliancecheck añade una dependencia condicional “when” que busca un par de clave-valor resourceType que coincida con 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.Enable, Kubernetes.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.

Tools (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) que facilita usar el código para aprovisionar y administrar los recursos y la infraestructura en la nube.

Repositorio de código

El código de este patrón está disponible en el AWS CloudFormation Guard repositorio GitHub AWS Config with. 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 una de las políticas de ejemplo para el escenario 1 o 2, omita estos pasos.

  1. Inicie sesión en la AWS Config consola Consola de administración de AWS y ábrala.

  2. En la página de navegación izquierda, seleccione 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íticas AWS Config personalizadas para crear una regla personalizada.

Administrador de AWS, ingeniero de seguridad

Valide la regla personalizada.

Tome alguna de las siguientes medidas para validar la regla personalizada de Guard:

  • 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

Pon a prueba la política de guardia 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 las pruebas unitarias, haga lo siguiente:

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

  2. Guarde un ejemplo de CI con formato JSON en su estación de trabajo como 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 personalizada AWS Config

En su política de Guard, cambia el valor de EnableDebugLogDelivery a true. 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