Ampliando a cobertura dos recursos em nuvem para reduzir o drift da infraestrutura
Stephane Jourdan
23 de março de 2022
0 minutos de leituraAviso de descontinuação: detecção de drift em recursos gerenciados
A detecção de drift em recursos gerenciados, incluindo snyk iac describe --only-managed and snyk iac describe --drift, foi descontinuada. A detecção de drift em recursos gerenciados será encerrada em 30 de setembro de 2023.
Como desenvolvedores, precisamos ter visibilidade máxima do que está realmente em execução nos nossos ambientes de nuvem para mantê-los seguros. A infraestrutura como código (IaC) ajuda a automatizar as infraestruturas em nuvem, garantindo que o que é implantado na nuvem esteja sob controle e possa ser auditado com facilidade. Mas alcançar e manter 100% de cobertura de IaC na infraestrutura traz muitos desafios.
Nossa segurança depende do que está realmente implantado e em execução nos ambientes de nuvem. E, muitas vezes, nós, outras equipes ou alguns serviços autenticados ainda realizamos ações manuais com frequência. Essas alterações ficam ocultas para a IaC e para as auditorias, causando problemas como configurações incorretas e riscos de segurança. É aí que o gerenciamento de drift se torna importante: queremos relatórios dos recursos que ainda não estão sob controle da IaC ou que foram alterados por algum motivo.
Neste artigo, vamos mostrar como o Snyk IaC ajuda desenvolvedores a descobrir recursos em nuvem que não estão sob controle de infraestrutura como código (IaC) (recursos não gerenciados) ou que se desviaram do estado esperado (recursos gerenciados).
Configure o ambiente
O Snyk IaC lista os recursos encontrados como recursos do Terraform, para que você identifique facilmente qual parte do serviço de nuvem foi detectada. Por exemplo, um único serviço do Amazon API Gateway v2 é composto por pelo menos 12 recursos do Terraform. Com as informações de descoberta fornecidas pelo Snyk, você poderá decidir rapidamente se deve reverter a alteração, importar um novo recurso ou simplesmente excluir essa nova mudança.
Para acompanhar o passo a passo, você pode usar o arquivo Terraform abaixo para criar dois recursos da AWS que usaremos. Ele cria um usuário do IAM chamado "user1" com um sufixo aleatório, uma chave de acesso e uma política anexada com acesso somente leitura.
No momento da redação deste artigo, usamos o Terraform v1.1.7 com o provedor AWS v3.74.2
Reutilize a seguinte configuração HCL:
main.tf
Aplique essa configuração do Terraform:
Confirme se há um terraform.tfstate na raiz do diretório:
Confirme também se o usuário do IAM foi criado com sucesso na AWS.
Comece com o ambiente limpo
Vamos começar listando todos os recursos em nuvem que não estão sob controle do Terraform:
É provável que você encontre uma enorme lista de recursos que não estão sob controle do Terraform. São informações úteis, mas não muito práticas para o nosso caso. O Snyk IaC tem um recurso integrado para ignorar recursos em massa, adicionando todos os recursos encontrados ao arquivo de políticas .snyk.
Vamos ignorar todos esses recursos não gerenciados existentes, para trabalhar com mais precisão em um ambiente controlado, apenas com os dois recursos que criamos acima:
Faça outra varredura para confirmar que o ambiente está ignorando os drifts detectados (mais tarde, você terá tempo de sobra para programar a importação deles).
Agora podemos começar com o ambiente limpo.
Vamos criar drift no IAM!
Agora vamos criar três tipos de drift para simular situações reais:
Uma alteração no usuário do IAM existente (que vamos querer reverter)
A anexação manual de uma nova política do IAM (que vamos querer remover)
Um novo usuário do IAM (que vamos querer aprimorar)
Para isso, acesse o console da AWS para IAM.
Altere o usuário do IAM existente adicionando uma tag
Na página de usuários do IAM, clique em "user1"
Clique na guia Tags
Clique no botão Edit Tags
Adicione uma nova chave ("environment") e um novo valor ("production")
Clique em Salvar
Anexe uma política poderosa ao usuário do IAM existente
Na página de usuários do IAM, clique em "user1"
Clique na guia Permissions
Clique no botão Adicionar permissões
Clique em Attach existing policies directly
Selecione Administrator Access
Clique em Next: Review
Confirme clicando em Add permissions
Crie manualmente outro usuário do IAM
Na página de usuários do IAM, clique no botão Add Users
Digite "user2" no campo User name:
Selecione Access key
Clique no botão Next: Permissions
Não defina permissões nem tags
Clique em Create user (não precisamos das credenciais exibidas, então você pode descartá-las).
Agora estamos prontos para lidar com esses tipos de alterações manuais usando a detecção de drift do Snyk IaC.
Drift na infraestrutura gerenciada e não gerenciada
Agora vamos descobrir como o Snyk IaC detecta essas alterações, começando pelos recursos que não são gerenciados pelo Terraform.
Esta varredura relatou, usando a terminologia de recursos do Terraform:
O usuário do IAM "user2" criado manualmente, com sua chave de acesso do IAM
A política do IAM anexada manualmente ao usuário do IAM "user1", gerenciado pelo Terraform.
Agora vamos verificar apenas as alterações nos recursos gerenciados pelo Terraform encontrados nos diferentes estados do Terraform:
Esta varredura apresentou um resultado bem diferente e levou muito mais tempo (36 s contra 9 s no modo de varredura de recursos "não gerenciados").
Com esse resultado, sabemos que o usuário do IAM chamado "user1-84i30k", que encontramos no HCL como um recurso chamado "user1", tem uma tag chamada "environment" definida como "production".
Plano de ação
A ferramenta de detecção de drift do Snyk nos ajudou a descobrir quatro diferenças inesperadas entre o que esperávamos e a realidade. Para este artigo, vamos supor que a equipe decida o seguinte:
O usuário do IAM "user2" é usado em produção e deve ser importado para o Terraform.
A chave de acesso do IAM de "user2" deve ser rotacionada por motivos de segurança.
Em hipótese alguma "user1" deve ter permissões de administrador.
A nova tag de "user1" é necessária para atender a um requisito e deve ser importada para o Terraform.
O que | Tipo de recurso | Nome | Tipo de drift | Ação |
|---|---|---|---|---|
Um usuário do IAM |
|
| Não gerenciado | IMPORTAR |
Uma chave de acesso do IAM |
|
| Não gerenciado | ROTACIONAR |
Uma política do IAM anexada |
|
| Não gerenciado | EXCLUIR |
Uma tag em um usuário do IAM |
|
| Gerenciado | IMPORTAR |
Pipelines de implantação não são uma solução
Temos um ótimo pipeline de implantação do Terraform. Quando o terraform apply for executado novamente, podemos esperar que tudo volte ao normal.
Nesse caso, o que o Terraform fará? Um trabalho de implantação:
O Terraform nunca foi feito para descobrir recursos criados ou anexados manualmente e simplesmente reverterá os recursos modificados ao estado original (o que não queremos nesta situação).
O que | Tipo de recurso | Nome | Tipo de drift | Ação |
|---|---|---|---|---|
Um usuário do IAM |
|
| Não gerenciado | NENHUMA |
Uma chave de acesso do IAM |
|
| Não gerenciado | NENHUMA |
Uma política do IAM anexada |
|
| Não gerenciado | NENHUMA |
Uma tag em um usuário do IAM |
|
| Gerenciado | REVERTER |
Em nenhum dos casos recebemos a ajuda que esperamos:
O usuário do IAM criado manualmente e sua chave de acesso não são informados (pouco útil)
A política Administrator anexada manualmente a um usuário gerenciado não é informada (pouco útil)
A tag importante adicionada manualmente a um usuário gerenciado será revertida (prejudicial)
É necessária uma ferramenta diferente para esse tipo de detecção e trabalho.
Ampliando nossa cobertura
Começamos nossa jornada com 50% de cobertura dos recursos não gerenciados:
Vamos melhorar esse índice com base no plano da equipe.
Exclua a política do IAM de 'user1'
Vamos começar pelo mais urgente e fácil: remover a política "Administrator" do usuário do IAM gerenciado "user1":
Acesse IAM > Users > "user1"
Clique em Permissions > exclua "AdministratorAccess"
Agora cobrimos 60% dos nossos recursos da AWS, acima dos 50%.
O que | Tipo de recurso | Nome | Tipo de drift | Ação | Status |
|---|---|---|---|---|---|
Um usuário do IAM |
|
| Não gerenciado | IMPORTAR | |
Uma chave de acesso do IAM |
|
| Não gerenciado | ROTACIONAR | |
Uma política do IAM anexada |
|
| Não gerenciado | EXCLUIR | * |
Uma tag em um usuário do IAM |
|
| Gerenciado | ADICIONAR |
Vamos continuar.
Desbloqueie o pipeline de implantação do Terraform
O pipeline está bloqueado no momento por essa alteração manual nas tags de aws_iam_user.user1. Se houver uma implantação, as tags serão revertidas para o que está definido no HCL. Qual é a solução? Usar o resultado de drift do Snyk IaC para adaptar nossa configuração do Terraform.
Temos as seguintes informações:
Com esse resultado, sabemos que:
Estamos procurando um recurso
aws_iam_userchamado "user1"Esse recurso está em terraform.tfstate (muito útil quando você tem dezenas ou centenas de estados)
Há uma nova chave de tag chamada
environmentcom o valor "production".
Vamos atualizar o recurso de usuário do IAM simplesmente adicionando environment = "production", para que fique assim:
Agora podemos desbloquear o pipeline de implantação do Terraform com segurança:
Por enquanto, corrigimos nossos drifts "gerenciados":
O que | Tipo de recurso | Nome | Tipo de drift | Ação | Status |
|---|---|---|---|---|---|
Um usuário do IAM |
|
| Não gerenciado | IMPORTAR | |
Uma chave de acesso do IAM |
|
| Não gerenciado | ROTACIONAR | |
Uma política do IAM anexada |
|
| Não gerenciado | EXCLUIR | * |
Uma tag em um usuário do IAM |
|
| Gerenciado | ADICIONAR | * |
Importe e rotacione user2 do IAM
Agora vamos lidar com o caso de "user2". Queremos:
Importá-lo para o Terraform
Rotacionar a chave
Vamos começar importando o usuário do IAM para o Terraform. Veja uma maneira simples de fazer isso.
Comece coletando as informações do Snyk IaC:
Tipo de recurso | Nome |
|---|---|
|
|
Como importar um aws_iam_user resource? De acordo com a documentação oficial do Terraform, os usuários do IAM podem ser importados usando o nome, por exemplo: $ terraform import aws_iam_user.lb loadbalancer.
Também podemos ver que o único argumento obrigatório é name. Então vamos adicionar essa estrutura básica ao nosso arquivo HCL:
Agora vamos importar esse usuário para o Terraform:
Como nossa cobertura evoluiu? Vamos descobrir:
Agora temos 80% de cobertura (antes, 60%) e resta apenas um recurso.
O que | Tipo de recurso | Nome | Tipo de drift | Ação | Status |
|---|---|---|---|---|---|
Um usuário do IAM |
|
| Não gerenciado | IMPORTAR | * |
Uma chave de acesso do IAM |
|
| Não gerenciado | ROTACIONAR | |
Uma política do IAM anexada |
|
| Não gerenciado | EXCLUIR | * |
Uma tag em um usuário do IAM |
|
| Gerenciado | ADICIONAR | * |
Rotacione a chave
Vamos resolver isso agora. Queremos rotacionar a chave e adicioná-la ao Terraform. Primeiro, vamos adicionar a nova chave ao HCL para criar uma chave nova (que podemos fornecer à equipe relevante, por exemplo) e, por fim, simplesmente excluir a antiga da AWS.
A documentação do Terraform para aws_iam_access_key é bem clara, então podemos simplesmente criar um recurso que receba o nome de user2 como argumento:
Como o pipeline de implantação já foi desbloqueado, podemos aplicar isso com segurança usando o Terraform para criar uma nova chave:
Ainda precisamos remover a chave antiga. Com as informações do resultado do Snyk IaC, sabemos que o nome da chave é AKIASBXWQ3AYQETE6OFR.
A maneira mais simples de remover essa chave é:
Acesse IAM > Users > user2 > Security Credentials
Remova a chave chamada
AKIASBXWQ3AYQETE6OFR, indicada pelo Snyk IaC, desativando-a e, em seguida, excluindo-a.
Como está nossa cobertura agora?
Parabéns! Tudo voltou a ficar sob controle graças à detecção de drift do Snyk IaC!
O que | Tipo de recurso | Nome | Tipo de drift | Ação | Status |
|---|---|---|---|---|---|
Um usuário do IAM |
|
| Não gerenciado | IMPORTAR | * |
Uma chave de acesso do IAM |
|
| Não gerenciado | ROTACIONAR | * |
Uma política do IAM anexada |
|
| Não gerenciado | EXCLUIR | * |
Uma tag em um usuário do IAM |
|
| Gerenciado | ADICIONAR | * |
Para concluir
Neste artigo, mostramos como a detecção de drift do Snyk IaC ajuda a descobrir recursos da AWS criados manualmente e como ela apresenta tudo na terminologia do Terraform, com as informações certas para ajudar desenvolvedores a importar esses recursos para o código HCL do Terraform. Também vimos brevemente que reverter alterações automaticamente nem sempre é a melhor solução e que é preciso usar um sistema leve de alertas de detecção de drift junto com o pipeline de implantação.
Acreditamos firmemente que toda a infraestrutura deve estar representada em código, para que profissionais de engenharia tenham visibilidade e feedback de segurança sobre os problemas o quanto antes.
Por isso, o Snyk IaC ajuda as equipes a reintegrar rapidamente no código do Terraform todos os recursos que estão realmente em execução na conta da AWS, aumentando a cobertura geral de IaC e reduzindo os problemas de segurança. O Snyk IaC agiliza as correções ao fechar o ciclo de feedback entre as equipes de segurança em nuvem e engenharia, além de encaminhar aos engenheiros correções práticas, em uma linguagem que eles entendem.
Proteja a infraestrutura desde a origem
A Snyk automatiza a segurança e a conformidade de IaC nos fluxos de trabalho e detecta recursos com configurações divergentes ou ausentes.
