
Herramienta de recolección de inventario de AWS multi-hilo con enfoque en recursos y metadatos relevantes para la seguridad.
Una herramienta de recolección de inventario de AWS orientada a la seguridad y con múltiples hilos, escrita en Ruby.
Esta herramienta se creó para facilitar la recolección eficiente de una gran cantidad de atributos y metadatos de recursos de AWS. Su objetivo es recopilar casi todo lo relevante para la configuración de seguridad y la postura de un entorno AWS.
Las herramientas existentes (por ejemplo, AWS Config) que realizan algún tipo de recolección de recursos carecen de la cobertura y especificidad necesarias para medir con precisión la postura de seguridad (p. ej., datos detallados de atributos de recursos, documentos de política completamente analizados y relaciones anidadas entre recursos).
AWS Recon maneja la recolección de cuentas grandes aprovechando reintentos automáticos (ya sea por confiabilidad de red o limitación de API), paginación automática de respuestas grandes (> 100 recursos por llamada API) y solicitudes paralelas con múltiples hilos para acelerar la recolección.
** el uso no implica respaldo
AWS Recon necesita un rol de cuenta AWS o credenciales con ReadOnlyAccess. El acceso completo de AdministratorAccess es demasiado privilegiado, pero también funcionará. La política SecurityAudit no es suficiente, ya que omite el acceso a muchos servicios.
Use la versión 19.x o superior de Docker para ejecutar la imagen preconstruida sin necesidad de instalar nada.
Si ya tiene Ruby instalado (2.6.x o 2.7.x), es posible que desee instalar la gema de Ruby.
AWS Recon se puede ejecutar localmente a través de un contenedor Docker o instalando la gema de Ruby.
Para ejecutarlo mediante un contenedor Docker, pase las credenciales AWS necesarias al comando run de Docker. Por ejemplo:
$ 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 ejecutarlo localmente, primero instale la gema:
$ 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
O agréguela a su 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
AWS Recon aprovechará cualquier credencial AWS (consulte requisitos) disponible actualmente en el entorno donde se ejecuta. Si está recolectando de varias cuentas, es posible que desee usar algo como aws-vault para gestionar diferentes credenciales.
$ aws-vault exec profile -- aws_recon
Las variables de entorno simples también funcionarán bien.
$ AWS_PROFILE=<profile> aws_recon
Para ejecutar desde un contenedor Docker usando credenciales gestionadas por aws-vault (salida a 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 ejecutar desde un contenedor Docker usando credenciales gestionadas por aws-vault y salida a un archivo, deberá cumplir con un par de requisitos. Primero, Docker necesita acceso para montar en enlace la ruta que especifique (o una ruta superior). Segundo, debe crear un archivo vacío para guardar la salida (por ejemplo, output.json). Esto se debe a que solo ese archivo se monta en el contenedor Docker en tiempo de ejecución. Por ejemplo:
Cree un archivo vacío.
$ touch output.json
Ejecute el contenedor aws_recon, especificando el archivo de salida.
$ 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
Es posible que desee usar la bandera -v o --verbose inicialmente para ver el estado y la actividad mientras se ejecuta la recolección.
En modo verbose, la salida de la consola mostrará:
<thread>.<region>.<service>.<operation>
El prefijo t indica qué hilo está ejecutando una solicitud en particular. Región, servicio y operación indican qué operación de solicitud está actualmente en curso y dónde.
$ 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 en 46 segundos. Guardando recursos en output.json.
# recolectar recursos globales de S3 y EC2, así como us-east-1 y us-east-2
$ AWS_PROFILE=<profile> aws_recon -s S3,EC2 -r global,us-east-1,us-east-2
# recolectar recursos globales de S3 y EC2, así como us-east-1 y us-east-2
$ AWS_PROFILE=<profile> aws_recon --services S3,EC2 --regions global,us-east-1,us-east-2
# guardar salida en un bucket S3
$ AWS_PROFILE=<profile> aws_recon \
--services S3,EC2 \
--regions global,us-east-1,us-east-2 \
--verbose \
--s3-bucket my-recon-bucket
# guardar salida en un bucket S3 con una región de inicio distinta de us-east-1
$ AWS_PROFILE=<profile> aws_recon \
--services S3,EC2 \
--regions global,us-east-1,us-east-2 \
--verbose \
--s3-bucket my-recon-bucket:us-west-2
Ejemplo de salida con formato OpenCSPM (NDJSON).
$ AWS_PROFILE=<profile> aws_recon -l \
-s S3,EC2 \
-r global,us-east-1,us-east-2 \
-f custom
o
$ AWS_PROFILE=<profile> aws_recon -j \
-s S3,EC2 \
-r global,us-east-1,us-east-2 \
-f custom > output.json
Las excepciones de API relacionadas con permisos se ignoran silenciosamente en la mayoría de los casos. Estos errores suelen deberse a uno de estos casos:
En modo verbose, verá registros de excepciones en la salida:
t2.us-east-1.EC2.describe_subnets.0
t4.us-east-1.SSM.describe_instance_information.0
t6.us-east-1.SecurityHub.InvalidAccessException <-----
t2.us-east-1.EC2.describe_addresses.0
t4.us-east-1.SSM.describe_parameters.0
t1.us-east-1.GuardDuty.list_detectors.0
Use la opción de línea de comandos -q para volver a lanzar estas excepciones y facilitar la resolución de problemas de acceso.
Traceback (most recent call last):
arn:aws:sts::1234567890:assumed-role/role/my-audit-role no está autorizado para realizar:
codepipeline:GetPipeline en el recurso: arn:aws:codepipeline:us-west-2:1234567890:pipeline
(Aws::CodePipeline::Errors::AccessDeniedException)
La operación exacta de la API que desencadenó la excepción se indica en la última línea del seguimiento de la pila. Si no puede resolver el acceso necesario, debe excluir esos servicios con -x o --not-services, o omitir la opción -q para que la recolección pueda continuar.
AWS Recon utiliza múltiples hilos para intentar superar algunos de los desafíos de E/S al realizar muchas llamadas API a endpoints en todo el mundo.
Para servicios globales como IAM, Shield y Support, las solicitudes no son multihilo. El módulo S3 es multihilo ya que cada bucket requiere varias llamadas adicionales para recopilar metadatos completos.
Para servicios regionales, se crea un hilo (hasta el límite de hilos) para cada servicio en una región. Por defecto, se usarán hasta 8 hilos. Si su cuenta tiene recursos distribuidos en muchas regiones, es posible que vea una mejora de velocidad al aumentar los hilos con -t X, donde X es el número de hilos.
AWS Recon realizará un mínimo de ~2,000 llamadas API en una cuenta nueva/vacía, solo para consultar los servicios compatibles en las 20 regiones estándar (sin GovCloud, sin China). Es muy probable que encuentre limitación de velocidad de API (throttling) en cuentas grandes si habilita más hilos que el valor predeterminado (8).
Recon retrocederá automáticamente y respetará los límites de reintento en la respuesta de la API. Si observa pausas largas durante la recolección, probablemente esto es lo que está sucediendo. Vuelva a intentar la recolección con la opción -d o --debug para observar el seguimiento del cable y ver si está siendo limitado. Considere usar menos hilos o solicitar límites de velocidad más altos a AWS si se ve limitado con frecuencia.
La mayoría de los usuarios querrán limitar la recolección a servicios y regiones relevantes. Ejecutar sin exclusiones intentará recopilar todos los recursos de todas las regiones habilitadas para la cuenta.
$ aws_recon -h
AWS Recon - Recolector de inventario AWS (0.5.17)
Uso: aws_recon [opciones]
-r, --regions [REGIONS] Regiones a escanear, separadas por coma (por defecto: todas)
-n, --not-regions [REGIONS] Regiones a omitir, separadas por coma (por defecto: ninguna)
-s, --services [SERVICES] Servicios a escanear, separados por coma (por defecto: todos)
-x, --not-services [SERVICES] Servicios a omitir, separados por coma (por defecto: ninguno)
-c, --config [CONFIG] Especificar archivo de configuración para servicios y regiones (ej. config.yaml)
-b, --s3-bucket [BUCKET:REGION] Escribir archivo de salida en un bucket S3 (por defecto: '')
-o, --output [OUTPUT] Especificar archivo de salida (por defecto: output.json)
-f, --format [FORMAT] Especificar formato de salida (por defecto: aws)
-t, --threads [THREADS] Especificar máximo de hilos (por defecto: 8, máximo: 128)
-l, --json-lines Salida en formato NDJSON/JSONL (por defecto: falso)
-u, --user-data Recopilar datos de usuario de instancias EC2 (por defecto: falso)
-z, --skip-slow Omitir operaciones lentas (por defecto: falso)
-g, --skip-credential-report Omitir generación de informe de credenciales IAM (por defecto: falso)
-j, --stream-output Transmitir líneas JSON a stdout (por defecto: falso)
-v, --verbose Mostrar progreso del cliente y operación actual
-q, --quit-on-exception Detener recolección si se encuentra un error de API (por defecto: falso)
-d, --debug Mostrar depuración con información de seguimiento de cable
-h, --help Mostrar esta información de ayuda
La salida siempre es algún tipo de JSON: ya sea líneas JSON o JSON plano. La salida se escribe en un archivo (por defecto) o se escribe en stdout (con -j).
Al escribir en un bucket S3, la salida JSON se comprime automáticamente con gzip.
Si ha habilitado regiones habilitadas manualmente:
y está usando STS para asumir un rol en una cuenta, necesitará habilitar tokens STS v2 en la cuenta desde la que está asumiendo el rol para poder ejecutar AWS Recon contra esas regiones.
Los tokens de versión 1 solo son válidos en las regiones de AWS que están disponibles por defecto. Estos tokens no funcionan en regiones habilitadas manualmente, como Asia Pacífico (Hong Kong). Los tokens de versión 2 son válidos en todas las regiones. Sin embargo, los tokens de versión 2 son más largos y pueden afectar a los sistemas donde almacene tokens temporalmente.
Si está usando una clave de acceso/secreto estática, puede recolectar de estas regiones independientemente de la versión del token STS.
La "cobertura" actual por servicio se enumera a continuación. Los servicios sin cobertura se agregarán eventualmente. Las PR son bienvenidas. :)
AWS Recon tiene como objetivo recopilar todos los recursos y metadatos que son relevantes para determinar la postura de seguridad de su(s) cuenta(s) AWS. Sin embargo, en realidad no examina los recursos en busca de postura de seguridad; esa es la tarea de otras herramientas que toman la salida de AWS Recon como entrada.
Una de las principales motivaciones para AWS Recon fue construir una herramienta que sea fácil de mantener y ampliar. Si cree que la cobertura podría mejorarse para un servicio en particular, agradeceríamos las PR en ese sentido. Cualquier persona con familiaridad moderada con Ruby podrá imitar el patrón utilizado por los recolectores existentes para consultar un servicio específico y agregar los resultados a la recolección de recursos.
Clone este repositorio:
$ git clone [email protected]:darkbitio/aws-recon.git
$ cd aws-recon
Cree un gemset fijo si usa RVM:
$ rvm use 2.7.2@aws_recon_dev --create --ruby-version
Ejecute bin/setup para instalar las dependencias. Luego, ejecute rake test para ejecutar las pruebas. También puede ejecutar bin/console para un prompt interactivo que le permitirá experimentar.
Para instalar esta gema en su máquina local, ejecute bundle exec rake install. Para lanzar una nueva versión, actualice el número de versión en version.rb, y luego ejecute bundle exec rake release, lo que creará una etiqueta git para la versión, enviará los commits y etiquetas de git, y enviará el archivo .gem a rubygems.org.
AWS Recon fue inspirado por el excelente trabajo de las personas y equipos detrás de estas herramientas: