Attention quelqu’un a créé une AccessKey !

Loïc LESCOUZERES
Sep 2 · 2 min read

Les couples AccessKey / SecretKey sont des éléments extrêmement importants au sein d’une plateforme AWS. Ils sont l’un des points d’entrée de l’infrastructure.

Dans un monde idéal, seule une poignée de personnes triées sur le volet ont les autorisations pour créer cette ressource. Mais dans le monde réel c’est rarement le cas.

Le besoin est donc simple, nous voulons être alerté par mail en cas de création ou modification d’une AccessKey sur un compte AWS.

La solution proposée ici est simple :

  • Serverless
  • Event driven
  • NoCode (Juste un peu de json à manipuler).

Les besoins :

  • Envoyer un email : SNS est tout indiqué.
  • Capter des événements : CloudTrail semble prometteur.
  • Faire communiquer ces deux-là : EventBridge et son système de règles sont le parfait liant.

On commence par créer le topic SNS et la Subscription.

resource "aws_sns_topic" "montopic" {
name = "security-topic"
}
resource "aws_sns_topic_subscription" "security" {
topic_arn = aws_sns_topic.montopic.arn
protocol = "email"
endpoint = "securite@acme.com"
}
resource "aws_sns_topic_policy" "montopic" {
arn = aws_sns_topic.montopic.arn
policy = data.aws_iam_policy_document.montopic.json
}
data "aws_iam_policy_document" "montopic" {
statement {
effect = "Allow"
actions = [
"SNS:Publish"
]
principals {
type = "Service"
identifiers = [
"events.amazonaws.com"
]
}
resources = [
aws_sns_topic.montopic.arn
]
}
}

On passe à l’EventRule et l’Input Transformer.

resource "aws_cloudwatch_event_rule" "iam_accesskey" {
event_bus_name = "default"
name = "iam-accesskey"
description = "Capture all accesskey events"
event_pattern = <<EOF
{
"source": ["aws.iam"],
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"eventSource": ["iam.amazonaws.com"],
"eventName": [
"CreateAccessKey",
"DeleteAccessKey",
"UpdateAccessKey"
]
}
}
EOF
}
resource "aws_cloudwatch_event_target" "iam_accesskey" {
rule = aws_cloudwatch_event_rule.iam_accesskey.name
target_id = "SendToSNS"
arn = aws_sns_topic.montopic.arn
input_transformer {
input_paths = {
eventName : "$.detail.eventName",
sourceIPAddress : "$.detail.sourceIPAddress",
user : "$.detail.userIdentity.arn",
userName : "$.detail.requestParameters.userName"
}
input_template = <<EOF
"<user> has done <eventName> on <userName> from <sourceIPAddress>"
EOF
}
}

Une fois ce code déployé sur us-east-1 (IAM produit des events depuis cette région), il suffit de créer, modifier ou supprimer une AccessKey pour recevoir un email d’alerte.

EventBridge s’interface avec de nombreux services AWS (https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-targets.html).

On peut imaginer utiliser l’API Destination pour créer un ticket dans un outils dédié, ou tout autre support plus adapté qu’un simple email.

Cette solution permet également de capter n’importe quel autre événement tant que celui-ci passe par CloudTrail.

skale-5

Infogéreur 100 % DevOps de vos applications sur les Cloud…

skale-5

Infogéreur 100 % DevOps de vos applications sur les Cloud AWS, GCP et AZURE. Nous sommes aussi certifiés KUBERNETES. Nous migrons les applications (Move2cloud), nous concevons les architectures Cloud natives, nous assurons la disponibilité 24/7 en intégrant réellement le DevOps.

Loïc LESCOUZERES

Written by

skale-5

Infogéreur 100 % DevOps de vos applications sur les Cloud AWS, GCP et AZURE. Nous sommes aussi certifiés KUBERNETES. Nous migrons les applications (Move2cloud), nous concevons les architectures Cloud natives, nous assurons la disponibilité 24/7 en intégrant réellement le DevOps.