Estou tentando encontrar uma maneira de determinar os grupos de segurança órfãos para poder limpá-los e me livrar deles. Alguém conhece uma maneira de descobrir grupos de segurança não utilizados.
Tanto através do console quanto com as ferramentas de linha de comando funcionarão (rodando ferramentas de linha de comando em máquinas Linux e OSX).
Respostas:
Observação: isso considera apenas o uso de segurança no EC2, não em outros serviços como RDS. Você precisará trabalhar mais para incluir grupos de segurança usados fora do EC2. O bom é que você não pode facilmente (pode não ser possível) excluir grupos de segurança ativos se perder um associado com outro serviço.
Usando a ferramenta AWS CLI mais recente, descobri uma maneira fácil de conseguir o que preciso:
Primeiro, obtenha uma lista de todos os grupos de segurança
Em seguida, obter todos os grupos de segurança ligados a uma instância, então canalizada para
sort
, em seguidauniq
:Em seguida, reúna e compare as 2 listas e veja o que não está sendo usado na lista principal:
fonte
aws elb describe-load-balancers --query 'LoadBalancerDescriptions[*].SecurityGroups[*]' --output text | tr '\t' '\n' | sort | uniq
aws rds describe-db-security-groups --query 'DBSecurityGroups[*].EC2SecurityGroups[*].EC2SecurityGroupId' --output text | tr '\t' '\n' | sort | uniq
aws ec2 describe-network-interfaces --query 'NetworkInterfaces[*].Groups[*].GroupId' --output text| tr '\t' '\n' | sort | uniq
apenas para descrever as interfaces de rede.Se você selecionar todos os seus grupos de segurança no console EC2, pressione ações -> Excluir grupos de segurança, um pop-up aparecerá informando que você não pode excluir grupos de segurança que estão anexados a instâncias, outros grupos de segurança ou interfaces de rede, e irá listar os grupos de segurança que você pode excluir; ou seja, os grupos de segurança não utilizados :)
fonte
Este é o código de amostra escrito em boto (Python SDK para AWS) para listar o Grupo de Segurança em relação ao número de instâncias ao qual está associado.
Você pode usar esta lógica para obter o mesmo na linha de comando também
Boto Code
Resultado
fonte
Após cerca de um ano de uso não auditado, achei necessário auditar meus grupos de segurança do AWS EC2 e limpar os grupos legados não usados.
Essa era uma tarefa difícil de realizar por meio da GUI da web, então olhei para o AWS CLI para tornar a tarefa mais fácil. Descobri como fazer isso no StackOverflow, mas estava longe de ser concluído. Então decidi escrever meu próprio roteiro. Usei o AWS CLI, MySQL e algum “Bash-foo” para realizar o seguinte:
Obtenha uma lista de todos os grupos de segurança EC2. Eu armazeno a id do grupo, nome do grupo e descrição em uma tabela chamada “grupos” em um banco de dados MySQL chamado aws_security_groups no localhost. O número total de grupos encontrados é informado ao usuário.
Obtenha uma lista de todos os grupos de segurança associados a cada um dos seguintes serviços e exclua-os da tabela: EC2 Istances EC2 Elastic Load Balancers AWS RDS Instances AWS OpsWorks (não deve ser removido por Amazon) Grupos de segurança padrão (não podem ser excluídos ) ElastiCache
Para cada serviço, relato uma contagem do número de grupos restantes na tabela após a conclusão da exclusão.
NOTAS: 1. Você desejará criar um arquivo para armazenar seu host MySQL, nome de usuário e senha e apontar a variável $ DBCONFIG para ele. Deve ser estruturado assim:
Deixe-me saber se você achar isso útil ou se tiver algum comentário, correção ou aprimoramento.
Aqui está o roteiro.
E aqui está o sql para criar o banco de dados.
fonte
Um exemplo de boto imprimindo os IDs e nomes dos grupos apenas dos grupos de segurança que não possuem instâncias atuais.
Também mostra como especificar com qual região você está preocupado.
Para confirmar quais grupos de segurança ainda estão sendo usados, você deve reverter ou remover o
if len(sg.instances()) == 0
teste e imprimir olen(sg.instances())
valor.Por exemplo
fonte
Usando o node.js AWS SDK, posso confirmar que a AWS não permite que você exclua grupos de segurança que estão em uso. Escrevi um script que simplesmente tenta excluir todos os grupos e trata os erros de maneira elegante. Isso funciona para o VPC clássico e moderno. A mensagem de erro pode ser vista abaixo.
fonte
Entre outras funções, tanto ScoutSuite quanto Prowler relatam grupos de segurança EC2 não utilizados. Ambos são de código aberto.
fonte
Para os SGs anexados às interfaces de rede:
Por nome:
Por id:
fonte
Existe uma ferramenta no mercado da AWS que torna isso muito mais fácil. Ele mostra quais grupos estão anexados / desanexados para fácil exclusão, mas também compara seus registros de fluxo de VPC com as regras do grupo de segurança e mostra quais regras SG estão em uso ou não. A AWS postou uma solução ELK-stack para fazer isso, mas era ridiculamente complexa.
Aqui está a ferramenta e um aviso de que trabalhei nela. Mas espero que todos vocês achem pertinente: https://www.piasoftware.net/single-post/2018/04/24/VIDEO-Watch-as-we-clean-up-EC2-security-groups-in-just -alguns minutos
fonte
Infelizmente, a resposta escolhida não é tão precisa quanto preciso (tentei investigar o porquê, mas preferi implementá-la).
Se eu verificar TODOS
NetworkInterfaces
, procurando por anexos em algumSecurityGroup
, obterei resultados parciais. Se eu verificar apenas emEC2Instances
, também obterei resultados parciais.Essa é a minha abordagem ao problema:
all_secgrp
all_instances
filter
função e filtrando usando issosecurity-group-id
)all_secgrp
Em anexo, você pode ver um trecho de código. Não reclame de eficiência, mas tente otimizá-la se quiser.
fonte
Este é um problema difícil, se você tiver grupos de segurança que fazem referência a outros grupos de segurança nas regras. Nesse caso, você terá que resolver DependencyErrors, o que não é trivial.
Se você estiver usando apenas endereços IP, esta solução funcionará depois de criar um cliente boto3:
fonte