
Automatisiertes Tool zur Anreicherung und Bewertung der Auswirkungen von Sicherheitsergebnissen für AWS. Reichert Schwachstellendaten mit Ressourcenkontext, Verknüpfungen und Tags an, um kontextbezogene Auswirkungsbewertungen für eine priorisierte Behebung zu berechnen.
MetaHub ist ein automatisiertes Tool zur kontextualisierten Anreicherung und Auswirkungsbewertung von Sicherheitsergebnissen für das Schwachstellenmanagement. Sie können es mit AWS Security Hub oder jedem ASFF-kompatiblen Sicherheitsscanner verwenden. Hören Sie auf, sich auf nutzlose Schweregrade zu verlassen, und wechseln Sie zu Auswirkungsbewertungsdefinitionen, die auf IHREM Kontext basieren.
MetaHub ist ein Open-Source-Sicherheitstool für auswirkungskontextuelles Schwachstellenmanagement. Es kann den Prozess der Kontextualisierung von Sicherheitsergebnissen basierend auf Ihrer Umgebung und Ihren Anforderungen automatisieren, IHREM Kontext, die Eigentümerschaft identifizieren und eine Auswirkungsbewertung berechnen, die Sie zur Priorisierung (wo sollten Sie anfangen?) und für Automatisierungen wie Behebungen, Warnungen oder Tickets verwenden können. Das Tool ist für AWS-Umgebungen und kann mit AWS Security Hub oder jedem ASFF-kompatiblen Scanner (wie Prowler) verwendet werden.
ℹ️ Entdecken und erweitern Sie die neuen MetaHub Dashboards mit Powerpipe!
MetaHub beschreibt Ihren Kontext, indem es eine Verbindung zu Ihren betroffenen Ressourcen in Ihren betroffenen Konten herstellt. Es kann Informationen über Ihr AWS-Konto und Ihre Organisation, die Tags der betroffenen Ressourcen, zugehörige CloudTrail-Ereignisse, die Konfigurationen Ihrer betroffenen Ressourcen und alle ihre Verknüpfungen beschreiben: Wenn Sie einen Sicherheitsbefund kontextualisieren, der eine EC2-Instanz betrifft, stellt MetaHub nicht nur eine Verbindung zu dieser Instanz selbst her, sondern auch zu ihren IAM-Rollen; von dort aus stellt es eine Verbindung zu den mit diesen Rollen verknüpften IAM-Richtlinien her. Es stellt eine Verbindung zu den Sicherheitsgruppen her und analysiert alle ihre Regeln, das VPC und die Subnetze, in denen die Instanz läuft, die Volumes, die Auto Scaling Groups und mehr. Sie können Filter anwenden, um die Erkennung anderer Ressourcen mit denselben Eigenschaften zu automatisieren und tiefergehende Untersuchungen durchzuführen.
Nachdem alle Informationen aus Ihrem Kontext abgerufen wurden, bewertet MetaHub die Auswirkungs-Bedingungen für alle Ihre Ressourcen: Exposition, Zugriff, Verschlüsselung, Status, Umgebung, Anwendung und Eigentümer und basierend auf diesen Berechnungen und zusätzlich zu den Informationen über die Befunde, die die Ressource betreffen, alle zusammen, generiert MetaHub einen Score für jedes Ergebnis und jede betroffene Ressource.
Sehen Sie sich das folgende von MetaHub generierte Dashboard an. Sie haben die betroffenen Ressourcen, die alle Sicherheitsergebnisse, die sie betreffen, zusammenfassen, sowie die ursprüngliche Schwere jedes Ergebnisses. Danach haben Sie den Score und alle Kriterien, die MetaHub zur Erstellung dieses Scores bewertet hat. Alle diese Informationen sind filterbar, sortierbar, gruppierbar, herunterladbar und anpassbar.

