View a markdown version of this page

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

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

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, normalmente, são mais fáceis de configurar se comparadas às regras totalmente personalizadas com o Lambda. Com essa abordagem, engenheiros e arquitetos podem desenvolver regras sem a necessidade de dominar Python, NodeJS ou Java, que são linguagens requeridas para implantar regras personalizadas pelo Lambda.

Esse padrão fornece modelos funcionais, amostras de código e abordagens de implantação para auxiliar na adoção das 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

Após ler este padrão, você deverá ser capaz de:

  • Entenda como o código de política do Guard interage com o AWS Config serviço.

  • Implante o Cenário 1, que é uma regra AWS Config personalizada que usa a sintaxe do Guard para validar a conformidade de volumes criptografados. Essa regra verifica se o drive está em uso e se o tipo do drive é gp3.

  • Implante o Cenário 2, que é 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 Simple Storage Service (Amazon S3) e a Proteção Amazon Elastic Kubernetes Service (Amazon EKS) ativadas.

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 conseguem consultar somente pares de chave-valor em um registro JSON de 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 aos seus valores correspondentes. 

A seguir, apresentamos uma explicação da sintaxe do Guard. As variáveis do JSON do item de configuração são usadas e precedidas por 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 o drive está em uso e se o tipo do drive é 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 chave resourceType é empregada 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": {} }

A seguir, apresentamos um exemplo de como usar a sintaxe do Guard para definir variáveis e regras no Cenário 1. No seguinte exemplo:

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

  • O bloco de regra compliancecheck adiciona uma dependência condicional “when” que busca um par de chave-valor resourceType correspondente a AWS::EC2::Volume. Se uma correspondência for encontrada, a regra continua analisando o restante dos atributos do JSON e procura por correspondências nas três seguintes condições: state, encrypted 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. Existem três pares de chave-valor nesse item de configuração que são usados como variáveis na política do Guard: FindingPublishingFrequency, S3Logs e Kubernetes. Além disso, a chave resourceType é empregada 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" } }

A seguir, apresentamos um exemplo de como usar a sintaxe do Guard para definir variáveis e regras no Cenário 2. No seguinte exemplo:

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

  • O bloco de regra compliancecheck adiciona uma dependência condicional “when” que busca um par de chave-valor resourceType correspondente a AWS::GuardDuty::Detector. Se uma correspondência for encontrada, a regra continua analisando o restante dos atributos do JSON e procura por correspondências nas três seguintes condições: S3Logs.Enable, Kubernetes.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

  • O HashiCorp Terraform é uma ferramenta de infraestrutura como código (IaC) que ajuda a provisionar e gerenciar recursos e infraestrutura de nuvem por meio de código.

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 ambos os cenários descritos neste padrão.

Épicos

TarefaDescriptionHabilidades necessárias

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

Conclua estas etapas se estiver definindo uma política personalizada do Guard. Se estiver usando uma das políticas de amostra disponibilizadas para o Cenário 1 ou 2, pule estas etapas.

  1. Faça login no Console de gerenciamento da AWS 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 Visualizar item de configuração (JSON). Essa seção se expande para apresentar 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 e 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 e engenheiro de segurança

Valide a regra personalizada.

Realize uma das seguintes ações 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 que a sintaxe do Guard corresponde corretamente aos recursos correspondentes na conta ou no arquivo de destino.

Administrador da AWS e 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 de unidade, execute as seguintes etapas:

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

  2. Salve uma amostra de item de configuração (CI) em formato JSON na 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, digite o comando apresentado 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

Na sua política do Guard, altere o valor de EnableDebugLogDelivery para true. 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