
Mehrthread-fähiges AWS-Inventarsammelwerkzeug mit Fokus auf sicherheitsrelevante Ressourcen und Metadaten.
Ein multi-threaded, auf AWS-Sicherheit ausgerichtetes Inventarsammelwerkzeug, geschrieben in Ruby.
Dieses Werkzeug wurde entwickelt, um die effiziente Sammlung einer großen Menge von AWS-Ressourcenattributen und -Metadaten zu erleichtern. Es zielt darauf ab, nahezu alles zu sammeln, was für die Sicherheitskonfiguration und den Sicherheitsstatus einer AWS-Umgebung relevant ist.
Bestehende Werkzeuge (z. B. AWS Config), die eine Form der Ressourcensammlung durchführen, haben nicht die Abdeckung und Spezifität, um den Sicherheitsstatus genau zu messen (z. B. detaillierte Ressourcenattributdaten, vollständig geparste Richtliniendokumente und verschachtelte Ressourcenbeziehungen).
AWS Recon bewältigt die Sammlung aus großen Konten durch die Nutzung automatischer Wiederholungsversuche (entweder aufgrund von Netzwerkzuverlässigkeit oder API-Drosselung), automatisches Paging großer Antworten (> 100 Ressourcen pro API-Aufruf) und Multi-Threading paralleler Anfragen, um die Sammlung zu beschleunigen.
** Nutzung impliziert keine Befürwortung
AWS Recon benötigt eine AWS-Kontorolle oder Anmeldeinformationen mit ReadOnlyAccess. Vollständiger AdministratorAccess ist überprivilegiert, funktioniert aber ebenfalls. Die SecurityAudit-Richtlinie ist nicht ausreichend, da sie den Zugriff auf viele Dienste ausschließt.
Verwenden Sie Docker Version 19.x oder höher, um das vorgefertigte Image auszuführen, ohne etwas installieren zu müssen.
Wenn Sie bereits Ruby installiert haben (2.6.x oder 2.7.x), möchten Sie möglicherweise das Ruby-Gem installieren.
AWS Recon kann lokal über einen Docker-Container oder durch Installation des Ruby-Gems ausgeführt werden.
Zur Ausführung über einen Docker-Container übergeben Sie die erforderlichen AWS-Anmeldeinformationen in den Docker-run-Befehl. Zum Beispiel:
$ 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
Zur lokalen Ausführung installieren Sie zuerst das 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
Oder fügen Sie es mit bundle zu Ihrer Gemfile hinzu:
$ 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 nutzt alle AWS-Anmeldeinformationen (siehe Voraussetzungen), die derzeit in der Umgebung verfügbar sind, in der es ausgeführt wird. Wenn Sie Daten aus mehreren Konten sammeln, möchten Sie möglicherweise etwas wie aws-vault verwenden, um verschiedene Anmeldeinformationen zu verwalten.
$ aws-vault exec profile -- aws_recon
Einfache Umgebungsvariablen funktionieren ebenfalls.
$ AWS_PROFILE=<profile> aws_recon
Zur Ausführung aus einem Docker-Container mit aws-vault-verwalteten Anmeldeinformationen (Ausgabe auf 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
Zur Ausführung aus einem Docker-Container mit aws-vault-verwalteten Anmeldeinformationen und Ausgabe in eine Datei müssen Sie einige Voraussetzungen erfüllen. Erstens benötigt Docker Zugriff, um den von Ihnen angegebenen Pfad (oder einen übergeordneten Pfad) einzubinden. Zweitens müssen Sie eine leere Datei erstellen, in die die Ausgabe gespeichert werden soll (z. B. output.json). Dies liegt daran, dass nur diese eine Datei zur Laufzeit in den Docker-Container eingebunden wird. Zum Beispiel:
Erstellen Sie eine leere Datei.
$ touch output.json
Führen Sie den aws_recon-Container aus und geben Sie die Ausgabedatei an.
$ 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
Sie möchten möglicherweise zu Beginn das Flag -v oder --verbose verwenden, um Status und Aktivität während der Sammlung zu sehen.
Im ausführlichen Modus zeigt die Konsolenausgabe Folgendes:
<thread>.<region>.<service>.<operation>
Das Präfix t gibt an, unter welchem Thread eine bestimmte Anfrage ausgeführt wird. Region, Dienst und Vorgang geben an, welche Anforderungsoperation gerade läuft und wo.
$ 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
Finished in 46 seconds. Saving resources to output.json.
# Sammle S3- und EC2-globale Ressourcen sowie us-east-1 und us-east-2
$ AWS_PROFILE=<profile> aws_recon -s S3,EC2 -r global,us-east-1,us-east-2
# Sammle S3- und EC2-globale Ressourcen sowie us-east-1 und us-east-2
$ AWS_PROFILE=<profile> aws_recon --services S3,EC2 --regions global,us-east-1,us-east-2
# Speichere Ausgabe in S3-Bucket
$ AWS_PROFILE=<profile> aws_recon \
--services S3,EC2 \
--regions global,us-east-1,us-east-2 \
--verbose \
--s3-bucket my-recon-bucket
# Speichere Ausgabe in S3-Bucket mit einer anderen Heimatregion als 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
Beispiel für die OpenCSPM-formatierte (NDJSON) Ausgabe.
$ AWS_PROFILE=<profile> aws_recon -l \
-s S3,EC2 \
-r global,us-east-1,us-east-2 \
-f custom
oder
$ AWS_PROFILE=<profile> aws_recon -j \
-s S3,EC2 \
-r global,us-east-1,us-east-2 \
-f custom > output.json
API-Ausnahmen im Zusammenhang mit Berechtigungen werden in den meisten Fällen stillschweigend ignoriert. Diese Fehler treten normalerweise aus einem der folgenden Gründe auf:
Im verbose-Modus sehen Sie Ausnahme-Logs in der Ausgabe:
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
Verwenden Sie die Kommandozeilenoption -q, um diese Ausnahmen erneut auszulösen, damit die Fehlerbehebung bei Zugriffsproblemen einfacher wird.
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)
Der genaue API-Vorgang, der die Ausnahme ausgelöst hat, wird in der letzten Zeile des Stack-Trace angezeigt. Wenn Sie den erforderlichen Zugriff nicht auflösen können, sollten Sie diese Dienste mit -x oder --not-services ausschließen oder die Option -q weglassen, damit die Sammlung fortgesetzt werden kann.
AWS Recon verwendet mehrere Threads, um einige der I/O-Herausforderungen bei der Durchführung vieler API-Aufrufe an Endpunkte auf der ganzen Welt zu überwinden.
Für globale Dienste wie IAM, Shield und Support werden Anfragen nicht multi-threaded ausgeführt. Das S3-Modul ist multi-threaded, da jeder Bucket mehrere zusätzliche Aufrufe erfordert, um vollständige Metadaten zu sammeln.
Für regionale Dienste wird ein Thread (bis zum Thread-Limit) für jeden Dienst in einer Region gestartet. Standardmäßig werden bis zu 8 Threads verwendet. Wenn Ihr Konto Ressourcen über viele Regionen verteilt hat, können Sie die Geschwindigkeit verbessern, indem Sie die Anzahl der Threads mit -t X erhöhen, wobei X die Anzahl der Threads ist.
AWS Recon führt in einem neuen/leeren Konto mindestens ~2.000 API-Aufrufe durch, nur um die unterstützten Dienste in allen 20 Standardregionen (keine GovCloud, keine China) abzufragen. Es ist sehr wahrscheinlich, dass bei großen Konten API-Ratenbegrenzungen (Drosselung) auftreten, wenn Sie mehr Threads als die Standardeinstellung (8) aktivieren.
Recon wird automatisch zurückfahren und die Wiederholungsgrenzen in der API-Antwort respektieren. Wenn Sie während der Sammlung lange Pausen beobachten, ist dies wahrscheinlich der Fall. Wiederholen Sie die Sammlung mit der Option -d oder --debug, um den Leitungsverlauf zu beobachten und zu sehen, ob Sie gedrosselt werden. Erwägen Sie die Verwendung von weniger Threads oder fordern Sie höhere Ratenlimits von AWS an, wenn Sie regelmäßig gedrosselt werden.
Die meisten Benutzer werden die Sammlung auf relevante Dienste und Regionen beschränken wollen. Das Ausführen ohne Ausschlüsse versucht, alle Ressourcen aus allen für das Konto aktivierten Regionen zu sammeln.
$ aws_recon -h
AWS Recon - AWS Inventory Collector (0.5.17)
Usage: aws_recon [options]
-r, --regions [REGIONS] Regions to scan, separated by comma (default: all)
-n, --not-regions [REGIONS] Regions to skip, separated by comma (default: none)
-s, --services [SERVICES] Services to scan, separated by comma (default: all)
-x, --not-services [SERVICES] Services to skip, separated by comma (default: none)
-c, --config [CONFIG] Specify config file for services & regions (e.g. config.yaml)
-b, --s3-bucket [BUCKET:REGION] Write output file to S3 bucket (default: '')
-o, --output [OUTPUT] Specify output file (default: output.json)
-f, --format [FORMAT] Specify output format (default: aws)
-t, --threads [THREADS] Specify max threads (default: 8, max: 128)
-l, --json-lines Output NDJSON/JSONL format (default: false)
-u, --user-data Collect EC2 instance user data (default: false)
-z, --skip-slow Skip slow operations (default: false)
-g, --skip-credential-report Skip generating IAM credential report (default: false)
-j, --stream-output Stream JSON lines to stdout (default: false)
-v, --verbose Output client progress and current operation
-q, --quit-on-exception Stop collection if an API error is encountered (default: false)
-d, --debug Output debug with wire trace info
-h, --help Print this help information
Die Ausgabe ist immer eine Form von JSON – entweder JSON-Zeilen oder reines JSON. Die Ausgabe wird entweder in eine Datei geschrieben (Standard) oder auf stdout geschrieben (mit -j).
Beim Schreiben in einen S3-Bucket wird die JSON-Ausgabe automatisch mit gzip komprimiert.
Wenn Sie manuell aktivierte Regionen aktiviert haben:
und Sie STS verwenden, um eine Rolle in ein Konto zu übernehmen, müssen Sie v2-STS-Tokens aktivieren in dem Konto, von dem aus Sie die Rolle übernehmen, um AWS Recon gegen diese Regionen ausführen zu können.
Version-1-Tokens sind nur in AWS-Regionen gültig, die standardmäßig verfügbar sind. Diese Tokens funktionieren nicht in manuell aktivierten Regionen wie Asia Pacific (Hong Kong). Version-2-Tokens sind in allen Regionen gültig. Allerdings sind Version-2-Tokens länger und können Systeme beeinträchtigen, in denen Sie Tokens vorübergehend speichern.
Wenn Sie einen statischen Zugriffsschlüssel/Geheimnis verwenden, können Sie unabhängig von der STS-Token-Version aus diesen Regionen sammeln.
Die aktuelle „Abdeckung“ pro Dienst ist unten aufgeführt. Dienste ohne Abdeckung werden nach und nach hinzugefügt. PRs sind willkommen. :)
AWS Recon zielt darauf ab, alle Ressourcen und Metadaten zu sammeln, die für die Bestimmung des Sicherheitsstatus Ihres AWS-Kontos (Ihrer AWS-Konten) relevant sind. Es untersucht die Ressourcen jedoch nicht tatsächlich auf den Sicherheitsstatus – dies ist die Aufgabe anderer Tools, die die Ausgabe von AWS Recon als Eingabe verwenden.
Eine der Hauptmotivationen für AWS Recon war die Entwicklung eines Tools, das einfach zu warten und zu erweitern ist. Wenn Sie der Meinung sind, dass die Abdeckung für einen bestimmten Dienst verbessert werden könnte, freuen wir uns über entsprechende PRs. Jeder mit mittleren Ruby-Kenntnissen kann das Muster nachahmen, das von den vorhandenen Collectoren verwendet wird, um einen bestimmten Dienst abzufragen und die Ergebnisse zur Ressourcensammlung hinzuzufügen.
Klonen Sie dieses Repository:
$ git clone [email protected]:darkbitio/aws-recon.git
$ cd aws-recon
Erstellen Sie ein „sticky gemset“ bei Verwendung von RVM:
$ rvm use 2.7.2@aws_recon_dev --create --ruby-version
Führen Sie bin/setup aus, um Abhängigkeiten zu installieren. Führen Sie dann rake test aus, um die Tests auszuführen. Sie können auch bin/console für eine interaktive Eingabeaufforderung ausführen, mit der Sie experimentieren können.
Um dieses Gem auf Ihrem lokalen Rechner zu installieren, führen Sie bundle exec rake install aus. Um eine neue Version zu veröffentlichen, aktualisieren Sie die Versionsnummer in version.rb und führen Sie dann bundle exec rake release aus, wodurch ein Git-Tag für die Version erstellt, Git-Commits und -Tags gepusht und die .gem-Datei auf rubygems.org hochgeladen wird.
AWS Recon wurde von der hervorragenden Arbeit der Menschen und Teams hinter diesen Tools inspiriert: