AWS - AccessKey
AWS - AccessKey

AWS - AccessKey

Attention quelqu’un a créé une AccessKey !

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.
image

Un peu de code Terraform

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.

La suite

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 outil 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.

Merci pour votre lecture. Si cet article vous a plu, merci de le partager sur vos réseaux 😉

Loïc LESCOUZERES - Sep 2, 2021 initialement publié ici

image