
Outil d'enrichissement automatisé des constats de sécurité et d'évaluation d'impact pour AWS. Enrichit les données de vulnérabilité avec le contexte des ressources, les associations et les tags pour calculer des scores d'impact contextuels en vue d'une correction priorisée.
MetaHub est un outil automatisé d'enrichissement contextuel et d'évaluation d'impact des findings de sécurité pour la gestion des vulnérabilités. Vous pouvez l'utiliser avec AWS Security Hub ou tout scanner de sécurité compatible ASFF. Arrêtez de vous fier à des sévérités inutiles et passez à des définitions de score d'impact basées sur VOTRE contexte.
MetaHub est un outil de sécurité open-source pour la gestion des vulnérabilités basée sur l'impact contextuel. Il peut automatiser le processus de contextualisation des findings de sécurité en fonction de votre environnement et de vos besoins, VOTRE contexte, identifier la propriété et calculer un score d'impact basé sur celui-ci, que vous pouvez utiliser pour définir la priorisation (par où commencer ?) et les automatisations comme les corrections, alertes ou tickets. L'outil est conçu pour les environnements AWS et vous pouvez l'utiliser avec AWS Security Hub ou tout scanner compatible ASFF (comme Prowler).
ℹ️ Explorez et étendez les nouveaux Tableaux de bord MetaHub avec Powerpipe !
MetaHub décrit votre contexte en se connectant aux ressources affectées dans vos comptes concernés. Il peut décrire les informations sur votre compte AWS et votre organisation, les tags des ressources affectées, les événements CloudTrail associés, les configurations de vos ressources affectées et toutes leurs associations : si vous contextualisez un finding de sécurité affectant une instance EC2, MetaHub se connectera non seulement à cette instance elle-même mais aussi à ses rôles IAM ; de là, il se connectera aux politiques IAM associées à ces rôles. Il se connectera aux groupes de sécurité et analysera toutes leurs règles, au VPC et aux sous-réseaux où l'instance s'exécute, aux volumes, aux groupes Auto Scaling, et plus encore. Vous pouvez appliquer des filtres pour automatiser la détection d'autres ressources ayant les mêmes propriétés et effectuer des investigations approfondies.
Après avoir récupéré toutes les informations de votre contexte, MetaHub évaluera les conditions d'impact pour toutes vos ressources : exposition, accès, chiffrement, statut, environnement, application et propriétaire. Sur la base de ces calculs et en plus des informations sur les findings de sécurité affectant la ressource, le tout ensemble, MetaHub générera un score pour chaque finding et ressource affectée.
Consultez le tableau de bord suivant généré par MetaHub. Vous avez les ressources affectées, regroupant tous les findings de sécurité les affectant ensemble et la sévérité d'origine de chaque finding. Ensuite, vous avez le score et tous les critères que MetaHub a évalués pour générer ce score. Toutes ces informations sont filtrables, triables, groupables, téléchargeables et personnalisables.
Voici la sortie JSON output pour une instance EC2 ; voyez comment MetaHub organise toutes les informations sur son contexte ensemble, sous associations, config, tags, account et cloudtrail, et enfin la clé impact avec le score et tous les critères évalués pour générer ce score.
MetaHub offre une gamme de moyens pour lister, gérer et sortir vos findings de sécurité pour investigation, suppression, mise à jour et intégration avec d'autres outils. Il est conçu pour être utilisé comme outil en CLI ou dans des workflows automatisés, tels que des fonctions AWS Lambda. Il prend en charge différentes sorties, certaines json programmatique, mais aussi des formats puissants html, xlsx et csv que vous pouvez personnaliser.
Si vous utilisez AWS Security Hub, MetaHub s'intègre parfaitement et étend ses fonctionnalités. Il peut être utilisé comme action personnalisée Security Hub, prend en charge les filtres AWS Security Hub, vous pouvez gérer le statut de workflow de vos findings, et vous pouvez même enrichir vos findings directement dans AWS Security Hub.
MetaHub est conçu pour être utilisé avec AWS et prend en charge les configurations multi-comptes. Vous pouvez exécuter l'outil depuis n'importe quel environnement en assumant des rôles dans votre maître AWS Security Hub et vos comptes enfant/service. Cela vous permet de récupérer des données agrégées depuis plusieurs comptes en utilisant votre implémentation multi-compte AWS Security Hub tout en récupérant et enrichissant ces findings avec des données provenant des comptes où vos ressources affectées s'exécutent. Reportez-vous à Configuration de Security Hub pour plus d'informations.
Lisez vos findings de sécurité depuis AWS Security Hub avec les filtres par défaut et exécutez les options de contexte par défaut :```bash ./metahub
Lit un résultat de sécurité spécifique (filtré par ID) depuis AWS Security Hub et exécute les options de contexte par défaut :```bash
./metahub --sh-filters Id=arn:aws:securityhub:us-east-1:123456789012:security-control/CloudFront.1/finding/8bd4d049-dcbc-445b-a5d1-595d8274b4c1
Lit toutes les conclusions de sécurité affectant une ressource qui sont ACTIVE (filtrées par ResourceId et RecordState) depuis AWS Security Hub et exécute les options de contexte par défaut :```bash ./metahub --sh-filters RecordState=ACTIVE ResourceId=arn:aws:ec2:eu-west-1:123456789012:subnet/subnet-0b7d243ff90ebc03e
Lire toutes les conclusions de sécurité affectant un compte AWS qui sont ACTIVE (filtrées par AwsAccountId et RecordState) pour les ressources avec une balise `Environment` et la valeur `stg` et exécute les options de contexte `config` et `tags` :```bash
./metahub --sh-filters RecordState=ACTIVE AwsAccountId=123456789012 --mh-filters-tags Environment=stg --context config tags
Lisez vos résultats de sécurité depuis Prowler en tant que fichier d'entrée et exécutez les options de contexte par défaut :```bash python3 prowler.py aws -M json-asff -q ./metahub --inputs file-asff --input-asff /path/to/prowler-findings.json.asff
Lit vos résultats de sécurité depuis Powerpipe en tant que fichier d'entrée et exécute les options de contexte par défaut :```bash
powerpipe benchmark run aws_compliance.benchmark.all_controls --export asff
./metahub --inputs file-asff --input-asff /path/to/powerpipe-findings.json.asff
Lit vos conclusions de sécurité de Trivy en tant que fichier d'entrée et exécute les options de contexte par défaut :```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
# Contexte
Dans **MetaHub**, le **contexte** fait référence aux informations sur les ressources affectées, comme leur **configuration**, leurs **associations**, leurs **journaux**, leurs **tags** et leur **compte**.
MetaHub ne s'arrête pas à la ressource affectée, mais analyse également toutes les ressources associées ou attachées. Par exemple, si une constatation de sécurité existe sur un groupe de sécurité, **MetaHub** analysera le groupe de sécurité et tout ce qui lui est associé, comme les instances EC2 qui l'utilisent. Pour chaque ressource associée, **MetaHub** récupérera son contexte. Si le groupe de sécurité est attaché à une instance EC2, **MetaHub** analysera l'instance et toutes ses associations, comme les rôles IAM et les politiques. À partir d'une seule constatation de sécurité sur un groupe de sécurité, **MetaHub** récupérera le contexte du groupe de sécurité, de l'instance EC2, des rôles IAM et des politiques IAM. Cela est essentiel pour comprendre l'impact de vos constatations de sécurité.
Le module **contexte** comporte cinq parties principales : [**config**](#config) (qui inclut [**associations**](#associations)), [**tags**](#tags), [**cloudtrail**](#cloudtrail) et [**account**](#account). Par défaut, seuls **config**, **tags** et **account** sont activés, mais vous pouvez modifier ce comportement à l'aide de l'option `--context` (par exemple, utilisez `--context config tags cloudtrail account` pour activer toutes les clés de contexte, ou `--context config` pour activer uniquement les clés config et associations) :
## Config
Sous la clé `config`, vous trouverez des informations de configuration importantes sur la ressource affectée. Par exemple, si la ressource affectée est un compartiment S3, vous trouverez des informations sur sa politique de compartiment, ses ACL, sa configuration de chiffrement, etc. Si la ressource affectée est une instance EC2, vous trouverez des informations sur sa clé, ses adresses IP publique et privée, ses métadonnées, etc. Les informations de configuration que **MetaHub** récupère sont définies par type de ressource. Si vous souhaitez ajouter plus d'informations de configuration, consultez [contributing](#contributing).
Vous pouvez filtrer vos constatations en fonction des sorties de configuration à l'aide de l'option : `--mh-filters-config <key> {True/False}` (voir [config filters](#config-filters)).
<details>
<summary>Exemple pour une clé de configuration de compartiment S3</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
}
]
},
Sous la clé associations, vous trouverez toutes les ressources associées de la ressource affectée. Par exemple, si la ressource affectée est une instance EC2, vous trouverez des ressources comme : les groupes de sécurité, les rôles IAM, les volumes, le VPC, les sous-réseaux, les groupes Auto Scaling. Si la ressource affectée est un rôle IAM, vous trouverez des ressources comme les politiques IAM, les utilisateurs IAM, les groupes IAM, et plus encore. Chaque fois que MetaHub trouve une association, il se connecte à nouveau à la ressource associée et récupère son propre contexte. Les associations sont essentielles pour comprendre le contexte et l'impact de vos constatations de sécurité.
Vous pouvez filtrer vos constatations en fonction des sorties d'associations en utilisant l'option : --mh-filters-config <key> {True/False} (voir filtres de configuration).
Sous la clé tags, vous trouverez toutes les balises associées à la ressource concernée. MetaHub s'appuie sur l'API AWS Resource Groups Tagging pour interroger les balises associées à vos ressources. Notez que tous les types de ressources AWS ne prennent pas en charge cette API. Vous pouvez consulter les services pris en charge.
Les balises sont un élément crucial pour comprendre votre contexte. Les stratégies de balisage incluent souvent :
Si vous suivez une stratégie de balisage appropriée, vous pouvez filtrer et générer des résultats intéressants. Par exemple, vous pourriez lister tous les résultats liés à une équipe spécifique et fournir ces données directement à cette équipe.
Vous pouvez filtrer vos résultats en fonction des sorties de balises à l'aide de l'option : --mh-filters-tags TAG=VALUE (voir filtres de balises).
Sous la clé cloudtrail, vous trouverez les événements CloudTrail critiques liés à la ressource affectée, tels que les événements de création. Les événements CloudTrail que nous recherchons sont définis par type de ressource, et vous pouvez en ajouter, supprimer ou modifier en éditant le fichier de configuration resources.py. Par exemple, pour une ressource affectée de type Security Group, MetaHub recherchera les événements suivants : CreateSecurityGroup (événement de création de groupe de sécurité) et AuthorizeSecurityGroupIngress (événement d'autorisation de règle de groupe de sécurité).
Sous la clé account, vous trouverez des informations sur le compte où la ressource affectée est en cours d'exécution, par exemple si elle fait partie d'une organisation AWS, des informations sur leurs contacts, et plus encore.
Le module Impact de MetaHub se concentre sur la compréhension des 7 propriétés clés de la ressource affectée : exposition, accès, chiffrement, statut, environnement, application et propriétaire. Il combine leurs valeurs avec celles de toutes les observations de sécurité affectant la même ressource et leur sévérité pour générer un score. Le score d'impact est un nombre compris entre 0 et 100, où 100 représente l'impact le plus élevé.
L'exposition évalue comment la ressource affectée est exposée à d'autres réseaux. Par exemple, si la ressource affectée est effectivement publique ou simplement publique, si elle fait partie d'un VPC, si elle possède une adresse IP publique ou si elle est protégée par un pare-feu ou un groupe de sécurité.
Accès évalue la couche de politique des ressources. MetaHub vérifie toutes les politiques disponibles, y compris : les politiques IAM gérées, les politiques IAM en ligne, les politiques de ressources, les ACL de compartiments, et toute association à d'autres ressources comme les rôles IAM dont les politiques sont également analysées. Une politique non restreinte n'est pas seulement un problème en soi, elle affecte toute autre ressource qui l'utilise.
Chiffrement évalue les différentes couches de chiffrement en fonction de chaque type de ressource. Par exemple, pour certaines ressources, il évalue si les configurations de chiffrement at_rest et in_transit sont toutes deux activées.
| Statuts possibles |
|---|
Statut évalue le statut de la ressource affectée en termes de rattachement ou de fonctionnement. Par exemple, pour une instance EC2, nous évaluons si la ressource est en cours d'exécution, arrêtée ou terminée, mais pour des ressources comme les volumes EBS et les groupes de sécurité, nous évaluons si ces ressources sont attachées à une autre ressource.
Environnement évalue l'environnement dans lequel la ressource affectée s'exécute. Par défaut, MetaHub définit 3 environnements : production, staging et development, mais vous pouvez ajouter, supprimer ou modifier ces environnements selon vos besoins. MetaHub évalue l'environnement en fonction des balises de la ressource affectée, de l'ID du compte ou de l'alias du compte. Vous pouvez définir vos propres définitions d'environnements et votre stratégie dans le fichier de configuration (voir Personnalisation de la configuration).
Application évalue l'application dont la ressource affectée fait partie. MetaHub s'appuie sur la fonctionnalité AWS myApplications, qui repose sur le tag awsApplication, mais vous pouvez étendre cette fonctionnalité en fonction de votre contexte, par exemple en définissant d'autres tags que vous utilisez pour définir des applications ou services (comme Service ou tout autre), ou en vous basant sur l'ID ou l'alias du compte. Vous pouvez définir vos définitions d'application et votre stratégie dans le fichier de configuration (Voir Personnalisation de la configuration).
| Statuts possibles | Valeur | Description |
|---|---|---|
| 🔵 inconnu | - | La ressource n'a pas pu être vérifiée pour l'application. |
Propriétaire se concentre sur la détection de la propriété. Il peut déterminer le propriétaire de la ressource affectée de différentes manières. Cette information peut être utilisée pour attribuer automatiquement une constatation de sécurité au bon propriétaire, l'escalader ou prendre des décisions en fonction de ces informations. Une méthode automatisée pour déterminer le propriétaire d'une ressource est essentielle pour les équipes de sécurité. Elle leur permet de se concentrer sur les problèmes les plus critiques et de les attribuer le plus rapidement possible aux bonnes personnes dans des flux de travail automatisés. Vous pouvez définir vos définitions de propriétaire et votre stratégie dans le fichier de configuration (Voir Personnalisation de la configuration).
| Statuts possibles | Valeur | Description |
|---|---|---|
| 🔵 unknown | - | La ressource n'a pas pu être vérifiée pour le propriétaire. |
Dans le cadre du calcul du score d'impact, nous évaluons également le nombre total de constats de sécurité et leurs sévérités affectant la ressource. Nous utilisons la formule suivante pour calculer cette métrique :```sh (SUM of all (Finding Severity / Highest Severity) with a maximum of 1)
Par exemple, si la ressource affectée a deux constatations qui l'affectent, une avec une sévérité `HIGH` et une autre avec `LOW`, le **Score d'Impact des Constatations** sera :```sh
SUM(HIGH (3) / CRITICAL (4) + LOW (0.5) / CRITICAL (4)) = 0.875
MetaHub lit vos résultats de sécurité depuis AWS Security Hub ou tout scanner de sécurité compatible ASFF. Il interroge ensuite les ressources affectées directement dans le compte concerné pour fournir un contexte supplémentaire. Sur la base de ce contexte, il calcule son impact. Enfin, il génère différentes sorties en fonction de vos besoins.
Quelques cas d'utilisation de MetaHub incluent :
MetaHub utilise des fichiers de configuration qui vous permettent de personnaliser certains comportements des contrôles, les filtres par défaut, et plus encore. Les fichiers de configuration se trouvent dans lib/config/.
Choses que vous pouvez personnaliser :
lib/config/configuration.py: Ce fichier contient la configuration par défaut de MetaHub. Vous pouvez modifier les filtres par défaut, les modes de sortie par défaut, les définitions d'environnement, et plus encore.
lib/config/impact.py: Ce fichier contient les valeurs et leurs poids pour les critères de la formule d'impact. Vous pouvez modifier les valeurs et les poids en fonction de vos besoins.
lib/config/reources.py: Ce fichier contient les définitions pour chaque type de ressource, comme les événements CloudTrail à rechercher.
MetaHub est un programme Python3. Vous devez avoir Python3 installé sur votre système ainsi que les modules Python requis décrits dans le fichier requirements.txt.
Les prérequis peuvent être installés sur votre système manuellement (en utilisant pip3) ou en utilisant un environnement virtuel Python (méthode suggérée).
git clone [email protected]:gabrielsoltz/metahub.gitcd metahubpython3 -m venv venv/metahubsource venv/metahub/bin/activatepip3 install -r requirements.txt./metahub -hdeactivateLa prochaine fois, vous n'avez besoin que des étapes 4 et 6 pour utiliser le programme.
Alternativement, vous pouvez exécuter cet outil en utilisant Docker.
MetaHub est également disponible en tant qu'image Docker. Vous pouvez l'exécuter directement depuis l'image Docker publique ou le construire localement.
Les balises disponibles pour les conteneurs MetaHub sont les suivantes :
latest : synchronisée avec la branche master<x.y.z> : vous pouvez trouver les versions icistable : cette balise pointe toujours vers la dernière version.Pour exécuter depuis le registre public, vous pouvez exécuter la commande suivante :```sh docker run -ti public.ecr.aws/n2p8q5p4/metahub:latest ./metahub -h
## Identifiants AWS et Docker
Si vous êtes déjà connecté à la machine hôte AWS, vous pouvez utiliser les mêmes identifiants de manière transparente dans un conteneur Docker. Vous pouvez y parvenir soit en passant les variables d'environnement nécessaires au conteneur, soit en montant le fichier d'identifiants.
Par exemple, vous pouvez exécuter la commande suivante :```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
D'autre part, si vous n'êtes pas connecté sur la machine hôte, vous devrez vous reconnecter depuis l'intérieur du conteneur lui-même.
Ou vous pouvez également le construire localement :```sh git clone [email protected]:gabrielsoltz/metahub.git cd metahub docker build -t metahub . docker run -ti metahub ./metahub -h
# Exécuter avec Lambda
**MetaHub** est prêt pour Lambda/Serverless ! Vous pouvez exécuter MetaHub directement sur une fonction AWS Lambda sans aucune infrastructure supplémentaire nécessaire.
Exécuter MetaHub dans une fonction Lambda vous permet d'automatiser son exécution en fonction de déclencheurs définis. Par exemple, vous pouvez :
- Déclencher la fonction Lambda MetaHub à chaque nouvelle constatation de sécurité pour enrichir cette constatation dans AWS Security Hub.
- Déclencher la fonction Lambda MetaHub à chaque nouvelle constatation de sécurité pour la supprimer en fonction du contexte.
- Déclencher la fonction Lambda MetaHub pour identifier le propriétaire affecté d'une constatation de sécurité en fonction du contexte et l'assigner à l'aide de vos systèmes internes.
- Déclencher la fonction Lambda MetaHub pour créer un ticket avec un contexte enrichi.
## Déploiement de Lambda
Le code terraform pour déployer la fonction Lambda est fourni dans le dossier `terraform/`.
Exécutez simplement les commandes suivantes :```sh
cd terraform
terraform init
terraform apply
Le code créera un fichier zip pour le code Lambda et un fichier zip pour les dépendances Python que nous utiliserons comme couche Lambda. Il créera également la fonction Lambda et toutes les ressources nécessaires.
Le code Terraform créera également une action personnalisée Security Hub et une règle EventBridge pour déclencher la fonction Lambda lorsque l'action personnalisée est exécutée. Voir ci-dessous.
Vous pouvez personnaliser les options de MetaHub pour votre lambda en modifiant le fichier lib/lambda.py. Vous pouvez modifier les options par défaut de MetaHub, telles que les filtres, les options Meta*, et plus encore.
Terraform créera les permissions minimales requises pour que la fonction Lambda s'exécute localement (dans le même compte). Si vous souhaitez que votre Lambda assume un rôle dans d'autres comptes (par exemple, vous en aurez besoin si vous exécutez le Lambda dans le compte maître Security Hub qui agrège les résultats d'autres comptes), vous devrez spécifier le rôle à assumer, en ajoutant l'option --mh-assume-role dans la configuration de la fonction Lambda (voir l'étape précédente) et en ajoutant la politique correspondante pour permettre au Lambda d'assumer ce rôle dans le rôle lambda.
MetaHub peut être exécuté en tant qu'action personnalisée Security Hub. Cela vous permet d'exécuter MetaHub directement depuis la console Security Hub pour un résultat sélectionné ou pour un ensemble sélectionné de résultats.
L'action personnalisée déclenchera alors une fonction Lambda qui exécutera MetaHub pour les résultats sélectionnés.
Lorsque vous déclenchez le Lambda à l'aide de l'action personnalisée Security Hub, le lambda lira les résultats sélectionnés pour son contexte et s'exécutera une fois pour chaque résultat. Par défaut, aucune action ne sera effectuée sur les résultats, mais vous pouvez modifier ce comportement. Voir Personnaliser le comportement de Lambda.
L'action personnalisée Security Hub est déployée dans le cadre du code Terraform. Voir Déploiement de Lambda pour plus d'informations.
Assurez-vous d'avoir configuré les identifiants AWS sur votre machine locale (ou depuis l'endroit où vous exécuterez MetaHub).
Par exemple, vous pouvez utiliser l'option aws configure.```sh
aws configure
Ou vous pouvez exporter vos identifiants dans l'environnement.```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"
Si vous exécutez MetaHub pour une configuration de compte AWS unique (AWS Security Hub n'agrège pas les résultats de différents comptes), vous n'avez pas besoin d'utiliser d'options supplémentaires ; MetaHub utilisera les identifiants de votre environnement. Toutefois, si votre conception IAM l'exige, il est possible de se connecter et d'assumer un rôle dans le même compte que celui auquel vous êtes connecté. Utilisez simplement les options --sh-assume-role pour spécifier le rôle et --sh-account avec le même ID de compte AWS que celui auquel vous êtes connecté.
--sh-region : La région AWS où Security Hub est en cours d'exécution. Si vous ne spécifiez pas de région, celle configurée dans votre environnement sera utilisée. Si vous utilisez l'agrégation inter-régions d'AWS Security Hub, vous devez utiliser cette région comme option --sh-region afin de pouvoir récupérer tous les résultats ensemble.
--sh-account et --sh-assume-role : L'ID du compte AWS où Security Hub est en cours d'exécution et le rôle IAM AWS à assumer dans ce compte. Ces options sont utiles lorsque vous êtes connecté à un compte AWS différent de celui où AWS Security Hub est en cours d'exécution ou lorsque vous utilisez AWS Security Hub dans une configuration multi-comptes AWS. Les deux options doivent être utilisées ensemble. Le rôle fourni doit avoir suffisamment de politiques pour obtenir et mettre à jour les résultats dans AWS Security Hub (si nécessaire). Si vous ne spécifiez pas de --sh-account, MetaHub supposera que vous utilisez celui auquel vous êtes connecté.
--sh-profile : Vous pouvez également fournir le nom de votre profil AWS à utiliser pour AWS Security Hub. Lorsque vous utilisez cette option, vous n'avez pas besoin de spécifier ou car MetaHub utilisera les identifiants du profil. Si vous utilisez et , ces options priment sur .
Il s'agit de la politique IAM minimale dont vous avez besoin pour lire et écrire depuis AWS Security Hub. Si vous ne souhaitez pas mettre à jour vos résultats avec MetaHub, vous pouvez supprimer l'action securityhub:BatchUpdateFindings.```sh
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"security hub:GetFindings",
"security hub:ListFindingAggregators",
"security hub:BatchUpdateFindings",
"iam:ListAccountAliases"
],
"Resource": [
"*"
]
}
]
}
# Configuration du contexte
Si vous exécutez MetaHub pour un environnement multi-comptes AWS (AWS Security Hub regroupe les constats de plusieurs comptes AWS), vous devez fournir le rôle à assumer pour les requêtes de contexte, car les ressources concernées ne se trouvent pas dans le même compte AWS que les constats AWS Security Hub. L'option `--mh-assume-role` sera utilisée pour se connecter directement aux ressources concernées dans le compte concerné. Ce rôle doit disposer de suffisamment de politiques pour pouvoir décrire les ressources.
## Politique IAM pour le contexte
La politique minimale nécessaire pour le contexte comprend la politique gérée `arn:aws:iam::aws:policy/SecurityAudit` et les actions suivantes :
- `tag:GetResources`
- `lambda:GetFunction`
- `lambda:GetFunctionUrlConfig`
- `cloudtrail:LookupEvents`
- `account:GetAlternateContact`
- `organizations:DescribeAccount`
- `iam:ListAccountAliases`
# Entrées
MetaHub peut lire les constats de sécurité directement depuis AWS Security Hub via son API. Si vous n'utilisez pas Security Hub, vous pouvez utiliser tout scanner compatible ASFF. La plupart des scanners de sécurité cloud prennent en charge le format ASFF comme Prolwer, Steampipe, Trivy, etc.
Si vous souhaitez lire depuis un fichier ASFF d'entrée, vous devez utiliser l'option (`--inputs file-asff`) et fournir le chemin vers le fichier. Vous pouvez fournir plusieurs fichiers séparés par un espace.:```sh
./metahub.py --inputs file-asff --input-asff path/to/the/file.json.asff path/to/the/file2.json.asff
Vous pouvez également combiner les résultats d'AWS Security Hub avec des fichiers ASFF d'entrée en spécifiant les deux entrées (--inputs file-asff securityhub). MetaHub traitera tous les résultats ensemble et produira une seule sortie.:```sh
./metahub.py --inputs file-asff securityhub --input-asff path/to/the/file.json.asff
Lors de l'utilisation d'un fichier en entrée, vous ne pouvez pas utiliser l'option `--sh-filters` pour filtrer les résultats, car cette option repose sur l'API AWS pour le filtrage. Vous ne pouvez pas utiliser les options `--update-findings` ou `--enrich-findings` car ces résultats ne se trouvent pas dans AWS Security Hub. Si vous lisez à partir des deux sources en même temps, seuls les résultats d'AWS Security Hub seront mis à jour.
MetaHub implémente également des **mécanismes de correction** pour le format ASFF, lorsqu'ils ne sont pas correctement formatés. Il s'agit d'une approche au mieux pour rendre l'ASFF aussi utile que possible, mais ce n'est pas parfait et doit être corrigé dans le scanner source.
- Si la clé `Region` est absente des ressources et du niveau racine, MetaHub calculera la région en fonction de l'ARN de la ressource concernée.
- Si le fichier ASFF ne définit pas correctement le type de ressource ASFF, MetaHub le calculera en fonction de l'ARN de la ressource concernée à l'aide de la bibliothèque [aws-arn](https://github.com/gabrielsoltz/aws-arn)
- Si tout autre champ est manquant comme `SeverityLabel`, `Workflow`, `RecordState`, `Compliance`, `Id`, `ProductArn` ou `StandardsControlArn`, MetaHub les définira sur `Unknown`.
# Sorties
**MetaHub** peut générer différentes sorties programmatiques et visuelles. Par défaut, tous les modes de sortie sont activés : `json-short`, `json-full`, `json-statistics`, `json-inventory`, `html`, `csv` et `xlsx`. Si vous souhaitez générer uniquement un mode de sortie spécifique, vous pouvez utiliser l'option `--output-modes` avec le mode de sortie souhaité. Les sorties seront enregistrées dans le dossier `outputs/` avec la date d'exécution.
Par exemple, si vous souhaitez uniquement générer la sortie `json-short`, vous pouvez utiliser :```sh
./metahub.py --output-modes json-short
Si vous souhaitez générer les sorties json-short, json-full et html, vous pouvez utiliser :```sh
./metahub.py --output-modes json-short json-full html
**MetaHub** organise les constats de sécurité affectant la même ressource tous ensemble sous la clé `findings` pour tenter d'éviter l'Ombré (lorsque deux vérifications se réfèrent au même problème, mais l'une de manière plus générique que l'autre) et le Doublon (lorsque vous utilisez plus d'un scanner et obtenez le même problème de plus d'un.). Vous pouvez voir ce comportement clairement dans les sorties `json-short`, `json-full` et `html`.
- [JSON](#json)
- [HTML](#html)
- [CSV](#csv)
- [XLSX](#xlsx)
- [SQLite](#sqlite)
## JSON
> :info: Pour explorer une sortie JSON de manière interactive, vous pouvez utiliser l'outil [fx](https://github.com/antonmedv/fx).
### JSON-Full
Affiche la ressource affectée en utilisant son ARN comme clé et les constats l'affectant comme une liste sous la clé `findings`. En plus des constats, vous obtiendrez également les clés suivantes : `ResourceType`, `Region`, `AwsAccountId`, `associations`, `config`, `tags`, `account`, `cloudtrail` et `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
}
}
Affiche la ressource affectée en utilisant son ARN comme clé et les résultats affectant cette ressource sous forme de liste sous la clé findings. En plus des résultats, vous obtiendrez également les clés suivantes : ResourceType, Region, AwsAccountId, associations, config, tags, account, cloudtrail, et 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
Affiche une liste de toutes les ressources avec leur ARN.```json
[
"arn:aws:sagemaker:us-east-1:ofuscated:notebook-instance/obfuscated",
"arn:aws:sagemaker:eu-west-1:ofuscated:notebook-instance/obfuscated"
]
Affichez les statistiques pour chaque champ/valeur. Dans la sortie, vous verrez chaque champ/valeur et le nombre d'occurrences ; par exemple, la sortie suivante montre les statistiques pour six résultats.```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
Vous pouvez créer des rapports HTML riches de vos découvertes, en y ajoutant votre contexte.
Les rapports HTML sont interactifs de plusieurs manières :
- Vous pouvez ajouter/supprimer des colonnes.
- Vous pouvez trier et filtrer par n'importe quelle colonne.
- Vous pouvez filtrer automatiquement par n'importe quelle colonne.
- Vous pouvez regrouper/dégrouper les découvertes.
- Vous pouvez également télécharger ces données au format xlsx, CSV, HTML et JSON.
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/6190/21d785d2413698ed7cb3e9dc7e9b51dc6550395a598d777abc9fc358f8a23573.png" alt="html-example"/>
</p>
## CSV
Vous pouvez créer des rapports CSV de vos découvertes, en y ajoutant votre contexte.
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/6190/66f15350123702e1cc317e47938401853bdcb1d86dad0ad4e48e73f15e00dd76.png" alt="csv-example"/>
</p>
## XLSX
Similaire au CSV, mais avec davantage d'options de formatage.
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/6190/953a77917dc5b06e5185e6cb882ba7e711d785861e184599f10cd472efc42db9.png" alt="xlsx-example"/>
</p>
## Personnaliser les sorties HTML, CSV ou XLSX
Vous pouvez personnaliser les clés de contexte à dérouler en colonnes pour vos sorties HTML, CSV et XLSX en utilisant les options `--output-tag-columns` et `--output-config-columns` (sous forme de liste de colonnes). Si les clés que vous avez spécifiées n'existent pas pour la ressource concernée, elles seront vides. Vous pouvez également configurer ces colonnes par défaut dans le fichier de configuration (Voir [Personnalisation de la configuration](#customizing-configuration)).
Par exemple, vous pouvez générer une sortie HTML avec des Tags et ajouter « Owner » et « Environment » en tant que colonnes à votre rapport en utilisant les :```sh
./metahub --output-modes html --output-tag-columns Owner Environment
MetaHub peut enregistrer les résultats et le contexte dans une base de données SQLite. Cette base de données peut être utilisée pour des analyses approfondies, des rapports et une intégration avec d'autres outils, comme Powerpipe. La base de données sera sauvegardée dans le dossier outputs/ avec la date d'exécution et l'extension .db.
Vous pouvez utiliser la base de données SQLite générée par MetaHub avec Powerpipe. Vous trouverez le mod MetaHub PowerPipe dans le dossier powerpipe/.
Pour l'utiliser, vous devez avoir Powerpipe installé sur votre système.
Une fois installé, vous pouvez exécuter la commande suivante :```sh powerpipe server --database sqlite:../outputs/metahub-20240331-182942.db
### Créez vos propres tableaux de bord
La création de tableaux de bord avec Powerpipe est très simple et puissante. Vous pouvez consulter la [documentation Powerpipe](https://powerpipe.io/docs) pour plus d'informations.
Vous trouverez ci-dessous les tables disponibles dans la base de données SQLite.
#### Ressources
| Nom de la colonne | Type de données | Description |
| ------------------------------- | --------------- | -------------------------------------------------------------------------------------------- |
| resource_arn | VARCHAR | Le nom de ressource Amazon (ARN) de la ressource, servant de clé primaire. |
| resource_type | VARCHAR | Le type de la ressource. |
| resource_region | VARCHAR | La région où se trouve la ressource. |
| resource_account_id | VARCHAR | L'ID du compte associé à la ressource. Clé étrangère référençant accounts(account_id). |
| resource_account_alias | VARCHAR | L'alias du compte associé à la ressource. |
| resource_tags | TEXT | Tags associés à la ressource. |
| resource_exposure | VARCHAR | Le niveau d'exposition de la ressource. |
| resource_access | VARCHAR | Le niveau d'accès de la ressource. |
| resource_encryption | VARCHAR | Le statut de chiffrement de la ressource. |
| resource_status | VARCHAR | Le statut actuel de la ressource. |
| resource_application | VARCHAR | L'application associée à la ressource. |
| resource_environment | VARCHAR | L'environnement (par exemple, production, préproduction) dans lequel se trouve la ressource. |
| resource_owner | VARCHAR | Le propriétaire de la ressource. |
| resource_score | INTEGER | Un score associé à la ressource. |
| resource_findings_score | INTEGER | Un score basé sur les constats associés à la ressource. |
| resource_findings_critical | INTEGER | Le nombre de constats critiques. |
| resource_findings_high | INTEGER | Le nombre de constats de sévérité élevée. |
| resource_findings_medium | INTEGER | Le nombre de constats de sévérité moyenne. |
| resource_findings_low | INTEGER | Le nombre de constats de sévérité faible. |
| resource_findings_informational | INTEGER | Le nombre de constats informatifs. |
#### Constats
| Nom de la colonne | Type de données | Description |
| -------------------------- | --------------- | ---------------------------------------------------------- |
| finding_id | VARCHAR | L'identifiant unique du constat, servant de clé primaire. |
| finding_title | VARCHAR | Le titre du constat. |
| finding_severity | VARCHAR | La sévérité du constat. |
| finding_workflowstatus | VARCHAR | Le statut du workflow du constat. |
| finding_recordstate | VARCHAR | L'état d'enregistrement du constat. |
| finding_compliancestatus | VARCHAR | Le statut de conformité du constat. |
| finding_productarn | VARCHAR | L'ARN du produit générant le constat. |
| finding_resource_arn | VARCHAR | L'ARN de la ressource associée. |
#### Comptes
| Nom de la colonne | Type de données | Description |
| ----------------------------------- | --------------- | ------------------------------------------------------------------------------------ |
| account_id | INTEGER | L'identifiant unique du compte, servant de clé primaire. |
| account_alias | VARCHAR | L'alias du compte. |
| account_organizations_id | VARCHAR | L'ID de l'organisation à laquelle le compte appartient. |
| account_organizations_arn | VARCHAR | L'ARN de l'organisation à laquelle le compte appartient. |
| account_master_account_id | VARCHAR | L'ID du compte maître, si ce compte fait partie d'une organisation AWS. |
| account_master_account_email | VARCHAR | L'adresse e-mail associée au compte maître. |
| account_alternate_contact_type | VARCHAR | Le type de contact alternatif (par exemple, facturation, sécurité). |
| account_alternate_contact_name | VARCHAR | Le nom du contact alternatif. |
| account_alternate_contact_email | VARCHAR | L'adresse e-mail du contact alternatif. |
| account_alternate_contact_phone | VARCHAR | Le numéro de téléphone du contact alternatif. |
| account_alternate_contact_title | VARCHAR | Le titre du contact alternatif. |
# Filtres
Vous pouvez filtrer les constats de sécurité et les ressources que vous obtenez de votre source de différentes manières et les combiner pour obtenir exactement ce que vous cherchez, puis réutiliser ces filtres pour créer des automatisations, des alertes, des rapports, etc.
- [Filtrage Security Hub](#security-hub-filtering)
- [Filtrage Security Hub à l'aide de modèles YAML](#security-hub-filtering-using-yaml-templates)
- [Filtres Config](#config-filters)
- [Filtres Tags](#tags-filters)
- [Filtres d'impact](#impact-filters)
## Filtrage Security Hub
MetaHub prend en charge le filtrage des constats AWS Security Hub sous la forme d'un filtrage `KEY=VALUE` pour AWS Security Hub en utilisant l'option `--sh-filters`, de la même manière que vous filtreriez avec AWS CLI mais limité à la comparaison `EQUALS`. Si vous souhaitez une autre comparaison, utilisez l'option `--sh-template` [Filtrage Security Hub à l'aide de modèles YAML](#security-hub-filtering-using-yaml-templates).
Vous pouvez consulter les filtres disponibles dans la [documentation AWS](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/securityhub.html#SecurityHub.Client.get_findings)```sh
./metahub --sh-filters <KEY=VALUE>
Si vous ne spécifiez aucun filtre, les filtres par défaut sont appliqués : RecordState=ACTIVE WorkflowStatus=NEW
Transmettre des filtres via cette option réinitialise les filtres par défaut. Si vous souhaitez ajouter des filtres aux valeurs par défaut, vous devez les spécifier en plus de ceux par défaut. Par exemple, ajouter SeverityLabel aux filtres par défaut :```sh ./metahub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW
Si une valeur contient des espaces, vous devez la spécifier entre guillemets doubles : `"ProductName="Security Hub"`
Vous pouvez ajouter autant de filtres différents que nécessaire à votre requête et également ajouter la même clé de filtre avec des valeurs différentes :
Exemples :
- Filtrer par sévérité (CRITICAL) :```sh
./metaHub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW SeverityLabel=CRITICAL
- Filtrer par Sévérité et Compte AWS :```sh
./metaHub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW SeverityLabel=CRITICAL AwsAccountId=1234567890
- Filtrer par type de ressource AWS :```sh
./metahub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW ResourceType=AwsEc2SecurityGroup
- Filtrer par ID de résultat :```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"
## Filtrage du Security Hub à l'aide de modèles YAML
**MetaHub** vous permet de créer des filtres complexes à l'aide de fichiers YAML (modèles) que vous pouvez réutiliser selon vos besoins. Les modèles YAML vous permettent d'écrire des filtres en utilisant toute comparaison prise en charge par AWS Security Hub, comme "EQUALS' | 'PREFIX' | 'NOT_EQUALS' | 'PREFIX_NOT_EQUALS". Vous pouvez appeler votre fichier YAML en utilisant l'option `--sh-template <<FILE>>`.
Vous trouverez des exemples dans le dossier [templates](https://github.com/gabrielsoltz/metahub/blob/HEAD/templates)
- Filtrage à l'aide du modèle YAML default.yml:```sh
./metaHub --sh-template templates/default.yml
MetaHub prend en charge les Config filters (et associations) en utilisant KEY=VALUE où la valeur ne peut être que True ou False via l'option --mh-filters-config. Vous pouvez utiliser autant de filtres que vous le souhaitez et les séparer par des espaces. Si vous spécifiez plusieurs filtres, vous obtiendrez toutes les ressources qui correspondent à tous les filtres.
Les Config filters ne prennent en charge que les valeurs True ou False :
True ou avec des données.False ou sans données.Les Config filters s'exécutent après les AWS Security Hub filters :
--sh-filters (ou ceux par défaut).--mh-filters-config, donc un sous-ensemble des ressources du point 1.Exemples :
ResourceType=AwsEc2SecurityGroup) avec les AWS Security Hub findings qui sont ACTIVE et NEW (RecordState=ACTIVE WorkflowStatus=NEW) seulement s'ils sont associés à des interfaces réseau (network_interfaces=True) :```sh
./metahub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW ResourceType=AwsEc2SecurityGroup --mh-filters-config network_interfaces=True- Obtenir tous les compartiments S3 (`ResourceType=AwsS3Bucket`) uniquement s'ils sont publics (`public=True`):```sh
./metahub --sh-filters ResourceType=AwsS3Bucket --mh-filters-config public=False
MetaHub prend en charge les filtres de tags sous la forme KEY=VALUE où KEY est le nom du tag et value est la valeur du tag. Vous pouvez utiliser autant de filtres que vous le souhaitez et les séparer par des espaces. Spécifier plusieurs filtres vous donnera toutes les ressources qui correspondent à au moins un filtre.
Les filtres de tags s'exécutent après les filtres AWS Security Hub :
--sh-filters (ou ceux par défaut).--mh-filters-tags, il s'agit donc d'un sous-ensemble des ressources du point 1.Exemples :
ResourceType=AwsEc2SecurityGroup) avec des résultats AWS Security Hub qui sont ACTIFS et NOUVEAUX (RecordState=ACTIVE WorkflowStatus=NEW) uniquement s'ils sont tagués avec un tag Environment et la valeur Production :```sh
./metahub --sh-filters RecordState=ACTIVE WorkflowStatus=NEW ResourceType=AwsEc2SecurityGroup --mh-filters-tags Environment=Production## Filtres d'impact
**MetaHub** prend en charge les **filtres d'impact** : vous pouvez filtrer par les [clés d'impact](#impact) calculées par MetaHub. Vous pouvez utiliser autant de filtres que vous le souhaitez et les séparer par des espaces. Si vous spécifiez plusieurs filtres, vous obtiendrez toutes les ressources qui correspondent à **tous** les filtres.
Exemples :
- Filtrer toutes les conclusions de sécurité affectant les ressources dont l'exposition est calculée comme effectivement publique :```sh
./metahub --mh-filters-impact exposure=effectively-public
# Actions de Security Hub
## Mise à jour du statut de workflow
Vous pouvez utiliser **MetaHub** pour mettre à jour le statut de workflow de vos findings AWS Security Hub (`NOTIFIED`, `NEW`, `RESOLVED`, `SUPPRESSED`) avec une seule commande. Vous utiliserez l'option `--update-findings` pour mettre à jour tous les findings de votre requête MetaHub. Cela signifie que vous pouvez mettre à jour un, dix ou des milliers de findings en utilisant une seule commande. L'API AWS Security Hub est limitée à 100 findings par mise à jour. MetaHub divisera vos résultats en lots de 100 éléments pour contourner cette limitation et mettre à jour vos findings quel que soit leur nombre.
Par exemple, en utilisant le filtre suivant : `./metahub --sh-filters ResourceType=AwsSageMakerNotebookInstance RecordState=ACTIVE WorkflowStatus=NEW`, j'ai trouvé deux ressources affectées avec trois findings chacune, soit six findings Security Hub au total.
L'exécution de la commande de mise à jour suivante mettra à jour le statut de workflow de ces six findings en `NOTIFIED` avec une note :```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."
L'option --update-findings vous demandera une confirmation avant de mettre à jour vos findings. Vous pouvez ignorer cette confirmation en utilisant l'option --no-actions-confirmation.
Vous pouvez utiliser MetaHub pour enrichir vos Findings AWS Security Hub avec les sorties Context en utilisant l'option --enrich-findings. Enrichir vos findings signifie les mettre à jour directement dans AWS Security Hub. MetaHub utilise le champ UserDefinedFields pour cela.
En enrichissant vos findings directement dans AWS Security Hub, vous pouvez profiter de fonctionnalités telles que les Insights et les Filters en utilisant les informations supplémentaires qui n'étaient pas disponibles auparavant dans Security Hub.
Par exemple, vous souhaitez enrichir tous les findings AWS Security Hub avec WorkflowStatus=NEW, RecordState=ACTIVE, et ResourceType=AwsS3Bucket qui sont public=True avec les sorties Context:```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>
L'option `--enrich-findings` vous demandera une confirmation avant d'enrichir vos conclusions. Vous pouvez ignorer cette confirmation en utilisant l'option `--no-actions-confirmation`.
# Contribuer
Vous pouvez suivre ce guide si vous souhaitez contribuer au module Context [guide](https://github.com/gabrielsoltz/metahub/blob/HEAD/docs/context.md).
| Statuts possibles | Valeur | Description |
|---|
| 🔴 effectively-public | 100% | La ressource est effectivement publique depuis Internet. |
| 🟠 restricted-public | 40% | La ressource est publique, mais avec une restriction telle qu'un groupe de sécurité. |
| 🟠 unrestricted-private | 30% | La ressource est privée mais sans restriction, comme un groupe de sécurité ouvert. |
| 🟠 launch-public | 10% | Ce sont des ressources qui peuvent lancer d'autres ressources en tant que publiques. Par exemple, un groupe Auto Scaling ou un sous-réseau. |
| 🟢 restricted | 0% | La ressource est restreinte. |
| 🔵 unknown | - | La ressource n'a pas pu être vérifiée. |
| Statuts possibles | Valeur | Description |
|---|
| 🔴 unrestricted | 100% | Le principal est non restreint, sans aucune condition ni restriction. |
| 🔴 untrusted-principal | 70% | Le principal est un compte AWS, ne faisant pas partie de vos comptes de confiance. |
| 🟠 unrestricted-principal | 40% | Le principal n'est pas restreint, défini avec un joker. Il pourrait y avoir des conditions le restreignant ou d'autres restrictions comme les blocs publics S3. |
| 🟠 cross-account-principal | 30% | Le principal provient d'un autre compte AWS. |
| 🟠 unrestricted-actions | 30% | Les actions sont définies à l'aide de jokers. |
| 🟠 dangerous-actions | 30% | Certaines actions dangereuses sont définies dans le cadre de cette politique. |
| 🟠 unrestricted-service | 10% | La politique autorise un service AWS en tant que principal sans restriction. |
| 🟢 restricted | 0% | La politique est restreinte. |
| 🔵 unknown | - | La politique n'a pas pu être vérifiée. |
| Description |
|---|
| 🔴 non chiffré | 100% | La ressource n'est pas entièrement chiffrée. |
| 🟢 chiffré | 0% | La ressource est entièrement chiffrée, y compris toutes ses associations. |
| 🔵 inconnu | - | Le chiffrement de la ressource n'a pas pu être vérifié. |
| Statuts possibles | Valeur | Description |
|---|
| 🟠 attaché | 100% | La ressource supporte le rattachement et est attachée. |
| 🟠 en cours d'exécution | 100% | La ressource supporte l'exécution et est en cours d'exécution. |
| 🟠 activé | 100% | La ressource supporte l'activation et est activée. |
| 🟢 non attaché | 0% | La ressource supporte le rattachement et n'est pas attachée. |
| 🟢 pas en cours d'exécution | 0% | La ressource supporte l'exécution et n'est pas en cours d'exécution. |
| 🟢 non activé | 0% | La ressource supporte l'activation et n'est pas activée. |
| 🔵 inconnu | - | La ressource n'a pas pu être vérifiée pour le statut. |
| Statuts possibles | Valeur | Description |
|---|
| 🟠 production | 100% | C'est une ressource de production. |
| 🟢 staging | 30% | C'est une ressource de staging. |
| 🟢 development | 0% | C'est une ressource de développement. |
| 🔵 unknown | - | La ressource n'a pas pu être vérifiée pour l'environnement. |
--sh-account--sh-assume-role--sh-account--sh-assume-role--sh-profile