Das Folgende ist die JSON-Ausgabe für eine EC2-Instanz; sehen Sie, wie MetaHub alle Informationen zu seinem Kontext unter Verknüpfungen, Konfiguration, Tags, Konto und CloudTrail und schließlich dem Auswirkungs-Schlüssel mit dem Score und allen Kriterien organisiert, die zur Erstellung dieses Scores bewertet wurden.
MetaHub bietet eine Reihe von Möglichkeiten, Ihre Sicherheitsergebnisse für Untersuchungen, Unterdrückung, Aktualisierung und Integration mit anderen Tools aufzulisten, zu verwalten und auszugeben. Es ist für die Verwendung als CLI-Tool oder in automatisierten Workflows wie AWS Lambda-Funktionen konzipiert. Es unterstützt verschiedene Ausgaben, einige davon programmatisches JSON, aber auch leistungsstarke HTML, XLSX und CSV, die Sie anpassen.
Wenn Sie AWS Security Hub verwenden, integriert sich MetaHub nahtlos und erweitert dessen Funktionalitäten. Es kann als Security Hub Custom Action verwendet werden, es unterstützt AWS Security Hub Filter, Sie können den Workflow-Status Ihrer Ergebnisse verwalten und Sie können sogar Ihre Ergebnisse direkt in AWS Security Hub anreichern.
MetaHub ist für die Verwendung mit AWS konzipiert und unterstützt Multi-Account-Setups. Sie können das Tool aus jeder Umgebung ausführen, indem Sie Rollen in Ihrem AWS Security Hub master und Ihren child/service-Konten übernehmen. Dadurch können Sie aggregierte Daten aus mehreren Konten mithilfe Ihrer AWS Security Hub Multi-Account-Implementierung abrufen und gleichzeitig diese Ergebnisse mit Daten aus den Konten anreichern, in denen Ihre betroffenen Ressourcen ausgeführt werden. Weitere Informationen finden Sie unter Konfiguration von Security Hub.
Lesen Sie Ihre Sicherheitsergebnisse aus AWS Security Hub mit den Standardfiltern und führen Sie die Standardkontextoptionen aus:```bash ./metahub
Liest ein spezifisches (nach ID gefiltertes) Sicherheitsergebnis aus AWS Security Hub und führt die Standardkontextoptionen aus:```bash
./metahub --sh-filters Id=arn:aws:securityhub:us-east-1:123456789012:security-control/CloudFront.1/finding/8bd4d049-dcbc-445b-a5d1-595d8274b4c1
Liest alle aktiven Sicherheitsergebnisse, die eine Ressource betreffen (gefiltert nach ResourceId und RecordState), aus AWS Security Hub und führt die Standardkontextoptionen aus:```bash ./metahub --sh-filters RecordState=ACTIVE ResourceId=arn:aws:ec2:eu-west-1:123456789012:subnet/subnet-0b7d243ff90ebc03e
Liest alle Sicherheitsergebnisse, die ein AWS-Konto betreffen und AKTIV sind (gefiltert nach AwsAccountId und RecordState), für Ressourcen mit einem Tag `Environment` und dem Wert `stg` und führt die Kontextoptionen `config` und `tags` aus:```bash
./metahub --sh-filters RecordState=ACTIVE AwsAccountId=123456789012 --mh-filters-tags Environment=stg --context config tags
Lesen Sie Ihre Sicherheitsergebnisse aus Prowler als Eingabedatei und führt die Standard-Kontextoptionen aus:```bash python3 prowler.py aws -M json-asff -q ./metahub --inputs file-asff --input-asff /path/to/prowler-findings.json.asff
Liest Ihre Sicherheitsergebnisse aus Powerpipe als Eingabedatei und führt die Standard-Kontextoptionen aus:```bash
powerpipe benchmark run aws_compliance.benchmark.all_controls --export asff
./metahub --inputs file-asff --input-asff /path/to/powerpipe-findings.json.asff
Liest Ihre Sicherheitsergebnisse von Trivy als Eingabedatei und führt die Standardkontextoptionen aus:```bash export AWS_REGION=us-west-1 export AWS_ACCOUNT_ID=012345678901 trivy image --format template --template "@contrib/asff.tpl" -o trivy-findings.json.asff public.ecr.aws/n2p8q5p4/metahub:stable ./metahub --inputs file-asff --input-asff /path/to/trivy-findings.json.asff
# Context
In **MetaHub** bezieht sich **context** auf Informationen über die betroffenen Ressourcen wie deren **Konfiguration**, **Assoziationen**, **Logs**, **Tags** und **Account**.
MetaHub bleibt nicht bei der betroffenen Ressource stehen, sondern analysiert auch alle damit verbundenen oder angehängten Ressourcen. Wenn beispielsweise ein Sicherheitsbefund zu einer Security Group vorliegt, analysiert **MetaHub** die Security Group und alles, was damit verbunden ist, wie die EC2-Instanzen, die sie verwenden. Für jede zugehörige Ressource ruft **MetaHub** deren Kontext ab. Ist die Security Group an eine EC2-Instance angehängt, analysiert **MetaHub** die Instanz und alle ihre Assoziationen, wie die IAM-Rollen und -Richtlinien. Ausgehend von einem einzigen Sicherheitsbefund zu einer Security Group ruft **MetaHub** den Kontext der Security Group, der EC2-Instance, der IAM-Rollen und der IAM-Richtlinien ab. Dies ist entscheidend, um die Auswirkungen Ihrer Sicherheitsbefunde zu verstehen.
Das **context**-Modul besteht aus fünf Hauptteilen: [**config**](#config) (welches [**associations**](#associations) einschließt), [**tags**](#tags), [**cloudtrail**](#cloudtrail) und [**account**](#account). Standardmäßig sind nur **config**, **tags** und **account** aktiviert, aber Sie können dieses Verhalten mit der Option `--context` ändern (z. B. `--context config tags cloudtrail account` verwenden, um alle Kontext-Schlüssel zu aktivieren, oder `--context config`, um nur den Config- und Associations-Schlüssel zu aktivieren):
## Config
Unter dem Schlüssel `config` finden Sie wichtige Konfigurationen der betroffenen Ressource. Wenn es sich bei der betroffenen Ressource beispielsweise um einen S3-Bucket handelt, finden Sie Informationen über dessen Bucket-Richtlinie, ACLs, Verschlüsselungskonfiguration und mehr. Handelt es sich um eine EC2-Instance, finden Sie Informationen über ihren Schlüssel, ihre öffentliche und private IP, Metadaten und mehr. Die von **MetaHub** abgerufenen Konfigurationsinformationen sind nach Ressourcentyp definiert. Wenn Sie weitere Konfigurationsinformationen hinzufügen möchten, siehe [contributing](#contributing).
Sie können Ihre Ergebnisse basierend auf Config-Ausgaben mit der Option `--mh-filters-config <key> {True/False}` filtern (siehe [config filters](#config-filters)).
<details>
<summary>Beispiel für einen S3-Bucket-Config-Key</summary>```json
"config": {
"resource_policy": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Test",
"Effect": "Allow",
"Principal": {
"Service": "config.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::metahub-bucket",
"Condition": {
"StringEquals": {
"AWS:SourceAccount": "123456789012"
}
}
},
]
},
"website_enabled": false,
"bucket_acl": [
{
"Grantee": {
"DisplayName": "gabriel.soltz",
"ID": "1234564bd76c6c64080717b68eafaa588b41706daaf22d3d0705b398bd7cbd57",
"Type": "CanonicalUser"
},
"Permission": "FULL_CONTROL"
}
],
"cannonical_user_id": "1234564bd76c6c64080717b68eafaa588b41706daaf22d3d0705b398bd7cbd57",
"public_access_block_enabled": {
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
},
"account_public_access_block_enabled": false,
"public": false,
"bucket_encryption": [
{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "AES256"
},
"BucketKeyEnabled": false
}
]
},
Unter dem Schlüssel associations finden Sie alle zugehörigen Ressourcen der betroffenen Ressource. Zum Beispiel, wenn die betroffene Ressource eine EC2-Instanz ist, finden Sie Ressourcen wie: Security Groups, IAM Roles, Volumes, VPC, Subnets, Auto Scaling Groups. Wenn die betroffene Ressource eine IAM-Rolle ist, finden Sie Ressourcen wie IAM Policies, IAM Users, IAM Groups und mehr. Jedes Mal, wenn MetaHub eine Assoziation findet, verbindet es sich erneut mit der zugehörigen Ressource und ruft deren eigenen Kontext ab. Assoziationen sind entscheidend, um den Kontext und die Auswirkungen Ihrer Sicherheitsergebnisse zu verstehen.
Sie können Ihre Ergebnisse basierend auf Assoziationsausgaben mit der Option filtern: --mh-filters-config <key> {True/False} (siehe Konfigurationsfilter).
Unter dem tags-Schlüssel finden Sie alle mit der betroffenen Ressource verknüpften Tags. MetaHub nutzt die AWS Resource Groups Tagging API, um die mit Ihren Ressourcen verbundenen Tags abzufragen. Beachten Sie, dass nicht alle AWS-Ressourcentypen diese API unterstützen. Sie können die unterstützten Dienste überprüfen.
Tags sind ein entscheidender Bestandteil zum Verständnis Ihres Kontextes. Tagging-Strategien umfassen oft:
Wenn Sie eine geeignete Tagging-Strategie verfolgen, können Sie interessante Ausgaben filtern und generieren. Beispielsweise könnten Sie alle Ergebnisse auflisten, die ein bestimmtes Team betreffen, und diese Daten direkt an dieses Team weitergeben.
Sie können Ihre Ergebnisse basierend auf Tag-Ausgaben mit der Option --mh-filters-tags TAG=VALUE filtern (siehe Tags-Filter).
Unter dem Schlüssel cloudtrail finden Sie kritische CloudTrail-Ereignisse im Zusammenhang mit der betroffenen Ressource, z. B. Erstellungsereignisse. Die von uns überprüften CloudTrail-Ereignisse werden nach Ressourcentyp definiert, und Sie können sie durch Bearbeiten der Konfigurationsdatei resources.py hinzufügen, entfernen oder ändern. Beispielsweise sucht MetaHub für eine betroffene Ressource vom Typ Security Group nach den folgenden Ereignissen: CreateSecurityGroup (Security Group Creation Event) und AuthorizeSecurityGroupIngress (Security Group Rule Authorization Event).
Unter dem Schlüssel account finden Sie Informationen über das Konto, auf dem die betroffene Ressource läuft, wie z.B. ob es Teil einer AWS Organizations ist, Informationen über deren Kontakte und mehr.

