Attention quelqu’un a créé une AccessKey !

Loïc LESCOUZERES
skale-5
Published in
2 min readSep 2, 2021

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.

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

--

--