

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
<a name="create-aws-config-custom-rules-by-using-aws-cloudformation-guard-policies"></a>

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

## Resumen
<a name="create-aws-config-custom-rules-by-using-aws-cloudformation-guard-policies-summary"></a>

[AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/WhatIsConfig.html)las 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](https://github.com/aws-cloudformation/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](https://docs.aws.amazon.com/config/latest/developerguide/config-concepts.html#config-items). 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](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/general-purpose.html#gp3-ebs-volume-type).
+ 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)](https://docs.aws.amazon.com/guardduty/latest/ug/s3-protection.html) y Amazon [Elastic Kubernetes Service (Amazon](https://docs.aws.amazon.com/guardduty/latest/ug/kubernetes-protection.html) EKS).

## Requisitos previos y limitaciones
<a name="create-aws-config-custom-rules-by-using-aws-cloudformation-guard-policies-prereqs"></a>

**Requisitos previos **
+ Una activa Cuenta de AWS
+ AWS Config, [configurado](https://docs.aws.amazon.com/config/latest/developerguide/getting-started.html) 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
<a name="create-aws-config-custom-rules-by-using-aws-cloudformation-guard-policies-architecture"></a>

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: `volumestatus``volumeencryptionstatus`, 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](https://github.com/aws-samples/aws-config-custom-rule-cloudformation-guard/blob/main/awsconfig-guard-tf-ec2vol.json)](https://github.com/aws-samples/aws-config-custom-rule-cloudformation-guard/blob/main/awsconfig-guard-cft.yaml) 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](https://github.com/aws-samples/aws-config-custom-rule-cloudformation-guard/blob/main/awsconfig-guard-tf-example.json)

**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](https://github.com/aws-samples/aws-config-custom-rule-cloudformation-guard/blob/main/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](https://github.com/aws-samples/aws-config-custom-rule-cloudformation-guard/blob/main/awsconfig-guard-tf-gd.json) en el repositorio de código.

## Tools (Herramientas)
<a name="create-aws-config-custom-rules-by-using-aws-cloudformation-guard-policies-tools"></a>

**Servicios de AWS**
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)le 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 Config](https://docs.aws.amazon.com/config/latest/developerguide/WhatIsConfig.html)proporciona 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](https://www.terraform.io/docs) 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](https://github.com/aws-samples/aws-config-custom-rule-cloudformation-guard/tree/main). Este repositorio de código contiene ejemplos de los dos escenarios descritos en este patrón.

## Epics
<a name="create-aws-config-custom-rules-by-using-aws-cloudformation-guard-policies-epics"></a>

### Crear reglas AWS Config personalizadas
<a name="creating-cc-custom-rules"></a>


| Tarea | Descripción | Habilidades 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.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/create-aws-config-custom-rules-by-using-aws-cloudformation-guard-policies.html) | 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](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_develop-rules_cfn-guard.html#create-cfn-guard-rule-console) 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:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/create-aws-config-custom-rules-by-using-aws-cloudformation-guard-policies.html) | Administrador de AWS, ingeniero de seguridad | 

## Resolución de problemas
<a name="create-aws-config-custom-rules-by-using-aws-cloudformation-guard-policies-troubleshooting"></a>


| Problema | Solució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:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/create-aws-config-custom-rules-by-using-aws-cloudformation-guard-policies.html) | 
| 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
<a name="create-aws-config-custom-rules-by-using-aws-cloudformation-guard-policies-resources"></a>

**AWS documentación**
+ [Creación de reglas de políticas AWS Config personalizadas](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_develop-rules_cfn-guard.html) (AWS Config documentación)
+ [AWS CloudFormation Guard Reglas de redacción](https://docs.aws.amazon.com/cfn-guard/latest/ug/writing-rules.html) (documentación de Guard)

**AWS publicaciones de blog y talleres**
+ [Presentamos la AWS CloudFormation Guard versión 2.0](https://aws.amazon.com/blogs/mt/introducing-aws-cloudformation-guard-2-0/) (AWS entrada de blog)

**Otros recursos**
+ [AWS CloudFormation Guard](https://github.com/aws-cloudformation/cloudformation-guard) (GitHub)
+ [AWS CloudFormation Guard Documentación CLI](https://github.com/aws-cloudformation/cloudformation-guard#guard-cli) (GitHub)