Das Impact-Modul in MetaHub konzentriert sich auf das Verständnis der 7 Schlüsseleigenschaften der betroffenen Ressource: Exposure, Access, Encryption, Status, Environment, Application und Owner und kombiniert deren Werte mit den Werten aller Sicherheits-Findings, die dieselbe Ressource betreffen, sowie deren Schweregraden, um einen Score zu generieren. Der Impact-Score ist eine Zahl zwischen 0 und 100, wobei 100 die höchste Auswirkung darstellt.
Exposure bewertet, wie die betroffene Ressource gegenüber anderen Netzwerken exponiert ist. Beispielsweise, ob die betroffene Ressource effektiv öffentlich oder nur öffentlich ist, ob sie Teil eines VPC ist, ob sie eine öffentliche IP hat oder ob sie durch eine Firewall oder eine Sicherheitsgruppe geschützt ist.
| Mögliche Status | Wert | Beschreibung |
|---|---|---|
| 🔴 effectively-public | 100% | Die Ressource ist effektiv öffentlich aus dem Internet. |
| 🟠 restricted-public | 40% | Die Ressource ist öffentlich, aber es gibt eine Einschränkung wie eine Sicherheitsgruppe. |
| 🟠 unrestricted-private | 30% | Die Ressource ist privat, aber uneingeschränkt, wie eine offene Sicherheitsgruppe. |
| 🟠 launch-public | 10% | Dies sind Ressourcen, die andere Ressourcen als öffentlich starten können. Zum Beispiel eine Auto-Scaling-Gruppe oder ein Subnet. |
| 🟢 restricted | 0% | Die Ressource ist eingeschränkt. |
| 🔵 unknown | - | Die Ressource konnte nicht überprüft werden. |
Zugriff bewertet die Ressourcen-Richtlinienebene. MetaHub überprüft jede verfügbare Richtlinie, einschließlich: IAM-verwaltete Richtlinien, IAM-Inline-Richtlinien, Ressourcenrichtlinien, Bucket-ACLs und alle Verknüpfungen mit anderen Ressourcen wie IAM-Rollen, deren Richtlinien ebenfalls analysiert werden. Eine uneingeschränkte Richtlinie ist nicht nur ein Problem für sich selbst, sie wirkt sich auch auf jede andere Ressource aus, die sie verwendet.
| Mögliche Status | Wert | Beschreibung |
|---|---|---|
| 🔴 unrestricted | 100% | Der Prinzipal ist uneingeschränkt, ohne Bedingung oder Einschränkung. |
| 🔴 untrusted-principal | 70% | Der Prinzipal ist ein AWS-Konto, das nicht zu Ihren vertrauenswürdigen Konten gehört. |
| 🟠 unrestricted-principal | 40% | Der Prinzipal ist nicht eingeschränkt, mit einem Platzhalter definiert. Es könnte Bedingungen geben, die ihn einschränken, oder andere Einschränkungen wie s3 public blocks. |
| 🟠 cross-account-principal | 30% | Der Prinzipal stammt von einem anderen AWS-Konto. |
| 🟠 unrestricted-actions | 30% | Die Aktionen sind mit Platzhaltern definiert. |
| 🟠 dangerous-actions | 30% | Einige gefährliche Aktionen sind als Teil dieser Richtlinie definiert. |
| 🟠 unrestricted-service | 10% | Die Richtlinie erlaubt einen AWS-Dienst als Prinzipal ohne Einschränkung. |
| 🟢 restricted | 0% | Die Richtlinie ist eingeschränkt. |
| 🔵 unknown | - | Die Richtlinie konnte nicht überprüft werden. |
Verschlüsselung bewertet die verschiedenen Verschlüsselungsebenen basierend auf jedem Ressourcentyp. Beispielsweise wird für einige Ressourcen bewertet, ob sowohl die Verschlüsselung at_rest als auch in_transit aktiviert sind.
| Mögliche Status | Wert | Beschreibung |
|---|---|---|
| 🔴 unverschlüsselt | 100% | Die Ressource ist nicht vollständig verschlüsselt. |
| 🟢 verschlüsselt | 0% | Die Ressource ist vollständig verschlüsselt, einschließlich aller ihrer Verbindungen. |
| 🔵 unbekannt | - | Die Verschlüsselung der Ressource konnte nicht überprüft werden. |
Status bewertet den Status der betroffenen Ressource hinsichtlich Anbindung oder Funktion. Zum Beispiel für eine EC2-Instanz bewerten wir, ob die Ressource läuft, gestoppt oder beendet ist, aber für Ressourcen wie EBS-Volumes und Sicherheitsgruppen bewerten wir, ob diese Ressourcen an eine andere Ressource angebunden sind.
| Mögliche Statuswerte | Wert | Beschreibung |
|---|---|---|
| 🟠 angebunden | 100% | Die Ressource unterstützt Anbindung und ist angebunden. |
| 🟠 laufend | 100% | Die Ressource unterstützt Laufbetrieb und läuft. |
| 🟠 aktiviert | 100% | Die Ressource unterstützt Aktivierung und ist aktiviert. |
| 🟢 nicht angebunden | 0% | Die Ressource unterstützt Anbindung und ist nicht angebunden. |
| 🟢 nicht laufend | 0% | Die Ressource unterstützt Laufbetrieb und läuft nicht. |
| 🟢 nicht aktiviert | 0% | Die Ressource unterstützt Aktivierung und ist nicht aktiviert. |
| 🔵 unbekannt | - | Die Ressource konnte nicht auf den Status überprüft werden. |
Umgebung bewertet die Umgebung, in der die betroffene Ressource ausgeführt wird. Standardmäßig definiert MetaHub 3 Umgebungen: production, staging und development, Sie können diese jedoch nach Bedarf hinzufügen, entfernen oder ändern. MetaHub bewertet die Umgebung anhand der Tags der betroffenen Ressource, der Konto-ID oder des Konto-Alias. Sie können Ihre eigenen Umgebungsdefinitionen und -strategien in der Konfigurationsdatei festlegen (Siehe Konfiguration anpassen).
| Mögliche Status | Wert | Beschreibung |
|---|---|---|
| 🟠 Produktion | 100% | Es handelt sich um eine Produktionsressource. |
| 🟢 Staging | 30% | Es handelt sich um eine Staging-Ressource. |
| 🟢 Entwicklung | 0% | Es handelt sich um eine Entwicklungsressource. |
| 🔵 Unbekannt | - | Die Ressource konnte nicht auf die Umgebung überprüft werden. |
Application bewertet die Anwendung, zu der die betroffene Ressource gehört. MetaHub nutzt die AWS myApplications-Funktion, die auf dem Tag awsApplication basiert. Sie können diese Funktionalität jedoch basierend auf Ihrem Kontext erweitern, z. B. durch die Definition anderer Tags, die Sie zur Kennzeichnung von Anwendungen oder Diensten verwenden (wie Service oder andere), oder durch die Verwendung von Konto-ID oder Alias. Sie können Ihre Anwendungsdefinitionen und -strategie in der Konfigurationsdatei festlegen (Siehe Anpassen der Konfiguration).
| Mögliche Status | Wert | Beschreibung |
|---|---|---|
| 🔵 unknown | - | Die Ressource konnte nicht auf Anwendung überprüft werden. |
Owner konzentriert sich auf die Besitzererkennung. Es kann den Besitzer der betroffenen Ressource auf verschiedene Weise ermitteln. Diese Informationen können verwendet werden, um einen Sicherheitsfund automatisch dem richtigen Besitzer zuzuweisen, ihn zu eskalieren oder Entscheidungen auf dieser Grundlage zu treffen. Eine automatisierte Möglichkeit, den Besitzer einer Ressource zu ermitteln, ist für Sicherheitsteams von entscheidender Bedeutung. Sie ermöglicht es ihnen, sich auf die kritischsten Probleme zu konzentrieren und diese so schnell wie möglich den richtigen Personen in automatisierten Arbeitsabläufen zuzuweisen. Sie können Ihre Besitzerdefinitionen und -strategie in der Konfigurationsdatei festlegen (siehe Anpassen der Konfiguration).
| Mögliche Status | Wert | Beschreibung |
|---|---|---|
| 🔵 unbekannt | - | Die Ressource konnte nicht auf Besitzer überprüft werden. |
Im Rahmen der Berechnung des Auswirkungs-Scores bewerten wir auch die Gesamtzahl der Sicherheitsergebnisse und deren Schweregrade, die die Ressource betreffen. Wir verwenden die folgende Formel, um diese Metrik zu berechnen:```sh (SUM of all (Finding Severity / Highest Severity) with a maximum of 1)
Zum Beispiel, wenn die betroffene Ressource zwei Ergebnisse hat, die sie betreffen, eines mit `HIGH` und ein weiteres mit `LOW` Schweregrad, wird der **Impact Findings Score** wie folgt sein:```sh
SUM(HIGH (3) / CRITICAL (4) + LOW (0.5) / CRITICAL (4)) = 0.875
MetaHub liest Ihre Sicherheitsergebnisse aus AWS Security Hub oder einem beliebigen ASFF-kompatiblen Sicherheitsscanner. Anschließend fragt es die betroffenen Ressourcen direkt im betroffenen Konto ab, um zusätzlichen Kontext zu liefern. Basierend auf diesem Kontext berechnet es seine Auswirkungen. Schließlich generiert es verschiedene Ausgaben basierend auf Ihren Anforderungen.
Einige Anwendungsfälle für MetaHub sind:
MetaHub verwendet Konfigurationsdateien, mit denen Sie das Verhalten einiger Prüfungen, Standardfilter und mehr anpassen können. Die Konfigurationsdateien befinden sich in lib/config/.
Dinge, die Sie anpassen können:
lib/config/configuration.py: Diese Datei enthält die Standardkonfiguration für MetaHub. Sie können die Standardfilter, die Standardausgabemodi, die Umgebungsdefinitionen und mehr ändern.
lib/config/impact.py: Diese Datei enthält die Werte und ihre Gewichtungen für die Kriterien der Auswirkungsformel. Sie können die Werte und Gewichtungen nach Ihren Bedürfnissen anpassen.
lib/config/reources.py: Diese Datei enthält Definitionen für jeden Ressourcentyp, z. B. welche CloudTrail-Ereignisse zu suchen sind.
MetaHub ist ein Python3-Programm. Sie müssen Python3 auf Ihrem System installiert haben und die erforderlichen Python-Module, die in der Datei requirements.txt beschrieben sind.
Die Anforderungen können manuell (mit pip3) oder unter Verwendung einer virtuellen Python-Umgebung (empfohlene Methode) auf Ihrem System installiert werden.
git clone [email protected]:gabrielsoltz/metahub.gitcd metahubpython3 -m venv venv/metahubsource venv/metahub/bin/activatepip3 install -r requirements.txt./metahub -hdeactivateBeim nächsten Mal benötigen Sie nur die Schritte 4 und 6, um das Programm zu verwenden.
Alternativ können Sie dieses Tool mit Docker ausführen.
MetaHub ist auch als Docker-Image verfügbar. Sie können es direkt aus dem öffentlichen Docker-Image ausführen oder lokal erstellen.
Die verfügbaren Tags für MetaHub-Container sind die folgenden:
latest: synchron mit dem Master-Branch<x.y.z>: Die Releases finden Sie hierstable: Dieser Tag zeigt immer auf die neueste Version.Um aus der öffentlichen Registry zu laufen, können Sie den folgenden Befehl ausführen:```sh docker run -ti public.ecr.aws/n2p8q5p4/metahub:latest ./metahub -h
## AWS-Anmeldeinformationen und Docker
Wenn Sie bereits auf der AWS-Hostmaschine angemeldet sind, können Sie dieselben Anmeldeinformationen nahtlos in einem Docker-Container verwenden. Dies erreichen Sie, indem Sie entweder die erforderlichen Umgebungsvariablen an den Container übergeben oder die Anmeldeinformationsdatei einbinden.
Zum Beispiel können Sie den folgenden Befehl ausführen:```sh
docker run -e AWS_DEFAULT_REGION -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_SESSION_TOKEN -ti public.ecr.aws/n2p8q5p4/metahub:latest ./metahub -h
Andererseits, wenn Sie auf dem Host-Rechner nicht angemeldet sind, müssen Sie sich innerhalb des Containers erneut anmelden.
Oder Sie können es auch lokal bauen:```sh git clone [email protected]:gabrielsoltz/metahub.git cd metahub docker build -t metahub . docker run -ti metahub ./metahub -h
# Mit Lambda ausführen
**MetaHub** ist Lambda/Serverless bereit! Sie können MetaHub direkt auf einer AWS Lambda-Funktion ausführen, ohne dass zusätzliche Infrastruktur erforderlich ist.
Die Ausführung von MetaHub in einer Lambda-Funktion ermöglicht es Ihnen, die Ausführung basierend auf Ihren definierten Triggern zu automatisieren. Beispielsweise können Sie:
- Die MetaHub Lambda-Funktion jedes Mal auslösen, wenn ein neuer Sicherheitsbefund vorliegt, um diesen Befund in AWS Security Hub anzureichern.
- Die MetaHub Lambda-Funktion jedes Mal auslösen, wenn ein neuer Sicherheitsbefund zur Unterdrückung basierend auf Kontext vorliegt.
- Die MetaHub Lambda-Funktion auslösen, um den betroffenen Eigentümer eines Sicherheitsbefunds basierend auf Kontext zu identifizieren und ihn mit Ihren internen Systemen zuzuweisen.
- Die MetaHub Lambda-Funktion auslösen, um ein Ticket mit angereichertem Kontext zu erstellen.
## Lambda bereitstellen
Der Terraform-Code für die Bereitstellung der Lambda-Funktion ist im Ordner `terraform/` enthalten.
Führen Sie einfach die folgenden Befehle aus:```sh
cd terraform
terraform init
terraform apply
Der Code erstellt eine Zip-Datei für den Lambda-Code und eine Zip-Datei für die Python-Abhängigkeiten, die wir als Lambda-Layer verwenden werden. Außerdem werden die Lambda-Funktion und alle erforderlichen Ressourcen erstellt.
Der Terraform-Code erstellt außerdem eine benutzerdefinierte Security Hub-Aktion und eine EventBridge-Regel, um die Lambda-Funktion auszulösen, wenn die benutzerdefinierte Aktion ausgeführt wird. Siehe unten.
Sie können die MetaHub-Optionen für Ihre Lambda-Funktion anpassen, indem Sie die Datei lib/lambda.py bearbeiten. Sie können die Standardoptionen für MetaHub ändern, wie z. B. die Filter, die Meta*-Optionen und mehr.
Terraform erstellt die minimal erforderlichen Berechtigungen, damit die Lambda-Funktion lokal (im selben Konto) ausgeführt werden kann. Wenn Ihre Lambda-Funktion eine Rolle in anderen Konten annehmen soll (z. B. benötigen Sie dies, wenn Sie die Lambda-Funktion im Security Hub-Masterkonto ausführen, das Erkenntnisse aus anderen Konten aggregiert), müssen Sie die anzunehmende Rolle angeben, indem Sie die Option --mh-assume-role in der Lambda-Funktionskonfiguration hinzufügen (siehe vorheriger Schritt) und die entsprechende Richtlinie hinzufügen, damit die Lambda-Funktion diese Rolle in der Lambda-Rolle annehmen kann.
MetaHub kann als benutzerdefinierte Security Hub-Aktion ausgeführt werden. Dadurch können Sie MetaHub direkt aus der Security Hub-Konsole für einen ausgewählten Befund oder für eine ausgewählte Gruppe von Befunden ausführen.
Die benutzerdefinierte Aktion löst dann eine Lambda-Funktion aus, die MetaHub für die ausgewählten Befunde ausführt.
Wenn Sie die Lambda-Funktion über die benutzerdefinierte Security Hub-Aktion auslösen, liest die Lambda-Funktion die ausgewählten Befunde für ihren Kontext und wird für jeden Befund einmal ausgeführt. Standardmäßig werden keine Maßnahmen an den Befunden ergriffen, aber Sie können dieses Verhalten ändern. Siehe Lambda-Verhalten anpassen.
Die benutzerdefinierte Security Hub-Aktion wird als Teil des Terraform-Codes bereitgestellt. Weitere Informationen finden Sie unter Bereitstellen der Lambda-Funktion.
Stellen Sie sicher, dass Sie AWS-Anmeldeinformationen auf Ihrem lokalen Rechner (oder von wo aus Sie MetaHub ausführen werden) eingerichtet haben.
Sie können zum Beispiel die Option aws configure verwenden.```sh
aws configure
Oder Sie können Ihre Anmeldeinformationen in die Umgebung exportieren.```sh
export AWS_DEFAULT_REGION="us-east-1"
export AWS_ACCESS_KEY_ID= "ASXXXXXXX"
export AWS_SECRET_ACCESS_KEY= "XXXXXXXXX"
export AWS_SESSION_TOKEN= "XXXXXXXXX"
Wenn Sie MetaHub für ein einzelnes AWS-Kontoszenario ausführen (AWS Security Hub aggregiert keine Erkenntnisse aus verschiedenen Konten), benötigen Sie keine zusätzlichen Optionen; MetaHub verwendet die Anmeldeinformationen aus Ihrer Umgebung. Falls Ihr IAM-Design dies erfordert, ist es dennoch möglich, sich anzumelden und eine Rolle in demselben Konto zu übernehmen, in dem Sie angemeldet sind. Verwenden Sie einfach die Optionen --sh-assume-role, um die Rolle anzugeben, und --sh-account mit derselben AWS-Konto-ID, in der Sie angemeldet sind.
--sh-region: Die AWS-Region, in der Security Hub ausgeführt wird. Wenn Sie keine Region angeben, wird die in Ihrer Umgebung konfigurierte verwendet. Wenn Sie die AWS Security Hub Cross-Region-Aggregation verwenden, sollten Sie diese Region als --sh-region-Option angeben, um alle Erkenntnisse gemeinsam abrufen zu können.
--sh-account und --sh-assume-role: Die AWS-Konto-ID, in der Security Hub ausgeführt wird, und die AWS-IAM-Rolle, die in diesem Konto übernommen werden soll. Diese Optionen sind hilfreich, wenn Sie in einem anderen AWS-Konto angemeldet sind als dem, in dem AWS Security Hub ausgeführt wird, oder wenn AWS Security Hub in einer Umgebung mit mehreren AWS-Konten betrieben wird. Beide Optionen müssen zusammen verwendet werden. Die angegebene Rolle muss über ausreichende Berechtigungen verfügen, um Erkenntnisse in AWS Security Hub abzurufen und zu aktualisieren (falls erforderlich). Wenn Sie keine --sh-account angeben, nimmt MetaHub das Konto an, in dem Sie angemeldet sind.
--sh-profile: Sie können auch Ihren AWS-Profilnamen angeben, der für AWS Security Hub verwendet werden soll. Bei Verwendung dieser Option müssen Sie --sh-account oder --sh-assume-role nicht angeben, da MetaHub die Anmeldeinformationen aus dem Profil verwendet. Wenn Sie --sh-account und --sh-assume-role verwenden, haben diese Optionen Vorrang vor --sh-profile.
Dies ist die minimale IAM-Richtlinie, die Sie benötigen, um aus AWS Security Hub zu lesen und zu schreiben. Wenn Sie Ihre Erkenntnisse nicht mit MetaHub aktualisieren möchten, können Sie die Aktion securityhub:BatchUpdateFindings entfernen.```sh
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"security hub:GetFindings",
"security hub:ListFindingAggregators",
"security hub:BatchUpdateFindings",
"iam:ListAccountAliases"
],
"Resource": [
"*"
]
}
]
}
# Konfiguration des Kontexts
Wenn Sie MetaHub für ein Multi-AWS-Account-Setup ausführen (AWS Security Hub aggregiert Erkenntnisse aus mehreren AWS-Konten), müssen Sie die Rolle angeben, die für Kontextabfragen übernommen werden soll, da sich die betroffenen Ressourcen nicht in demselben AWS-Konto befinden wie die AWS Security Hub-Erkenntnisse. Die Option `--mh-assume-role` wird verwendet, um direkt mit den betroffenen Ressourcen im betroffenen Konto zu verbinden. Diese Rolle muss über ausreichende Berechtigungen verfügen, um Ressourcen beschreiben zu können.
## IAM-Richtlinie für den Kontext
Die für den Kontext erforderliche Mindestrichtlinie umfasst die verwaltete Richtlinie `arn:aws:iam::aws:policy/SecurityAudit` und die folgenden Aktionen:
- `tag:GetResources`
- `lambda:GetFunction`
- `lambda:GetFunctionUrlConfig`
- `cloudtrail:LookupEvents`
- `account:GetAlternateContact`
- `organizations:DescribeAccount`
- `iam:ListAccountAliases`
# Eingaben
MetaHub kann Sicherheitserkenntnisse mithilfe seiner API direkt aus AWS Security Hub lesen. Wenn Sie Security Hub nicht verwenden, können Sie jeden ASFF-kompatiblen Scanner nutzen. Die meisten Cloud-Sicherheitsscanner unterstützen das ASFF-Format wie Prolwer, Steampipe, Trivy und weitere.
Wenn Sie aus einer ASFF-Eingabedatei lesen möchten, müssen Sie die Option (`--inputs file-asff`) verwenden und den Pfad zur Datei angeben. Sie können mehrere Dateien durch ein Leerzeichen getrennt angeben:```sh
./metahub.py --inputs file-asff --input-asff path/to/the/file.json.asff path/to/the/file2.json.asff
Sie können auch AWS Security Hub-Funde mit ASFF-Eingabedateien kombinieren, indem Sie beide Eingaben angeben (--inputs file-asff securityhub). MetaHub verarbeitet alle Funde zusammen und liefert eine einzige Ausgabe.:```sh
./metahub.py --inputs file-asff securityhub --input-asff path/to/the/file.json.asff
Wenn Sie eine Datei als Eingabe verwenden, können Sie die Option `--sh-filters` nicht zum Filtern von Ergebnissen verwenden, da diese Option die AWS API zum Filtern benötigt. Sie können die Optionen `--update-findings` oder `--enrich-findings` nicht verwenden, da diese Ergebnisse nicht im AWS Security Hub vorhanden sind. Wenn Sie gleichzeitig aus beiden Quellen lesen, werden nur die Ergebnisse aus dem AWS Security Hub aktualisiert.
MetaHub implementiert auch einige **Reparaturmechanismen** für das ASFF-Format, wenn es nicht korrekt formatiert ist. Dies ist ein Ansatz nach bestem Bemühen, das ASFF so nützlich wie möglich zu machen, aber es ist nicht perfekt und muss im Quellscanner behoben werden.
- Wenn der Schlüssel `Region` in den Ressourcen und auf der Root-Ebene fehlt, berechnet MetaHub die Region auf Basis der ARN der betroffenen Ressource.
- Wenn die ASFF-Datei den ASFF-Ressourcentyp nicht korrekt setzt, berechnet MetaHub ihn anhand der ARN der betroffenen Ressource mithilfe der Bibliothek [aws-arn](https://github.com/gabrielsoltz/aws-arn)
- Wenn ein anderes Feld wie `SeverityLabel`, `Workflow`, `RecordState`, `Compliance`, `Id`, `ProductArn` oder `StandardsControlArn` fehlt, setzt MetaHub diese auf `Unknown`.
# Ausgaben
**MetaHub** kann verschiedene programmatische und visuelle Ausgaben generieren. Standardmäßig sind alle Ausgabemodi aktiviert: `json-short`, `json-full`, `json-statistics`, `json-inventory`, `html`, `csv` und `xlsx`. Wenn Sie nur einen bestimmten Ausgabemodus generieren möchten, können Sie die Option `--output-modes` mit dem gewünschten Ausgabemodus verwenden. Die Ausgaben werden im Ordner `outputs/` mit dem Ausführungsdatum gespeichert.
Zum Beispiel, wenn Sie nur die Ausgabe `json-short` generieren möchten, können Sie:```sh
./metahub.py --output-modes json-short
Wenn Sie json-short, json-full und html-Ausgaben generieren möchten, können Sie Folgendes verwenden:```sh
./metahub.py --output-modes json-short json-full html
**MetaHub** organisiert die Sicherheitsergebnisse, die dieselbe Ressource betreffen, alle zusammen unter dem Schlüssel `findings`, um Schattenbildung (wenn zwei Überprüfungen auf dasselbe Problem verweisen, aber eine allgemeiner als die andere) und Duplizierung (wenn Sie mehr als einen Scanner verwenden und dasselbe Problem von mehr als einem erhalten) zu vermeiden. Sie können dieses Verhalten klar in den Ausgaben `json-short`, `json-full` und `html` sehen.
- [JSON](#json)
- [HTML](#html)
- [CSV](#csv)
- [XLSX](#xlsx)
- [SQLite](#sqlite)
## JSON
> :info: Um eine JSON-Ausgabe interaktiv zu erkunden, können Sie das Tool [fx](https://github.com/antonmedv/fx) verwenden.
### JSON-Full
Zeigt die betroffene Ressource anhand ihrer ARN als Schlüssel und die Ergebnisse, die sie betreffen, als Liste unter dem Schlüssel `findings`. Zusätzlich zu den Ergebnissen erhalten Sie auch die folgenden Schlüssel: `ResourceType`, `Region`, `AwsAccountId`, `associations`, `config`, `tags`, `account`, `cloudtrail` und `impact`.```json
"arn:aws:ec2:eu-west-1:1234567890:instance/i-0a40b2be25dbac0ac": { --> The affected resource ARN
"findings": [ --> The findings affecting the resource
{
"EC2 instances should use Instance Metadata Service Version 2 (IMDSv2)": { --> The finding title
"SeverityLabel": "HIGH", --> The finding severity label
"Workflow":{ --> The finding workflow
"Status": "NEW",
},
"RecordState": "ACTIVE", --> The finding record state
"Compliance":{ --> The finding compliance
"Status": "FAILED",
},
"Id": "arn:aws:securityhub:eu-west-1:123456789012:security-control/EC2.8/finding/a1d4f19f-453e-4c3c-b486-8443c73e84f1",
"ProductArn": "arn:aws:securityhub:eu-west-1::product/aws/securityhub",
}
},
{"EC2 instances should be managed by AWS Systems Manager": {...}}, --> Another finding title
{"EC2 instances should not have a public IPv4 address": {...}} --> Another finding title
],
"ResourceType": "AwsEc2Instance", --> The affected resource type
"Region": "eu-west-1", --> The affected resource region
"AwsAccountId": "1234567890", --> The affected resource account id
"associations": { --> The associations of the affected resource
"security_groups": {}, --> The security groups associated with the affected resource
"iam_roles": {}, --> The IAM roles associated with the affected resource
"volumes": {}, --> The volumes associated with the affected resource
"autoscaling_groups": {}, --> The autoscaling groups associated with the affected resource
"vpcs": {}, --> The VPCs associated with the affected resource
"subnets": {}, --> The subnets associated with the affected resource
},
"config": { --> The configuration of the affected resource (based on it's type)
"public_ip": "200.200.200.200", --> The public IP of the affected resource, if any
"private_ip": "10.10.10.10", --> The private IP of the affected resource, if any
"key": "ssh-key", --> The key used for the affected resource, if any
"metadata_options": { --> The metadata options of the affected resource, if any
"State": "applied",
"HttpTokens": "required",
"HttpPutResponseHopLimit": 1,
"HttpEndpoint": "enabled",
"HttpProtocolIpv6": "disabled",
"InstanceMetadataTags": "disabled"
},
},
"tags": { --> The tags of the affected resource
"Name": "test", --> The tag key and value
"Env": "prod",
"awsApplication": "arn:aws:resource-groups:eu-west-1:1234567890:group/app1/0c8vpbjkzeeffsz2cqgxpae7b2"
},
"account": { --> The account of the affected resource
"Alias": "prod", --> The account alias
"AlternateContact": {}, --> The alternate contact of the account, if any
"Organizations": { --> The organization of the account, if any
"Id": "o-1234567890",
"Arn": "arn:aws:organizations::1234567890:organization/o-1234567890/o-1234567890",
"MasterAccountId": "1234567890",
"MasterAccountArn": "arn:aws:organizations::1234567890:account/o-1234567890/1234567890",
"MasterAccountEmail": "",
"Details": {
"ParentId": "p-k1234567890",
"ParentType": "ROOT",
"OU": "ROOT",
"Policies": { --> The policies of the account, if any
"p-FullAWSAccess": {...} --> The policy name and policy
}
}
},
},
"cloudtrail": { --> The CloudTrail events affecting the affected resource
"RunInstances": { --> The CloudTrail event name
"Username": "test", --> The username of the event, if any
"EventTime": "2021-01-01T00:00:00Z",
"EventId": "12345678-1234-1234-1234-123456789012",
}
},
"impact": { --> The impact of the affected resource
"exposure": {...}, --> The exposure impact
"access": {...}, --> The access impact
"encryption": {...}, --> The encryption impact
"status": {...}, --> The status impact
"environment": {...}, --> The environment impact
"application": {...}, --> The application impact
"owner": {...}, --> The owner impact
"findings": {...}, --> The findings impact
"score": {...} --> The total impact score
}
}
Zeigt die betroffene Ressource unter Verwendung ihrer ARN als Schlüssel und die sie betreffenden Erkenntnisse als Liste unter dem Schlüssel findings. Zusätzlich zu den Erkenntnissen erhalten Sie auch die folgenden Schlüssel: ResourceType, Region, AwsAccountId, associations, config, tags, account, cloudtrail und impact.```json
"arn:aws:ec2:eu-west-1:1234567890:instance/i-0a40b2be25dbac0ac": { --> The affected resource ARN
"findings": [ --> The findings affecting the resource
"EC2 instances should use Instance Metadata Service Version 2 (IMDSv2)", --> The finding title
"EC2 instances should be managed by AWS Systems Manager", --> The finding title
"EC2 instances should not have a public IPv4 address" --> The finding title
],
"ResourceType": "AwsEc2Instance", --> The affected resource type
"Region": "eu-west-1", --> The affected resource region
"AwsAccountId": "1234567890", --> The affected resource account id
"associations": { --> The associations of the affected resource
"security_groups": {}, --> The security groups associated with the affected resource
"iam_roles": {}, --> The IAM roles associated with the affected resource
"volumes": {}, --> The volumes associated with the affected resource
"autoscaling_groups": {}, --> The autoscaling groups associated with the affected resource
"vpcs": {}, --> The VPCs associated with the affected resource
"subnets": {}, --> The subnets associated with the affected resource
},
"config": { --> The configuration of the affected resource (based on it's type)
"public_ip": "200.200.200.200", --> The public IP of the affected resource, if any
"private_ip": "10.10.10.10", --> The private IP of the affected resource, if any
"key": "ssh-key", --> The key used for the affected resource, if any
"metadata_options": { --> The metadata options of the affected resource, if any
"State": "applied",
"HttpTokens": "required",
"HttpPutResponseHopLimit": 1,
"HttpEndpoint": "enabled",
"HttpProtocolIpv6": "disabled",
"InstanceMetadataTags": "disabled"
},
},
"tags": { --> The tags of the affected resource
"Name": "test", --> The tag key and value
"Env": "prod",
"awsApplication": "arn:aws:resource-groups:eu-west-1:1234567890:group/app1/0c8vpbjkzeeffsz2cqgxpae7b2"
},
"account": { --> The account of the affected resource
"Alias": "prod", --> The account alias
"AlternateContact": {}, --> The alternate contact of the account, if any
"Organizations": { --> The organization of the account, if any
"Id": "o-1234567890",
"Arn": "arn:aws:organizations::1234567890:organization/o-1234567890/o-1234567890",
"MasterAccountId": "1234567890",
"MasterAccountArn": "arn:aws:organizations::1234567890:account/o-1234567890/1234567890",
"MasterAccountEmail": "",
"Details": {
"ParentId": "p-k1234567890",
"ParentType": "ROOT",
"OU": "ROOT",
"Policies": { --> The policies of the account, if any
"p-FullAWSAccess": {...} --> The policy name and policy
}
}
},
},
"cloudtrail": { --> The CloudTrail events affecting the affected resource
"RunInstances": { --> The CloudTrail event name
"Username": "test", --> The username of the event, if any
"EventTime": "2021-01-01T00:00:00Z",
"EventId": "12345678-1234-1234-1234-123456789012",
}
},
"impact": { --> The impact of the affected resource
"exposure": {...}, --> The exposure impact
"access": {...}, --> The access impact
"encryption": {...}, --> The encryption impact
"status": {...}, --> The status impact
"environment": {...}, --> The environment impact
"application": {...}, --> The application impact
"owner": {...}, --> The owner impact
"findings": {...}, --> The findings impact
"score": {...} --> The total impact score
}
}
### JSON-Inventory
Zeigt eine Liste aller Ressourcen mit ihrer ARN.```json
[
"arn:aws:sagemaker:us-east-1:ofuscated:notebook-instance/obfuscated",
"arn:aws:sagemaker:eu-west-1:ofuscated:notebook-instance/obfuscated"
]
Zeigt Statistiken für jedes Feld/jeden Wert. In der Ausgabe sehen Sie jedes Feld/jeden Wert und die Anzahl der Vorkommen; zum Beispiel zeigt die folgende Ausgabe Statistiken für sechs Funde.```json { "Title": { "SageMaker.1 Amazon SageMaker notebook instances should not have direct internet access": 2, "SageMaker.2 SageMaker notebook instances should be launched in a custom VPC": 2, "SageMaker.3 Users should not have root access to SageMaker notebook instances": 2 }, "SeverityLabel": { "HIGH": 6 }, "Workflow": { "NEW": 6 }, "RecordState": { "ACTIVE": 6 }, "Compliance": { "FAILED": 6 }, "ProductArn": { "arn:aws:security hub:eu-west-1::product/aws/security hub": 3, "arn:aws:security hub:us-east-1::product/aws/security hub": 3 }, "ResourceType": { "AwsSageMakerNotebookInstance": 6 }, "AwsAccountId": { "obfuscated": 6 }, "Region": { "eu-west-1": 3, "us-east-1": 3 }, "ResourceId": { "arn:aws:sagemaker:eu-west-1:ofuscated:notebook-instance/obfuscated": 3, "arn:aws:sagemaker:us-east-1:ofuscated:notebook-instance/obfuscated": 3 } }
## HTML
Sie können umfangreiche HTML-Berichte Ihrer Ergebnisse erstellen und dabei Ihren Kontext einfließen lassen.
HTML-Berichte sind auf vielfältige Weise interaktiv:
- Sie können Spalten hinzufügen/entfernen.
- Sie können nach beliebigen Spalten sortieren und filtern.
- Sie können nach beliebigen Spalten automatisch filtern.
- Sie können Ergebnisse gruppieren/entgruppieren.
- Sie können diese Daten auch als xlsx, CSV, HTML und JSON herunterladen.
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/6190/21d785d2413698ed7cb3e9dc7e9b51dc6550395a598d777abc9fc358f8a23573.png" alt="HTML-Beispiel"/>
</p>
## CSV
Sie können CSV-Berichte Ihrer Ergebnisse erstellen und dabei Ihren Kontext einfließen lassen.
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/6190/66f15350123702e1cc317e47938401853bdcb1d86dad0ad4e48e73f15e00dd76.png" alt="CSV-Beispiel"/>
</p>
## XLSX
Ähnlich wie CSV, aber mit mehr Formatierungsoptionen.
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/6190/953a77917dc5b06e5185e6cb882ba7e711d785861e184599f10cd472efc42db9.png" alt="XLSX-Beispiel"/>
</p>
## Anpassung von HTML-, CSV- oder XLSX-Ausgaben
Sie können festlegen, welche Kontextschlüssel als Spalten für Ihre HTML-, CSV- und XLSX-Ausgaben aufgeschlüsselt werden sollen, indem Sie die Optionen `--output-tag-columns` und `--output-config-columns` (als Liste von Spalten) verwenden. Wenn die von Ihnen angegebenen Schlüssel für die betroffene Ressource nicht vorhanden sind, bleiben sie leer. Sie können diese Spalten auch standardmäßig in der Konfigurationsdatei konfigurieren (Siehe [Anpassung der Konfiguration](#customizing-configuration)).
Beispielsweise können Sie eine HTML-Ausgabe mit Tags generieren und Ihrem Bericht die Spalten „Owner“ und „Environment“ hinzufügen, indem Sie die folgenden Optionen verwenden:```sh
./metahub --output-modes html --output-tag-columns Owner Environment
MetaHub kann die Ergebnisse und den Kontext in einer SQLite-Datenbank speichern. Diese Datenbank kann für weitere Analysen, Berichte und die Integration mit anderen Tools wie Powerpipe verwendet werden. Die Datenbank wird im Ordner outputs/ mit dem Ausführungsdatum und der Erweiterung .db gespeichert.
Sie können die von MetaHub generierte SQLite-Datenbank mit Powerpipe verwenden. Sie finden das MetaHub PowerPipe-Modul im Ordner powerpipe/.


Um es zu verwenden, müssen Sie Powerpipe auf Ihrem System installiert haben.
Nach der Installation können Sie den folgenden Befehl ausführen:```sh powerpipe server --database sqlite:../outputs/metahub-20240331-182942.db
### Erstellen Sie Ihre eigenen Dashboards
Das Erstellen von Dashboards mit Powerpipe ist sehr einfach und leistungsstark. Weitere Informationen finden Sie in der [Powerpipe-Dokumentation](https://powerpipe.io/docs).
Im Folgenden finden Sie die in der SQLite-Datenbank verfügbaren Tabellen.
#### Resources
| Column Name | Data Type | Description |
| ------------------------------- | --------- | ---------------------------------------------------------------------------------------------- |
| resource_arn | VARCHAR | Der Amazon-Ressourcenname (ARN) der Ressource, der als Primärschlüssel dient. |
| resource_type | VARCHAR | Der Typ der Ressource. |
| resource_region | VARCHAR | Die Region, in der sich die Ressource befindet. |
| resource_account_id | VARCHAR | Die mit der Ressource verknüpfte Konto-ID. Fremdschlüssel, der auf accounts(account_id) verweist. |
| resource_account_alias | VARCHAR | Der Alias des mit der Ressource verknüpften Kontos. |
| resource_tags | TEXT | Mit der Ressource verknüpfte Tags. |
| resource_exposure | VARCHAR | Die Expositionsstufe der Ressource. |
| resource_access | VARCHAR | Die Zugriffsstufe der Ressource. |
| resource_encryption | VARCHAR | Der Verschlüsselungsstatus der Ressource. |
| resource_status | VARCHAR | Der aktuelle Status der Ressource. |
| resource_application | VARCHAR | Die mit der Ressource verknüpfte Anwendung. |
| resource_environment | VARCHAR | Die Umgebung (z. B. Produktion, Staging), in der sich die Ressource befindet. |
| resource_owner | VARCHAR | Der Eigentümer der Ressource. |
| resource_score | INTEGER | Eine mit der Ressource verknüpfte Bewertung. |
| resource_findings_score | INTEGER | Eine Bewertung basierend auf mit der Ressource verknüpften Ergebnissen. |
| resource_findings_critical | INTEGER | Die Anzahl kritischer Ergebnisse. |
| resource_findings_high | INTEGER | Die Anzahl der Ergebnisse mit hoher Schwere. |
| resource_findings_medium | INTEGER | Die Anzahl der Ergebnisse mit mittlerer Schwere. |
| resource_findings_low | INTEGER | Die Anzahl der Ergebnisse mit niedriger Schwere. |
| resource_findings_informational | INTEGER | Die Anzahl der informativen Ergebnisse. |
#### Findings
| Column Name | Data Type | Description |
| ------------------------ | --------- | ------------------------------------------------------------------ |
| finding_id | VARCHAR | Die eindeutige Kennung für den Befund, die als Primärschlüssel dient. |
| finding_title | VARCHAR | Der Titel des Befunds. |
| finding_severity | VARCHAR | Die Schwere des Befunds. |
| finding_workflowstatus | VARCHAR | Der Workflow-Status des Befunds. |
| finding_recordstate | VARCHAR | Der Datensatzstatus des Befunds. |
| finding_compliancestatus | VARCHAR | Der Compliance-Status des Befunds. |
| finding_productarn | VARCHAR | Die ARN des Produkts, das den Befund generiert. |
| finding_resource_arn | VARCHAR | Die ARN der verknüpften Ressource. |
#### Accounts
| Column Name | Data Type | Description |
| ------------------------------- | --------- | ----------------------------------------------------------------------------- |
| account_id | INTEGER | Die eindeutige Kennung für das Konto, die als Primärschlüssel dient. |
| account_alias | VARCHAR | Der Alias des Kontos. |
| account_organizations_id | VARCHAR | Die ID der Organisation, zu der das Konto gehört. |
| account_organizations_arn | VARCHAR | Die ARN der Organisation, zu der das Konto gehört. |
| account_master_account_id | VARCHAR | Die ID des Master-Kontos, falls dieses Konto Teil einer AWS-Organisation ist. |
| account_master_account_email | VARCHAR | Die mit dem Master-Konto verknüpfte E-Mail-Adresse. |
| account_alternate_contact_type | VARCHAR | Die Art des alternativen Kontakts (z. B. Abrechnung, Sicherheit). |
| account_alternate_contact_name | VARCHAR | Der Name des alternativen Kontakts. |
| account_alternate_contact_email | VARCHAR | Die E-Mail-Adresse des alternativen Kontakts. |
| account_alternate_contact_phone | VARCHAR | Die Telefonnummer des alternativen Kontakts. |
| account_alternate_contact_title | VARCHAR | Der Titel des alternativen Kontakts. |
# Filters
Sie können die Sicherheitsergebnisse und Ressourcen, die Sie aus Ihrer Quelle erhalten, auf verschiedene Weise filtern und alle kombinieren, um genau das zu erhalten, wonach Sie suchen. Anschließend können Sie diese Filter wiederverwenden, um Automatisierungen, Warnungen, Berichte und mehr zu erstellen.
- [Security Hub Filtering](#security-hub-filtering)
- [Security Hub Filtering using YAML templates](#security-hub-filtering-using-yaml-templates)
- [Config Filters](#config-filters)
- [Tags Filters](#tags-filters)
- [Impact Filters](#impact-filters)
## Security Hub Filtering
MetaHub unterstützt das Filtern von AWS Security Hub-Ergebnissen in Form von `KEY=VALUE`-Filtern für AWS Security Hub über die Option `--sh-filters`, genauso wie Sie es mit der AWS CLI filtern würden, jedoch beschränkt auf den Vergleich `EQUALS`. Wenn Sie einen anderen Vergleich wünschen, verwenden Sie die Option `--sh-template` [Security Hub Filtering using YAML templates](#security-hub-filtering-using-yaml-templates).
Sie finden verfügbare Filter in der [AWS-Dokumentation](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/securityhub.html#SecurityHub.Client.get_findings)```sh
./metahub --sh-filters <KEY=VALUE>
Wenn Sie keine Filter angeben, werden Standardfilter angewendet: RecordState=ACTIVE WorkflowStatus=NEW
Durch die Übergabe von Filtern mit dieser Option werden die Standardfilter zurückgesetzt. Wenn Sie den Standardfiltern Filter hinzufügen möchten, müssen Sie diese zusätzlich zu den Standardfiltern angeben. Beispielsweise das Hinzufügen von SeverityLabel zu den Standardfiltern:```sh ./metahub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW
Wenn ein Wert Leerzeichen enthält, sollten Sie ihn in doppelten Anführungszeichen angeben: `"ProductName="Security Hub"`
Sie können Ihrer Abfrage so viele verschiedene Filter hinzufügen, wie Sie benötigen, und auch denselben Filtersuchschlüssel mit unterschiedlichen Werten verwenden:
Beispiele:
- Nach Schweregrad filtern (CRITICAL):```sh
./metaHub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW SeverityLabel=CRITICAL
- Filter nach Schweregrad und AWS-Konto:```sh
./metaHub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW SeverityLabel=CRITICAL AwsAccountId=1234567890
- Nach AWS-Ressourcentyp filtern:```sh
./metahub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW ResourceType=AwsEc2SecurityGroup
- Filtern nach Finding Id:```sh
./metahub --sh-filters Id="arn:aws:security hub:eu-west-1:01234567890:subscription/aws-foundational-security-best-practices/v/1.0.0/EC2.19/finding/01234567890-1234-1234-1234-01234567890"
## Security Hub-Filterung mit YAML-Vorlagen
**MetaHub** ermöglicht es Ihnen, komplexe Filter mit YAML-Dateien (Vorlagen) zu erstellen, die Sie bei Bedarf wiederverwenden können. YAML-Vorlagen lassen Sie Filter mit jedem von AWS Security Hub unterstützten Vergleichsoperator schreiben, wie "EQUALS' | 'PREFIX' | 'NOT_EQUALS' | 'PREFIX_NOT_EQUALS". Sie können Ihre YAML-Datei mit der Option `--sh-template <<FILE>>` aufrufen.
Beispiele finden Sie im Ordner [templates](https://github.com/gabrielsoltz/metahub/blob/main/templates)
- Filter mit der YAML-Vorlage default.yml:```sh
./metaHub --sh-template templates/default.yml
MetaHub unterstützt Config-Filter (und Assoziationen) mit KEY=VALUE, wobei der Wert nur True oder False sein kann, unter Verwendung der Option --mh-filters-config. Sie können beliebig viele Filter verwenden und diese durch Leerzeichen trennen. Wenn Sie mehr als einen Filter angeben, erhalten Sie alle Ressourcen, die allen Filtern entsprechen.
Config-Filter unterstützen nur True oder False Werte:
True oder mit Daten.False oder ohne Daten.Config-Filter werden nach AWS Security Hub Filtern ausgeführt:
--sh-filters (oder den Standard-Filtern) ab.--mh-filters-config entsprechen, also eine Teilmenge der Ressourcen aus Punkt 1.Beispiele:
ResourceType=AwsEc2SecurityGroup) mit AWS Security Hub Findings, die ACTIVE und NEW sind (RecordState=ACTIVE WorkflowStatus=NEW), nur wenn sie mit Netzwerkschnittstellen (network_interfaces=True) verknüpft sind:```sh
./metahub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW ResourceType=AwsEc2SecurityGroup --mh-filters-config network_interfaces=True- Hole alle S3 Buckets (`ResourceType=AwsS3Bucket`) nur wenn sie öffentlich sind (`public=True`):```sh
./metahub --sh-filters ResourceType=AwsS3Bucket --mh-filters-config public=False
MetaHub unterstützt Tags-Filter in der Form von KEY=VALUE, wobei KEY der Tag-Name und VALUE der Tag-Wert ist. Sie können beliebig viele Filter verwenden und diese durch Leerzeichen trennen. Die Angabe mehrerer Filter gibt Ihnen alle Ressourcen, die mindestens einem Filter entsprechen.
Tags-Filter werden nach den AWS Security Hub-Filtern ausgeführt:
--sh-filters angegebenen Filtern (oder den Standardfiltern) ab.--mh-filters-tags entsprechen, also eine Teilmenge der Ressourcen aus Punkt 1.Beispiele:
ResourceType=AwsEc2SecurityGroup) mit AWS Security Hub-Ergebnissen, die AKTIV und NEU sind (RecordState=ACTIVE WorkflowStatus=NEW), nur wenn sie mit einem Tag Environment und dem Wert Production getaggt sind:```sh
./metahub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW ResourceType=AwsEc2SecurityGroup --mh-filters-tags Environment=Production## Impact-Filter
**MetaHub** unterstützt **Impact-Filter**, mit denen Sie nach den von MetaHub berechneten [Impact-Schlüsseln](#impact) filtern können. Sie können beliebig viele Filter verwenden und sie durch Leerzeichen trennen. Wenn Sie mehr als einen Filter angeben, erhalten Sie alle Ressourcen, die **allen** Filtern entsprechen.
Beispiele:
- Filtern Sie alle Sicherheitsergebnisse, die Ressourcen mit einer als effectively-public berechneten Exposition betreffen:```sh
./metahub --mh-filters-impact exposure=effectively-public
# Security Hub Aktionen
## Aktualisieren des Workflow-Status
Sie können mit **MetaHub** den Workflow-Status Ihrer AWS Security Hub Findings (`NOTIFIED,` `NEW,` `RESOLVED,` `SUPPRESSED`) mit einem einzigen Befehl aktualisieren. Sie verwenden die Option `--update-findings`, um alle Findings aus Ihrer MetaHub-Abfrage zu aktualisieren. Das bedeutet, Sie können ein, zehn oder tausende Findings mit nur einem Befehl aktualisieren. Die AWS Security Hub API ist auf 100 Findings pro Aktualisierung begrenzt. Metahub teilt Ihre Ergebnisse in Blöcke von 100 Elementen auf, um diese Einschränkung zu umgehen und Ihre Findings unabhängig von der Anzahl zu aktualisieren.
Zum Beispiel habe ich mit dem folgenden Filter: `./metahub --sh-filters ResourceType=AwsSageMakerNotebookInstance RecordState=ACTIVE WorkflowStatus=NEW` zwei betroffene Ressourcen mit jeweils drei Findings gefunden, insgesamt also sechs Security Hub Findings.
Die Ausführung des folgenden Aktualisierungsbefehls wird den Workflow-Status dieser sechs Findings auf `NOTIFIED` mit einer Notiz setzen:```sh
./metahub --update-findings Workflow=NOTIFIED Note="Enter your ticket ID or reason here as a note that you will add to the finding as part of this update."
Die Option --update-findings fragt vor dem Aktualisieren Ihrer Erkenntnisse nach einer Bestätigung. Sie können diese Bestätigung überspringen, indem Sie die Option --no-actions-confirmation verwenden.
Sie können MetaHub verwenden, um Ihre AWS Security Hub Erkenntnisse mit Kontextausgaben unter Verwendung der Option --enrich-findings anzureichern. Das Anreichern Ihrer Erkenntnisse bedeutet, sie direkt in AWS Security Hub zu aktualisieren. MetaHub verwendet dafür das Feld UserDefinedFields.
Durch das direkte Anreichern Ihrer Erkenntnisse in AWS Security Hub können Sie Funktionen wie Insights und Filter nutzen, indem Sie die zusätzlichen Informationen verwenden, die zuvor in Security Hub nicht verfügbar waren.
Beispielsweise möchten Sie alle AWS Security Hub Erkenntnisse mit WorkflowStatus=NEW, RecordState=ACTIVE und ResourceType=AwsS3Bucket, die public=True sind, mit Kontextausgaben anreichern:```sh
./metahub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW ResourceType=AwsS3Bucket --mh-filters-checks public=True --enrich-findings
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/6190/93a45d119a712b11ae5f23ea68e3a1f7d71e0e9511df7d7dadd2b462fcde71a2.png" alt="update-findings" width="850"/>
</p>
Die Option `--enrich-findings` wird Sie um eine Bestätigung bitten, bevor sie Ihre Funde anreichert. Sie können diese Bestätigung überspringen, indem Sie die Option `--no-actions-confirmation` verwenden.
# Mitwirken
Sie können diesem Leitfaden folgen, wenn Sie zum Context-Modul beitragen möchten [Leitfaden](https://github.com/gabrielsoltz/metahub/blob/main/docs/context.md).