
Strumento di raccolta inventario AWS multi-thread con focus su risorse e metadati rilevanti per la sicurezza.
Uno strumento di raccolta inventario orientato alla sicurezza AWS, multi-threaded, scritto in Ruby.
Questo strumento è stato creato per facilitare la raccolta efficiente di una grande quantità di attributi e metadati delle risorse AWS. Mira a raccogliere quasi tutto ciò che è rilevante per la configurazione di sicurezza e la postura di un ambiente AWS.
Gli strumenti esistenti (ad es. AWS Config) che eseguono una qualche forma di raccolta di risorse mancano della copertura e della specificità per misurare accuratamente la postura di sicurezza (ad es. dati dettagliati sugli attributi delle risorse, documenti policy completamente analizzati e relazioni tra risorse nidificate).
AWS Recon gestisce la raccolta da account di grandi dimensioni sfruttando i tentativi automatici (a causa di affidabilità della rete o limitazione API), il paging automatico delle risposte di grandi dimensioni (> 100 risorse per chiamata API) e richieste parallele multi-threaded per velocizzare la raccolta.
** l'utilizzo non implica approvazione
AWS Recon necessita di un ruolo o credenziali dell'account AWS con ReadOnlyAccess. L'accesso completo AdministratorAccess è eccessivo, ma funzionerà comunque. La policy SecurityAudit non è sufficiente in quanto omette l'accesso a molti servizi.
Utilizzare Docker versione 19.x o superiore per eseguire l'immagine precompilata senza dover installare nulla.
Se hai già Ruby installato (2.6.x o 2.7.x), potresti voler installare la gemma Ruby.
AWS Recon può essere eseguito localmente tramite un container Docker o installando la gemma Ruby.
Per eseguire tramite un container Docker, passa le credenziali AWS necessarie nel comando docker run. Ad esempio:
$ 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
Per eseguire localmente, installa prima la gemma:
$ 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
Oppure aggiungila al tuo 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 sfrutterà qualsiasi credenziale AWS (vedi requisiti) attualmente disponibile per l'ambiente in cui viene eseguito. Se stai raccogliendo da più account, potresti voler utilizzare qualcosa come aws-vault per gestire credenziali diverse.
$ aws-vault exec profile -- aws_recon
Anche le variabili d'ambiente semplici funzioneranno bene.
$ AWS_PROFILE=<profile> aws_recon
Per eseguire da un container Docker utilizzando credenziali gestite da aws-vault (output su 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
Per eseguire da un container Docker utilizzando credenziali gestite da aws-vault e output su file, devi soddisfare un paio di requisiti. Innanzitutto, Docker deve avere accesso per montare il percorso specificato (o un percorso padre). In secondo luogo, devi creare un file vuoto in cui salvare l'output (ad es. output.json). Questo perché solo quel file viene montato nel container Docker al momento dell'esecuzione. Ad esempio:
Crea un file vuoto.
$ touch output.json
Esegui il container aws_recon, specificando il file di output.
$ 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
Potresti voler utilizzare l'opzione -v o --verbose inizialmente per vedere lo stato e l'attività durante la raccolta.
In modalità verbose, l'output della console mostrerà:
<thread>.<region>.<servizio>.<operazione>
Il prefisso t indica quale thread sta eseguendo una particolare richiesta. Regione, servizio e operazione indicano quale operazione di richiesta è attualmente in corso e dove.
$ 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
Finito in 46 secondi. Salvataggio risorse in output.json.
# raccogli risorse globali S3 ed EC2, oltre a us-east-1 e us-east-2
$ AWS_PROFILE=<profile> aws_recon -s S3,EC2 -r global,us-east-1,us-east-2
# raccogli risorse globali S3 ed EC2, oltre a us-east-1 e us-east-2
$ AWS_PROFILE=<profile> aws_recon --services S3,EC2 --regions global,us-east-1,us-east-2
# salva output su bucket S3
$ AWS_PROFILE=<profile> aws_recon \
--services S3,EC2 \
--regions global,us-east-1,us-east-2 \
--verbose \
--s3-bucket my-recon-bucket
# salva output su bucket S3 con una home region diversa da 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
Esempio di output in formato OpenCSPM (NDJSON).
$ AWS_PROFILE=<profile> aws_recon -l \
-s S3,EC2 \
-r global,us-east-1,us-east-2 \
-f custom
oppure
$ AWS_PROFILE=<profile> aws_recon -j \
-s S3,EC2 \
-r global,us-east-1,us-east-2 \
-f custom > output.json
Le eccezioni API relative alle autorizzazioni vengono ignorate silenziosamente nella maggior parte dei casi. Questi errori sono solitamente dovuti a uno di questi casi:
In modalità verbose, vedrai i registri delle eccezioni nell'output:
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
Usa l'opzione -q dalla riga di comando per rilanciare queste eccezioni in modo che la risoluzione dei problemi di accesso sia più semplice.
Traceback (most recent call last):
arn:aws:sts::1234567890:assumed-role/role/my-audit-role is not authorized to perform:
codepipeline:GetPipeline on resource: arn:aws:codepipeline:us-west-2:1234567890:pipeline
(Aws::CodePipeline::Errors::AccessDeniedException)
L'operazione API esatta che ha attivato l'eccezione è indicata nell'ultima riga del traceback. Se non riesci a risolvere l'accesso necessario, dovresti escludere quei servizi con -x o --not-services, oppure omettere l'opzione -q in modo che la raccolta possa continuare.
AWS Recon utilizza più thread per cercare di superare alcune delle sfide I/O nell'esecuzione di molte chiamate API a endpoint in tutto il mondo.
Per i servizi globali come IAM, Shield e Support, le richieste non sono multi-threaded. Il modulo S3 è multi-threaded poiché ogni bucket richiede diverse chiamate aggiuntive per raccogliere metadati completi.
Per i servizi regionali, viene generato un thread (fino al limite di thread) per ogni servizio in una regione. Per impostazione predefinita, verranno utilizzati fino a 8 thread. Se il tuo account ha risorse distribuite in molte regioni, potresti notare un miglioramento della velocità aumentando i thread con -t X, dove X è il numero di thread.
AWS Recon effettuerà un minimo di ~2.000 chiamate API in un account nuovo/vuoto, solo per interrogare i servizi supportati in tutte le 20 regioni standard (escluse GovCloud e Cina). È molto probabile che si verifichino limitazioni di frequenza API (throttling) su account di grandi dimensioni se si abilitano più thread rispetto a quello predefinito (8).
Recon eseguirà automaticamente il backoff e rispetterà i limiti di tentativi nella risposta API. Se osservi pause lunghe durante la raccolta, è probabile che sia ciò che sta accadendo. Ritenta la raccolta con l'opzione -d o --debug per osservare la traccia di rete e vedere se sei limitato. Considera l'utilizzo di meno thread o la richiesta di limiti di frequenza più alti ad AWS se vieni limitato regolarmente.
La maggior parte degli utenti vorrà limitare la raccolta ai servizi e alle regioni pertinenti. L'esecuzione senza esclusioni tenterà di raccogliere tutte le risorse da tutte le regioni abilitate per l'account.
$ aws_recon -h
AWS Recon - Collettore Inventario AWS (0.5.17)
Usage: aws_recon [options]
-r, --regions [REGIONS] Regioni da scansionare, separate da virgola (default: tutte)
-n, --not-regions [REGIONS] Regioni da saltare, separate da virgola (default: nessuna)
-s, --services [SERVICES] Servizi da scansionare, separati da virgola (default: tutti)
-x, --not-services [SERVICES] Servizi da saltare, separati da virgola (default: nessuno)
-c, --config [CONFIG] Specifica file di configurazione per servizi e regioni (es. config.yaml)
-b, --s3-bucket [BUCKET:REGION] Scrivi file di output su bucket S3 (default: '')
-o, --output [OUTPUT] Specifica file di output (default: output.json)
-f, --format [FORMAT] Specifica formato di output (default: aws)
-t, --threads [THREADS] Specifica numero massimo di thread (default: 8, max: 128)
-l, --json-lines Output in formato NDJSON/JSONL (default: false)
-u, --user-data Raccogli dati utente delle istanze EC2 (default: false)
-z, --skip-slow Salta operazioni lente (default: false)
-g, --skip-credential-report Salta generazione report credenziali IAM (default: false)
-j, --stream-output Stream di linee JSON su stdout (default: false)
-v, --verbose Mostra progresso client e operazione corrente
-q, --quit-on-exception Interrompi raccolta se si verifica un errore API (default: false)
-d, --debug Output di debug con info traccia di rete
-h, --help Mostra queste informazioni di aiuto
L'output è sempre una forma di JSON - linee JSON o JSON semplice. L'output viene scritto su un file (impostazione predefinita) o su stdout (con -j).
Quando si scrive su un bucket S3, l'output JSON viene automaticamente compresso con gzip.
Se hai abilitato regioni abilitate manualmente:
e stai usando STS per assumere un ruolo in un account, dovrai abilitare i token STS v2 nell'account da cui assumi il ruolo per poter eseguire AWS Recon su quelle regioni.
I token versione 1 sono validi solo nelle regioni AWS disponibili per impostazione predefinita. Questi token non funzionano nelle regioni abilitate manualmente, come Asia Pacifico (Hong Kong). I token versione 2 sono validi in tutte le regioni. Tuttavia, i token versione 2 sono più lunghi e potrebbero influenzare i sistemi in cui memorizzi temporaneamente i token.
Se stai utilizzando una chiave di accesso/segreta statica, puoi raccogliere da queste regioni indipendentemente dalla versione del token STS.
La "copertura" attuale per servizio è elencata di seguito. I servizi senza copertura verranno aggiunti in futuro. Le PR sono benvenute. :)
AWS Recon mira a raccogliere tutte le risorse e i metadati rilevanti per determinare la postura di sicurezza del/i tuo/i account AWS. Tuttavia, non esamina effettivamente le risorse per la postura di sicurezza: questo è compito di altri strumenti che prendono come input l'output di AWS Recon.
Una delle motivazioni principali di AWS Recon era creare uno strumento facile da mantenere ed estendere. Se ritieni che la copertura possa essere migliorata per un particolare servizio, accogliamo con favore PR in tal senso. Chiunque abbia una familiarità moderata con Ruby sarà in grado di imitare il modello utilizzato dai collector esistenti per interrogare un servizio specifico e aggiungere i risultati alla raccolta di risorse.
Clona questo repository:
$ git clone [email protected]:darkbitio/aws-recon.git
$ cd aws-recon
Crea un gemset sticky se usi RVM:
$ rvm use 2.7.2@aws_recon_dev --create --ruby-version
Esegui bin/setup per installare le dipendenze. Quindi, esegui rake test per eseguire i test. Puoi anche eseguire bin/console per un prompt interattivo che ti permetterà di sperimentare.
Per installare questa gemma sulla tua macchina locale, esegui bundle exec rake install. Per rilasciare una nuova versione, aggiorna il numero di versione in version.rb, quindi esegui bundle exec rake release, che creerà un tag git per la versione, invierà i commit e i tag git, e invierà il file .gem a rubygems.org.
AWS Recon è stato ispirato dall'eccellente lavoro delle persone e dei team dietro questi strumenti: