Crie regras AWS Config personalizadas usando AWS CloudFormation Guard políticas - Recomendações da AWS

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Crie regras AWS Config personalizadas usando AWS CloudFormation Guard políticas

Criado por Andrew Lok (AWS), Kailash Havildar (AWS), Nicole Brown (AWS) e Tanya Howell (AWS)

Repositório de código: aws-config-custom-rule -cloudformation-guard

Ambiente: PoC ou piloto

Tecnologias: segurança, identidade, conformidade; gerenciamento e governança

Serviços da AWS: AWS CloudFormation; AWS Config

Resumo

AWS Configas regras ajudam você a avaliar seus AWS recursos e o estado de configuração de destino. Há dois tipos de AWS Config regras: gerenciadas e personalizadas. Você pode criar regras personalizadas com AWS Lambda funções ou com AWS CloudFormation Guard(GitHub), uma policy-as-code linguagem.

As regras criadas com o Guard fornecem um controle mais granular do que as regras gerenciadas e geralmente são mais fáceis de configurar do que as regras Lambda totalmente personalizadas. Essa abordagem fornece aos engenheiros e arquitetos a capacidade de criar regras sem precisar conhecer Python, NodeJS ou Java, que são necessários para implantar regras personalizadas por meio do Lambda.

Esse padrão fornece modelos viáveis, exemplos de código e abordagens de implantação para ajudá-lo a adotar regras personalizadas com o Guard. Ao usar esse padrão, um administrador pode usar AWS Config para criar regras de conformidade personalizadas que tenham atributos de item de configuração. Por exemplo, os desenvolvedores podem usar as políticas do Guard em relação aos itens de AWS Config configuração para monitorar continuamente o estado dos recursos implantados AWS e dos não AWS recursos, detectar violações de regras e iniciar automaticamente a remediação.

Objetivos

Depois de ler esse padrão, você deve ser capaz de:

Pré-requisitos e limitações

Pré-requisitos

  • Um ativo Conta da AWS

  • AWS Config, configurado em seu Conta da AWS

Limitações

  • As regras personalizadas do Guard só podem consultar pares de valores-chave em um registro JSON do item de configuração de destino

Arquitetura

Você aplica a sintaxe do Guard a uma AWS Config regra como uma política personalizada. AWS Config captura o JSON hierárquico de cada um dos recursos especificados. O JSON do item de AWS Config configuração contém pares de valores-chave. Esses atributos são usados na sintaxe do Guard como variáveis atribuídas ao valor correspondente. 

A seguir está uma explicação da sintaxe do Guard. As variáveis do item de configuração JSON são usadas e prefixadas com um caractere. %

# 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> }

Cenário 1: volumes do Amazon EBS

O cenário 1 implanta uma regra AWS Config personalizada que usa a sintaxe do Guard para validar a conformidade de volumes criptografados. Essa regra verifica se a unidade está em uso e se o tipo de unidade é gp3.

Veja a seguir um exemplo de um item de AWS Config configuração para o cenário 1. Há três pares de valores-chave nesse item de configuração que são usados como variáveis na política do Guard: volumestatusvolumeencryptionstatus, e. volumetype Além disso, a resourceType chave é usada como filtro na política do 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": {} }

Veja a seguir um exemplo do uso da sintaxe do Guard para definir as variáveis e regras no cenário 1. No seguinte exemplo:

  • As três primeiras linhas definem as variáveis usando o let comando.  Eles recebem um nome e um valor derivados dos atributos do item de configuração.

  • O bloco de compliancecheck regras adiciona uma dependência condicional quando que procura um par de resourceType valores-chave que corresponda. AWS::EC2::Volume Se uma correspondência for encontrada, a regra prosseguirá com o restante dos atributos JSON e procurará correspondências nas três condições a seguir: stateencrypted, e. 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 a política personalizada completa do Guard que implementa essa regra personalizada, consulte awsconfig-guard-cft.yaml ou awsconfig-guard-tf-ec2vol.json no repositório de código. GitHub Para o código do HashiCorp Terraform que implanta essa política personalizada no Guard, consulte awsconfig-guard-tf-example.json no repositório de código.

Cenário 2: GuardDuty conformidade

O cenário 2 implanta uma regra AWS Config personalizada que usa a sintaxe do Guard para validar a conformidade da Amazon GuardDuty . Essa regra verifica se GuardDuty os gravadores têm a Proteção Amazon S3 e a Proteção Amazon EKS ativadas. Também verifica se as GuardDuty descobertas são publicadas a cada 15 minutos. Esse cenário pode ser implantado em toda Contas da AWS e Regiões da AWS em uma organização (em AWS Organizations).

