Descrição do Problema
Armazenar objetos em buckets públicos do AWS S3 pode ameaçar a segurança dos dados da sua empresa. O acesso público não é concedido a novos buckets e objetos da AWS por padrão. No entanto, na maioria dos casos, os buckets públicos são criados por membros da sua equipe de engenharia ocasionalmente ou o motivo está na falta de conhecimento e experiência na configuração adequada dos buckets da AWS. Portanto, seus dados críticos podem se tornar acessíveis a qualquer pessoa possuindo o link. A melhor maneira de prevenir tais casos inseguros é evitar buckets públicos, exceto em casos especiais, quando é realmente necessário.
No entanto, é uma tarefa complicada configurar o controle centralizado sob buckets com configurações de acesso público. O console da AWS fornece aos usuários uma oportunidade de identificar esses buckets por filtragem, mas temos grandes dúvidas de que seus engenheiros executarão esse procedimento diariamente para evitar buckets públicos inesperados.
A falta de um sistema de notificação dificulta manter o ciclo de vida do bucket público sob controle.
Nossas recomendações ajudarão você a gerenciar o acesso público aos recursos do Amazon S3 corretamente e garantir que todos os buckets e objetos necessários tenham seu acesso público bloqueado.
Como gerar uma lista de nomes de buckets que tenha acesso público de forma simples
Recomendação:
Encontre todos os buckets com acesso público usando aws cli. Não é necessário instalar aws cli no seu sistema. Você pode usar aws cli diretamente do console aws. Aqui está uma instrução: https://aws.amazon.com/cloudshell/
Um bucket pode ser marcado como público em dois casos:
- Possui política pública configurada.
- Ele tem ACLs públicas configuradas.
Ao mesmo tempo, o acesso público não deve ser bloqueado por um bloco de acesso público, caso contrário, o bucket não será público.
Otimização de custo de nuvem gratuita. Vida
1. Caso de política pública
1.1 Liste todos os buckets do usuário e exiba o nome como texto
aws s3api list-buckets --query 'Buckets[*].[Nome]' --texto de saída
Mais informações podem ser encontradas aqui: https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/list-buckets.html
1.2 Verificar status da política de bucket
aws s3api get-bucket-policy-status --bucket "$bucket" --query 'PolicyStatus.IsPublic' --texto de saída
Mais informações podem ser encontradas aqui:
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-policy-status.html
1.3 Verifique se o acesso público não está bloqueado pela configuração de bloqueio de acesso público
aws s3api get-public-access-block --bucket "$bucket" --query 'PublicAccessBlockConfiguration.BlockPublicPolicy' --texto de saída
Mais informações podem ser encontradas aqui:
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-public-access-block.html
Como resultado, um comando de linha:
para bucket em $(aws s3api list-buckets --query 'Buckets[*].[Nome]' --texto de saída);faça se [[ $(aws s3api get-bucket-policy-status --bucket "$bucket" --query 'PolicyStatus.IsPublic' --texto de saída 2>/dev/null) == Verdadeiro ]] && [[ $(aws s3api get-public-access-block --bucket "$bucket" --query 'PublicAccessBlockConfiguration.BlockPublicPolicy' --texto de saída 2>/dev/null) == Falso ]]; então ecoe "$bucket"; feito;
2. Caso ACLs público
2.1 Listar todos os buckets do usuário e gerar o nome como texto
Ver ponto 1.1
2.2 Verifique as ACLs do bucket que contêm permissões AllUsers
aws s3api get-bucket-acl --bucket "$bucket" --query 'Grants[?Grantee.URI==`http://acs.amazonaws.com/groups/global/AllUsers`]' --texto de saída
Mais informações podem ser encontradas aqui:
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-acl.html
2.3 Verifique se as ACLs públicas não estão bloqueadas pela configuração de bloqueio de acesso público
aws s3api get-public-access-block --bucket "$bucket" --query 'PublicAccessBlockConfiguration.BlockPublicAcls' --texto de saída
Mais informações podem ser encontradas aqui:
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-public-access-block.html
Como resultado, um comando de linha:
para bucket em $(aws s3api list-buckets --query 'Buckets[*].[Nome]' --texto de saída);faça se [[ $(aws s3api get-bucket-acl --bucket "$bucket" --query 'Grants[?Grantee.URI==`http://acs.amazonaws.com/groups/global/AllUsers`]' --texto de saída 2> /dev/null) ]] && [[ $(aws s3api get-public-access-block --bucket "$bucket" --query 'PublicAccessBlockConfiguration.BlockPublicAcls' --texto de saída 2>/dev/null) != True ]]; então ecoe "$bucket"; feito;
Resultado
Ambos os casos em uma linha:
para bucket em $(aws s3api list-buckets --query 'Buckets[*].[Nome]' --texto de saída); faça se [[ $(aws s3api get-bucket-acl --bucket "$bucket" --query 'Grants[?Grantee.URI==`http://acs.amazonaws.com/groups/global/AllUsers`]' --texto de saída 2> /dev/null) ]] && [[ $(aws s3api get-public-access-block --bucket "$bucket" --query 'PublicAccessBlockConfiguration.BlockPublicAcls' --texto de saída 2>/dev/null) != True ]]; então ecoe "$bucket"; elif [[ $(aws s3api get-bucket-policy-status --bucket "$bucket" --query 'PolicyStatus.IsPublic' --texto de saída 2>/dev/null) == Verdadeiro ]] && [[ $(aws s3api get-public-access-block --bucket "$bucket" --query 'PublicAccessBlockConfiguration.BlockPublicPolicy' --texto de saída 2>/dev/null) == Falso ]]; então eco "$bucket"; fi; feito
Este comando irá gerar uma lista de nomes de buckets que têm acesso público.
👆🏻 Dezenas de snapshots de volume da AWS são geralmente criados pela sua equipe de engenharia diariamente. Mas alguns desafios podem ocorrer durante a exclusão de instâncias e as empresas continuam a pagar por elas.
💡 Descubra maneiras de identificar e excluir snapshots órfãos e não utilizados para evitar desperdício e atingir metas de otimização → https://hystax.com/reduce-your-aws-bill-by-cleaning-orphaned-and-unused-disk-snapshots/