
Ferramenta de coleta de inventário AWS multithread com foco em recursos e metadados relevantes para segurança.
Uma ferramenta de coleta de inventário multi-thread focada em segurança AWS, escrita em Ruby.
Esta ferramenta foi criada para facilitar a coleta eficiente de uma grande quantidade de atributos e metadados de recursos AWS. Seu objetivo é coletar quase tudo que seja relevante para a configuração de segurança e postura de um ambiente AWS.
Ferramentas existentes (ex.: AWS Config) que realizam algum tipo de coleta de recursos não possuem a cobertura e especificidade necessárias para medir com precisão a postura de segurança (ex.: dados detalhados de atributos de recursos, documentos de política totalmente analisados e relacionamentos aninhados entre recursos).
O AWS Recon lida com a coleta de grandes contas utilizando retentativas automáticas (seja por confiabilidade de rede ou limitação de API), paginação automática de respostas grandes (> 100 recursos por chamada de API) e solicitações paralelas multi-thread para acelerar a coleta.
** o uso não implica endosso
O AWS Recon precisa de uma função ou credenciais de conta AWS com ReadOnlyAccess. AdministratorAccess total é excessivamente privilegiado, mas também funcionará. A política SecurityAudit não é suficiente, pois omite acesso a muitos serviços.
Use Docker versão 19.x ou superior para executar a imagem pré-construída sem precisar instalar nada.
Se você já tem Ruby instalado (2.6.x ou 2.7.x), pode instalar a gem Ruby.
O AWS Recon pode ser executado localmente via um contêiner Docker ou instalando a gem Ruby.
Para executar via um contêiner Docker, passe as credenciais AWS necessárias no comando docker run. Por exemplo:
$ docker run -t --rm \
-e AWS_REGION \
-e AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY \
-e AWS_SESSION_TOKEN \
-v $(pwd)/output.json:/recon/output.json \
darkbitio/aws_recon:latest \
aws_recon -v -s EC2 -r global,us-east-1,us-east-2
Para executar localmente, primeiro instale a gem:
$ gem install aws_recon
Fetching aws_recon-0.5.17.gem
Fetching aws-sdk-3.0.1.gem
Fetching parallel-1.20.1.gem
...
Successfully installed aws-sdk-3.0.1
Successfully installed parallel-1.20.1
Successfully installed aws_recon-0.5.17
Ou adicione ao seu Gemfile usando bundle:
$ bundle add aws_recon
Fetching gem metadata from https://rubygems.org/
Resolving dependencies...
...
Using aws-sdk 3.0.1
Using parallel-1.20.1
Using aws_recon 0.5.17
O AWS Recon aproveitará qualquer credencial AWS (veja requisitos) disponível no ambiente em que é executado. Se você estiver coletando de várias contas, pode ser útil usar algo como aws-vault para gerenciar diferentes credenciais.
$ aws-vault exec profile -- aws_recon
Variáveis de ambiente simples também funcionarão.
$ AWS_PROFILE=<profile> aws_recon
Para executar de um contêiner Docker usando credenciais gerenciadas por aws-vault (saída para stdout):
$ aws-vault exec <vault_profile> -- docker run -t --rm \
-e AWS_REGION \
-e AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY \
-e AWS_SESSION_TOKEN \
darkbitio/aws_recon:latest \
aws_recon -j -s EC2 -r global,us-east-1,us-east-2
Para executar de um contêiner Docker usando credenciais gerenciadas por aws-vault e salvar a saída em um arquivo, você precisará atender a alguns requisitos. Primeiro, o Docker precisa ter acesso ao caminho que você especificar (ou um caminho pai acima dele). Segundo, você precisa criar um arquivo vazio para salvar a saída (ex.: output.json). Isso ocorre porque apenas esse arquivo é montado no contêiner Docker em tempo de execução. Por exemplo:
Crie um arquivo vazio.
$ touch output.json
Execute o contêiner aws_recon, especificando o arquivo de saída.
$ aws-vault exec <vault_profile> -- docker run -t --rm \
-e AWS_REGION \
-e AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY \
-e AWS_SESSION_TOKEN \
-v $(pwd)/output.json:/recon/output.json \
darkbitio/aws_recon:latest \
aws_recon -s EC2 -v -r global,us-east-1,us-east-2
Você pode querer usar a flag -v ou --verbose inicialmente para ver o status e a atividade enquanto a coleta está em execução.
No modo verbose, a saída do console mostrará:
<thread>.<region>.<service>.<operation>
O prefixo t indica em qual thread uma solicitação específica está sendo executada. Região, serviço e operação indicam qual operação de solicitação está em andamento e onde.
$ aws_recon -v
t0.global.EC2.describe_account_attributes
t2.global.S3.list_buckets
t3.global.Support.describe_trusted_advisor_checks
t2.global.S3.list_buckets.acl
t5.ap-southeast-1.WorkSpaces.describe_workspaces
t6.ap-northeast-1.Lightsail.get_instances
...
t2.us-west-2.WorkSpaces.describe_workspaces
t1.us-east-2.Lightsail.get_instances
t4.ap-southeast-1.Firehose.list_delivery_streams
t7.ap-southeast-1.Lightsail.get_instances
t0.ap-south-1.Lightsail.get_instances
t1.us-east-2.Lightsail.get_load_balancers
t7.ap-southeast-2.WorkSpaces.describe_workspaces
t2.eu-west-3.SageMaker.list_notebook_instances
t3.eu-west-2.SageMaker.list_notebook_instances
Finalizado em 46 segundos. Salvando recursos em output.json.
# coletar recursos globais do S3 e EC2, além de us-east-1 e us-east-2
$ AWS_PROFILE=<profile> aws_recon -s S3,EC2 -r global,us-east-1,us-east-2
# coletar recursos globais do S3 e EC2, além de us-east-1 e us-east-2
$ AWS_PROFILE=<profile> aws_recon --services S3,EC2 --regions global,us-east-1,us-east-2
# salvar saída em bucket S3
$ AWS_PROFILE=<profile> aws_recon \
--services S3,EC2 \
--regions global,us-east-1,us-east-2 \
--verbose \
--s3-bucket my-recon-bucket
# salvar saída em bucket S3 com uma região inicial diferente de us-east-1