Veja a seguir um exemplo de um item de AWS Config configuração para o cenário 2. Há três pares de valores-chave nesse item de configuração que são usados como variáveis na política do Guard: FindingPublishingFrequencyS3Logs, e. Kubernetes Além disso, a resourceType chave é usada como filtro na 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" } }

Veja a seguir um exemplo do uso da sintaxe do Guard para definir as variáveis e regras no cenário 2. No seguinte exemplo:

  • As três primeiras linhas definem as variáveis usando o let comando.  Eles recebem um nome e um valor derivados dos atributos do item de configuração.

  • O bloco de compliancecheck regras adiciona uma dependência condicional quando que procura um par de resourceType valores-chave que corresponda. AWS::GuardDuty::Detector Se uma correspondência for encontrada, a regra prosseguirá com o restante dos atributos JSON e procurará correspondências nas três condições a seguir: S3Logs.EnableKubernetes.AuditLogs.Enable, e. 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 a política personalizada completa do Guard que implementa essa regra personalizada, consulte awsconfig-guard-cft-gd.yaml no repositório de código. GitHub Para o código do HashiCorp Terraform que implanta essa política personalizada no Guard, consulte awsconfig-guard-tf-gd.json no repositório de código.

Ferramentas

Serviços da AWS

  • AWS CloudFormationajuda você a configurar AWS recursos, provisioná-los de forma rápida e consistente e gerenciá-los em todo o ciclo de vida em todas Contas da AWS as regiões.

  • AWS Configfornece uma visão detalhada dos recursos em seu computador Conta da AWS e de como eles estão configurados. Ajuda a identificar como os recursos estão relacionados entre si e como suas configurações foram alteradas ao longo do tempo.

Outras ferramentas

  • HashiCorp O Terraform é uma ferramenta de infraestrutura de código aberto como código (IaC) que ajuda você a usar o código para provisionar e gerenciar a infraestrutura e os recursos da nuvem.

Repositório de código

O código desse padrão está disponível no AWS CloudFormation Guard repositório GitHub AWS Config with. Esse repositório de código contém amostras para os dois cenários descritos nesse padrão.

Épicos

TarefaDescriçãoHabilidades necessárias

(Opcional) Selecione pares de valores-chave para a regra.

Conclua estas etapas se você estiver definindo uma política personalizada do Guard. Se você estiver usando um dos exemplos de políticas para o cenário 1 ou 2, pule essas etapas.

  1. Faça login no AWS Management Console e abra o AWS Config console.

  2. No painel de navegação à esquerda, escolha Recursos.

  3. No inventário de recursos, escolha o tipo de recurso para o qual você deseja criar uma regra AWS Config personalizada.

  4. Escolha Exibir detalhes.

  5. Escolha Exibir item de configuração (JSON). Esta seção se expande para mostrar o item de configuração no formato JSON.

  6. Identifique os pares de valores-chave para os quais você gostaria de criar uma regra AWS Config personalizada.

Administrador da AWS, engenheiro de segurança

Crie a regra personalizada.

Usando os pares de valores-chave que você identificou anteriormente ou usando um dos exemplos de políticas do Guard fornecidos, siga as instruções em Criação de regras de política AWS Config personalizadas para criar uma regra personalizada.

Administrador da AWS, engenheiro de segurança

Valide a regra personalizada.

Siga um destes procedimentos para validar a regra personalizada do Guard:

  • Digite o seguinte comando no AWS Command Line Interface (AWS CLI).

    cfn-guard validate -r guard-s3.guard -d s3bucket-prod-pass.json
  • Siga as instruções no modo Detective em Avaliando seus recursos com AWS Config regras para implantar a regra em. AWS Config Confirme se a sintaxe do Guard corresponde corretamente aos recursos correspondentes na conta ou arquivo de destino.

Administrador da AWS, engenheiro de segurança

Solução de problemas

ProblemaSolução

Teste a política do Guard fora do AWS Config

O teste unitário pode ser feito em seu dispositivo local ou em um ambiente de desenvolvimento integrado (IDE), como um AWS Cloud9 IDE. Para realizar o teste unitário, faça o seguinte:

  1. Instale a AWS CloudFormation Guard CLI e suas dependências.

  2. Salve uma amostra de CI formatada em JSON em sua estação de trabalho como um arquivo.json.

  3. Salve a GuardDuty política em sua estação de trabalho como um arquivo.guard.

  4. Na CLI do Guard, insira o comando a seguir para validar o arquivo JSON de amostra usando a política do Guard.

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

Depurar uma regra AWS Config personalizada

Em sua política do Guard, altere o EnableDebugLogDelivery valor paratrue. O valor padrão é false. As mensagens de log são armazenadas na Amazon CloudWatch.

Recursos relacionados

AWS documentação

AWS postagens de blog e workshops

Outros recursos