AWS IAM-Logs erfassen
In diesem Dokument wird beschrieben, wie Sie AWS IAM-Logs in Google Security Operations aufnehmen. Der Parser wandelt Rohprotokolle im JSON-Format in ein strukturiertes einheitliches Datenmodell (Unified Data Model, UDM) um. Es werden relevante Felder wie Nutzerdetails, Rolleninformationen, Berechtigungen und Zeitstempel extrahiert und entsprechenden UDM-Feldern für eine einheitliche Sicherheitsanalyse zugeordnet.
Hinweise
- Sie benötigen eine Google SecOps-Instanz.
- Sie benötigen erhöhte Zugriffsrechte für AWS.
AWS IAM und S3 konfigurieren
- Erstellen Sie einen Amazon S3-Bucket. Folgen Sie dazu der Anleitung unter Bucket erstellen.
- Speichern Sie den Namen und die Region des Buckets für später.
- Erstellen Sie einen Nutzer gemäß der Anleitung IAM-Nutzer erstellen.
- Wählen Sie den erstellten Nutzer aus.
- Wählen Sie den Tab Sicherheitsanmeldedaten aus.
- Klicken Sie im Bereich Zugriffsschlüssel auf Zugriffsschlüssel erstellen.
- Wählen Sie als Anwendungsfall Drittanbieterdienst aus.
- Klicken Sie auf Weiter.
- Optional: Fügen Sie ein Beschreibungs-Tag hinzu.
- Klicken Sie auf Zugriffsschlüssel erstellen.
- Klicken Sie auf CSV-Datei herunterladen, um den Zugriffsschlüssel und den Secret Access Key zur späteren Verwendung zu speichern.
- Klicken Sie auf Fertig.
- Wählen Sie den Tab Berechtigungen aus.
- Klicken Sie im Bereich Berechtigungsrichtlinien auf Berechtigungen hinzufügen.
- Wählen Sie Berechtigungen hinzufügen aus.
- Wählen Sie Richtlinien direkt anhängen aus.
- Suchen Sie nach der Richtlinie AmazonS3FullAccess und wählen Sie sie aus.
- Klicken Sie auf Weiter.
- Klicken Sie auf Berechtigungen hinzufügen.
CloudTrail für die Erfassung von IAM-Logs konfigurieren
- Melden Sie sich bei der AWS Management Console an.
- Geben Sie in die Suchleiste CloudTrail ein und wählen Sie den Dienst aus der Liste aus.
- Klicken Sie auf Weg erstellen.
- Geben Sie einen Trail-Namen an, z. B.
IAMActivityTrail
.- Trail auf alle Regionen anwenden: Wählen Sie Ja aus, um Aktivitäten in allen Regionen zu erfassen.
- Speicherort: Wählen Sie den zuvor erstellten S3-Bucket aus oder erstellen Sie einen neuen.
- S3-Bucket: Geben Sie einen Namen für den S3-Bucket ein, z. B.
iam-logs-bucket
. - Wählen Sie Neue IAM-Rolle erstellen aus, falls noch nicht geschehen.
- Verwaltungsereignisse: Wählen Sie Lesen und Schreiben aus, um sowohl Lese- als auch Schreibereignisse für IAM-Ressourcen zu erfassen.
- Datenereignisse: Aktivieren Sie S3- und Lambda-Datenereignisse.
- Klicken Sie auf Erstellen, um den Trail zu erstellen.
CloudTrail so konfigurieren, dass Protokolle nach S3 exportiert werden
- Gehen Sie zu Dienste > S3.
- Wählen Sie den S3-Bucket aus, in dem CloudTrail-Logs gespeichert werden, z. B.
iam-logs-bucket
. - Prüfen Sie, ob CloudTrail die erforderlichen Berechtigungen zum Schreiben von Protokollen in den Bucket hat.
Fügen Sie die folgende Richtlinie hinzu, falls sie noch nicht vorhanden ist:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "CloudTrailS3Access", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::your-bucket-name/AWSLogs/*" } ] }
Aktivieren Sie die Versionsverwaltung für den S3-Bucket, damit Protokolle mit mehreren Versionen gespeichert werden.
Gehen Sie zu Properties > Bucket-Versionierung > Aktivieren.
Optional: Lambda für Echtzeitexport konfigurieren
- Rufen Sie die AWS Lambda Console auf.
- Klicken Sie auf Funktion erstellen.
- Wählen Sie Autor von Grund auf neu erstellen aus.
- Legen Sie als Funktionsnamen
ExportIAMLogsToS3
fest. - Wählen Sie eine Python 3.x-Laufzeit aus.
Weisen Sie der Funktion eine IAM-Rolle mit den folgenden Berechtigungen zu:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:GetLogEvents", "logs:FilterLogEvents", "logs:DescribeLogGroups", "logs:DescribeLogStreams" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::your-bucket-name/*" } ] }
Verwenden Sie den folgenden Python-Code, um IAM-Protokolle abzurufen und in S3 hochzuladen:
import boto3 import gzip from io import BytesIO s3 = boto3.client('s3') logs = boto3.client('logs') def lambda_handler(event, context): log_group = event['logGroup'] log_stream = event['logStream'] log_events = logs.get_log_events( logGroupName=log_group, logStreamName=log_stream, startFromHead=True ) log_data = "\n".join([event['message'] for event in log_events['events']]) # Compress and upload to S3 compressed_data = gzip.compress(log_data.encode('utf-8')) s3.put_object( Bucket='your-s3-bucket-name', Key='iam-logs/{log_stream}.gz', Body=compressed_data )
- Ersetzen Sie
your-s3-bucket-name
durch den tatsächlichen Bucket-Namen.
Lambda-Trigger für CloudWatch-Protokolle konfigurieren
- Klicken Sie in der Lambda Console auf Designer.
- Wählen Sie Trigger hinzufügen > CloudWatch-Protokolle aus.
- Wählen Sie die Protokollgruppe CloudWatch-Protokolle aus, die mit Ihren IAM-Protokollen verknüpft ist, z. B.
/aws/cloudtrail/
. - Klicken Sie auf Hinzufügen.
Feed in Google SecOps für die Aufnahme von AWS IAM-Logs konfigurieren
- Gehen Sie zu SIEM-Einstellungen > Feeds.
- Klicken Sie auf Neu hinzufügen.
- Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B. AWS IAM-Logs.
- Wählen Sie als Quelltyp Amazon S3 aus.
- Wählen Sie AWS IAM als Logtyp aus.
- Klicken Sie auf Weiter.
Geben Sie Werte für die folgenden Eingabeparameter an:
- Region: die Region, in der sich der Amazon S3-Bucket befindet.
- S3-URI: der Bucket-URI.
s3://your-log-bucket-name/
- Ersetzen Sie
your-log-bucket-name
durch den tatsächlichen Namen des Buckets.
- Ersetzen Sie
- URI ist ein: Wählen Sie Verzeichnis oder Verzeichnis mit Unterverzeichnissen aus.
Optionen zum Löschen der Quelle: Wählen Sie die gewünschte Löschoption aus.
Access Key ID: Der Nutzerzugriffsschlüssel mit Zugriff auf den S3-Bucket.
Secret Access Key: Der geheime Schlüssel des Nutzers mit Zugriff auf den S3-Bucket.
Asset-Namespace: der Asset-Namespace.
Aufnahmelabels: Das Label, das auf die Ereignisse aus diesem Feed angewendet werden soll.
Klicken Sie auf Weiter.
Prüfen Sie die neue Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.
UDM-Zuordnungstabelle
Logfeld | UDM-Zuordnung | Logik |
---|---|---|
Arn | entity.entity.resource.name | Wird direkt aus dem Feld Arn für die Entitätstypen „USER“ und „RESOURCE“ zugeordnet. Für den Entitätstyp „GRUPPE“ wird er von Group.Arn zugeordnet. |
AssumeRolePolicyDocument | entity.entity.resource.attribute.permissions.name | Wird direkt aus dem Feld AssumeRolePolicyDocument zugeordnet, aber nur für den Entitätstyp RESOURCE. |
CreateDate | entity.entity.user.attribute.creation_time | Wird direkt aus dem Feld CreateDate zugeordnet und in das Zeitstempelformat von Chronicle für den Nutzerentitätstyp konvertiert. |
CreateDate | entity.entity.resource.attribute.creation_time | Wird direkt aus dem Feld CreateDate zugeordnet und in das Zeitstempelformat von Chronicle für den RESOURCE-Entitätstyp konvertiert. |
Group.Arn | entity.entity.resource.name | Wird direkt aus dem Feld Group.Arn für den Entitätstyp „GRUPPE“ zugeordnet. |
Group.CreateDate | entity.entity.group.attribute.creation_time | Wird direkt aus dem Feld Group.CreateDate zugeordnet und in das Zeitstempelformat von Chronicle konvertiert. |
Group.GroupID | entity.entity.group.product_object_id | Direkt aus dem Feld Group.GroupID zugeordnet. |
Group.GroupName | entity.entity.group.group_display_name | Direkt aus dem Feld Group.GroupName zugeordnet. |
Group.GroupName | entity.entity.group.email_addresses | Direkt aus dem Feld Group.GroupName zugeordnet. |
Group.Path | entity.entity.group.attribute.labels.value | Der Schlüssel wird direkt aus dem Feld Group.Path zugeordnet und hartcodiert auf path . |
IsTruncated | entity.entity.group.attribute.labels.value | Der Schlüssel wird direkt aus dem Feld IsTruncated zugeordnet und in einen String umgewandelt. Er ist auf is_truncated hartcodiert. |
Markierung | entity.entity.group.attribute.labels.value | Der Schlüssel wird direkt aus dem Feld Marker zugeordnet und hartcodiert auf marker . |
PasswordLastUsed | entity.entity.user.last_login_time | Wird direkt aus dem Feld PasswordLastUsed zugeordnet und in das Zeitstempelformat von Chronicle konvertiert. |
Pfad | entity.entity.user.attribute.labels.value | Der Schlüssel wird direkt aus dem Feld Path für den Entitätstyp „USER“ abgeleitet und auf path hartcodiert. |
Pfad | entity.entity.resource.attribute.labels.value | Der Schlüssel wird direkt aus dem Feld Path für den Entitätstyp RESOURCE zugeordnet und ist auf path hartcodiert. |
PermissionsBoundary.PermissionsBoundaryArn | entity.entity.resource.attribute.labels.value | Der Schlüssel wird direkt aus dem Feld PermissionsBoundary.PermissionsBoundaryArn abgeleitet und auf permissions_boundary_arn hartcodiert. |
PermissionsBoundary.PermissionsBoundaryType | entity.entity.resource.attribute.labels.value | Der Schlüssel wird direkt aus dem Feld PermissionsBoundary.PermissionsBoundaryType abgeleitet und auf permissions_boundary_type hartcodiert. |
RoleID | entity.entity.resource.product_object_id | Direkt aus dem Feld RoleID zugeordnet. |
RoleLastUsed.LastUsedDate | entity.entity.resource.attribute.labels.value | Der Schlüssel wird direkt aus dem Feld RoleLastUsed.LastUsedDate abgeleitet und auf role_last_used_date hartcodiert. |
RoleLastUsed.Region | entity.entity.location.name | Direkt aus dem Feld RoleLastUsed.Region zugeordnet. |
RoleName | entity.entity.resource.attribute.roles.name | Direkt aus dem Feld RoleName zugeordnet. |
Tags.Key | entity.entity.user.attribute.labels.key | Wird als Schlüssel für das Feld labels im Nutzerattribut verwendet. |
Tags.Value | entity.entity.user.attribute.labels.value | Wird als Wert für das Feld labels im Nutzerattribut verwendet. |
UserID | entity.entity.user.product_object_id | Direkt aus dem Feld UserID zugeordnet. |
Nutzername | entity.entity.user.userid | Direkt aus dem Feld UserName zugeordnet. |
Users.Arn | relations.entity.resource.name | Wird direkt aus dem Feld Users.Arn in der Nutzerbeziehung zugeordnet. |
Users.CreateDate | relations.entity.user.attribute.creation_time | Wird direkt aus dem Feld Users.CreateDate in der Nutzerbeziehung abgeleitet und in das Zeitstempelformat von Chronicle konvertiert. |
Users.PasswordLastUsed | relations.entity.user.last_login_time | Wird direkt aus dem Feld Users.PasswordLastUsed in der Nutzerbeziehung zugeordnet und in das Zeitstempelformat von Chronicle konvertiert. |
Users.Path | relations.entity.user.attribute.labels.value | Der Schlüssel wird direkt aus dem Feld „Users.Path “ in der Nutzerbeziehung abgeleitet und auf „path “ hartcodiert. |
Users.PermissionsBoundary.PermissionsBoundaryArn | relations.entity.resource.attribute.labels.value | Der Schlüssel wird direkt aus dem Feld „Users.PermissionsBoundary.PermissionsBoundaryArn “ in der Nutzerbeziehung abgeleitet und auf „permissions_boundary_arn “ hartcodiert. |
Users.PermissionsBoundary.PermissionsBoundaryType | relations.entity.resource.attribute.labels.value | Der Schlüssel wird direkt aus dem Feld „Users.PermissionsBoundary.PermissionsBoundaryType “ in der Nutzerbeziehung abgeleitet und auf „permissions_boundary_type “ hartcodiert. |
Users.UserID | relations.entity.user.product_object_id | Wird direkt aus dem Feld Users.UserID in der Nutzerbeziehung zugeordnet. |
Users.UserName | relations.entity.user.userid | Wird direkt aus dem Feld Users.UserName in der Nutzerbeziehung zugeordnet. |
– | entity.metadata.collected_timestamp | Wird mit dem Ereigniszeitstempel aus dem Rohprotokoll ausgefüllt. |
– | entity.metadata.vendor_name | Hartcodiert auf AWS . |
– | entity.metadata.product_name | Hartcodiert auf AWS IAM . |
– | entity.metadata.entity_type | Wird anhand der Anwesenheit bestimmter Felder bestimmt: „USER“, wenn UserID vorhanden ist, „RESOURCE“, wenn RoleName vorhanden ist, und „GROUP“, wenn Group.GroupName vorhanden ist. |
– | entity.entity.resource.resource_subtype | Für die Entitätstypen „USER“ und „GROUP“ auf User festlegen. |
– | entity.entity.resource.resource_type | Für den Entitätstyp „RESOURCE“ auf ACCESS_POLICY festlegen. |
– | entity.entity.resource.attribute.cloud.environment | Hartcodiert auf AMAZON_WEB_SERVICES . |
– | relations.entity_type | Für Nutzerbeziehungen innerhalb einer Gruppe hartcodiert auf USER . |
– | relations.relationship | Für Nutzerbeziehungen innerhalb einer Gruppe hartcodiert auf MEMBER . |
– | relations.direction | Für Nutzerbeziehungen innerhalb einer Gruppe hartcodiert auf UNIDIRECTIONAL . |
– | relations.entity.resource.resource_subtype | Für Nutzerbeziehungen innerhalb einer Gruppe hartcodiert auf User . |
Änderungen
2023-12-14
- Neu erstellter Parser.
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten