Export automatique de vulnérabilités Security Hub

Introduction

AWS Security Hub est un dashboard centralisant les vulnérabilités de sécurité provenant de divers services AWS comme AWS Firewall Manager, AWS Config, Amazon GuardDuty, etc … AWS Security Hub permet donc de connaître sa conformité et son exposition au risque au sein d’un ou plusieurs comptes AWS. Les niveaux de vulnérabilités sont classés via différentes incidences et le nombre de ces vulnérabilités peut rapidement monter à plusieurs dizaines de milliers avec une architecture multi-compte. Il est donc important de savoir agréger ces données pour pouvoir les exploiter.

Dans cet article, nous allons donc montrer comment récupérer et exploiter les données de SecurityHub pour les exporter vers un service ou un endpoint voulu. Dans notre cas, nous les exportons dans un bucket S3 sous format CSV.

Présentation

La solution présentée dans cet article fait donc appel à AWS Lambda, le service permettant d’écrire du code de façon “serverless”, Amazon EventBridge pour pouvoir déclencher automatiquement la lambda de manière périodique et AWS S3 pour pouvoir stocker notre CSV. La solution exécutera donc quotidiennement l’export des données de SecurityHub dans un bucket S3.

Développement

Architecture

Au niveau de l’architecture, on utilise donc 5 services AWS : Cloudwatch, SNS, S3, Lambda et SecurityHub.

L’event Cloudwatch va déclencher la lambda tous les jours, qui va récupérer les informations voulues sur SecurityHub, générer un CSV depuis ces dernières puis le téléverser dans un S3 et envoyer un mail de notification via SNS.


Python

Pour le développement de la lambda. Le langage choisi est Python pour sa facilité d’utilisation et notamment pour son interaction avec AWS via le SDK boto3. Pour pouvoir récupérer toutes les données souhaitées de Security Hub, le code tourne autour d’une fonction : get_findings(). Cette fonction permet de récupérer les findings avec certains paramètres, notamment un filtre. Pour le filtre, on partira d’une requête que l’on peut réaliser  dans la console de Security Hub :

Ces filtres se traduisent par ce morceau de configuration :

Ensuite, pour parcourir toutes les données reçues, on utilise paginator pour requêter qui nous permet de récupérer de nombreuses données difficiles de récupérer en un seul appel classique, notamment avec des retours d’API comme le “NextToken”.

Enfin, l’API de Security Hub a des limites :

  • GetFindings - RateLimit of 3 requests per second. BurstLimit of 6 requests per second.

J’utilise donc une boucle While avec une gestion d’erreur pour rester dans la boucle dans le cas où l’on rencontre une erreur.

Pour terminer, l’écriture dans le CSV se fait via le module csv de Python. Les lignes sont écrites une par une avec une initialisation pour la ligne d’entête. Pour cet exemple, seulement 3 entrées ont été choisies : le titre, la sévérité et la description. Ces entrées peuvent être modifiées selon le besoin, les entrées possibles peuvent être :

AwsAccountId, Resources, Id, …

(cf https://docs.aws.amazon.com/cli/latest/reference/securityhub/get-findings.html#output)

Le choix est donc à faire selon le besoin. L’utilisation du numéro unique d’un compte AWS peut être intéressant pour une architecture multi-compte par exemple.

Bonus :

On utilise dans ce script un upload sur un bucket S3 mais l’endroit / la manière d’exporter reste libre au besoin de l’utilisateur / du développeur. Pour cela j’ai choisi de mettre en paramètre d’entrée le bucket vers lequel on veut upload et le nombre de jours sur lequel on veut requêter Security Hub.

Terraform / AWS

Le code Terraform développé a été fait pour être le plus simple possible. Il permet donc de créer :

  • Une clé KMS pour pouvoir chiffrer les données extraites
  • Un bucket S3 privé chiffré et versionné
  • Une lambda avec un rôle lui permettant d’accéder seulement à ce qu’elle a besoin (KMS, S3 & Security Hub)
  • Un déclenchement cloudwatch pour le run quotidien
  • Une SNS pour pouvoir notifier par mail (bonus)

Code

Vous trouverez dans le repository suivant le code Terraform ainsi que le script Python permettant de mettre en place cette solution. Libre à vous de la customiser pour ajouter / retirer des fonctionnalités.

https://gitlab.ippon.fr/afreyermuth/terraform-securityhub-exporter

Pour aller plus loin

  • Mettre en place un export différent selon le besoin
  • Modifier les filtres selon le besoin, par exemple remonter seulement les vulnérabilités HIGH
  • Requêter un rapport global ou un rapport par contre pour une architecture multi-compte

Conclusion

AWS Security Hub est un service très puissant et très utile pour regrouper et remonter les vulnérabilités de sécurité mais il est parfois difficile d’exploiter efficacement les données au vu de la volumétrie. Il est donc possible de mettre en place un script Python pour pouvoir exporter sous un format quelconque, dans notre exemple en CSV, choisi par défaut pour créer un fichier lisible et connu de tous.