AWS IAM-Logs erfassen
In diesem Dokument wird beschrieben, wie Sie AWS IAM-Logs in Google Security Operations aufnehmen. Der Parser wandelt Rohlogs 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 den entsprechenden UDM-Feldern zugeordnet, um eine konsistente Sicherheitsanalyse zu ermöglichen.
Hinweise
- Prüfen Sie, ob Sie eine Google SecOps-Instanz haben.
- Prüfen Sie, ob Sie privilegierten Zugriff auf AWS haben.
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 die spätere Verwendung.
- Erstellen Sie einen Nutzer gemäß dieser Anleitung: IAM-Nutzer erstellen.
- Wählen Sie den erstellten Nutzer aus.
- Wählen Sie den Tab Sicherheitsanmeldedaten aus.
- Klicken Sie im Abschnitt Zugriffsschlüssel auf Zugriffsschlüssel erstellen.
- Wählen Sie als Anwendungsfall Drittanbieterdienst aus.
- Klicken Sie auf Weiter.
- Optional: Fügen Sie ein Beschreibungstag hinzu.
- Klicken Sie auf Zugriffsschlüssel erstellen.
- Klicken Sie auf CSV-Datei herunterladen, um den Access Key (Zugriffsschlüssel) und den Secret Access Key (geheimer Zugriffsschlüssel) für die spätere 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 so konfigurieren, dass IAM-Logs erfasst werden
- Melden Sie sich bei der AWS Management Console an.
- Geben Sie in der Suchleiste CloudTrail ein und wählen Sie den Dienst aus der Liste aus.
- Klicken Sie auf Trail erstellen.
- Geben Sie einen Trail name an, z. B.
IAMActivityTrail
.- Testzeitraum 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 keine erstellt wurde.
- 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 Logs in S3 exportiert werden
- Gehen Sie zu Services > 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 Logs 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 Logs in mehreren Versionen gespeichert werden.
Rufen Sie Properties> Bucket Versioning> Enable auf.
Optional: Lambda für den Echtzeit-Export konfigurieren
- Rufen Sie die AWS Lambda-Konsole auf.
- Klicken Sie auf Funktion erstellen.
- Wählen Sie Von Grund auf neu erstellen aus.
- Legen Sie
ExportIAMLogsToS3
als Funktionsnamen fest. - Wählen Sie eine Python 3.x-Laufzeit aus.
Weisen Sie der Funktion eine IAM-Rolle mit Berechtigungen für Folgendes 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-Logs 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 Namen Ihres Buckets.
Lambda-Trigger für CloudWatch Logs konfigurieren
- Rufen Sie in der Lambda Console den Designer auf.
- Wählen Sie Trigger hinzufügen > CloudWatch Logs aus.
- Wählen Sie die CloudWatch Logs-Loggruppe aus, die mit Ihren IAM-Logs verknüpft ist, z. B.
/aws/cloudtrail/
. - Klicken Sie auf Hinzufügen.
Feed in Google SecOps konfigurieren, um AWS IAM-Logs aufzunehmen
- Rufen Sie die SIEM-Einstellungen> Feeds auf.
- Klicken Sie auf Neu hinzufügen.
- Geben Sie im Feld Feed name (Feedname) einen Namen für den Feed ein, z. B. AWS IAM Logs (AWS IAM-Logs).
- Wählen Sie Amazon S3 als Quelltyp 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 Option aus.
Zugriffsschlüssel-ID: Der Nutzerzugriffsschlüssel mit Zugriff auf den S3-Bucket.
Secret Access Key (Geheimer Zugriffsschlüssel): 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 | Direkt aus dem Feld Arn für die Entitätstypen USER und RESOURCE zugeordnet. Für den Entitätstyp „GROUP“ wird er aus Group.Arn zugeordnet. |
AssumeRolePolicyDocument | entity.entity.resource.attribute.permissions.name | Direkt aus dem Feld AssumeRolePolicyDocument zugeordnet, aber nur für den Entitätstyp RESOURCE. |
CreateDate | entity.entity.user.attribute.creation_time | Direkt aus dem Feld CreateDate zugeordnet und in das Zeitstempelformat von Chronicle für den Entitätstyp USER konvertiert. |
CreateDate | entity.entity.resource.attribute.creation_time | Direkt aus dem Feld CreateDate zugeordnet und für den Entitätstyp „RESOURCE“ in das Zeitstempelformat von Chronicle konvertiert. |
Group.Arn | entity.entity.resource.name | Direkt aus dem Feld Group.Arn für den Entitätstyp GROUP zugeordnet. |
Group.CreateDate | entity.entity.group.attribute.creation_time | 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 ist fest auf path codiert. |
IsTruncated | entity.entity.group.attribute.labels.value | Der Schlüssel wird direkt aus dem Feld IsTruncated zugeordnet und in einen String konvertiert. Er ist fest auf is_truncated codiert. |
Markierung | entity.entity.group.attribute.labels.value | Der Schlüssel wird direkt aus dem Feld Marker zugeordnet und ist fest auf marker codiert. |
PasswordLastUsed | entity.entity.user.last_login_time | 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 ist fest auf path codiert. |
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 fest auf path codiert. |
PermissionsBoundary.PermissionsBoundaryArn | entity.entity.resource.attribute.labels.value | Der Schlüssel wird direkt aus dem Feld PermissionsBoundary.PermissionsBoundaryArn zugeordnet und ist hartcodiert auf permissions_boundary_arn . |
PermissionsBoundary.PermissionsBoundaryType | entity.entity.resource.attribute.labels.value | Der Schlüssel wird direkt aus dem Feld PermissionsBoundary.PermissionsBoundaryType zugeordnet und ist hartcodiert auf permissions_boundary_type . |
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 zugeordnet und ist hartcodiert auf role_last_used_date . |
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 | Direkt aus dem Feld Users.Arn in der Nutzerbeziehung abgeleitet. |
Users.CreateDate | relations.entity.user.attribute.creation_time | Direkt aus dem Feld Users.CreateDate in der Nutzerbeziehung zugeordnet und in das Zeitstempelformat von Chronicle konvertiert. |
Users.PasswordLastUsed | relations.entity.user.last_login_time | 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 zugeordnet und ist fest auf path codiert. |
Users.PermissionsBoundary.PermissionsBoundaryArn | relations.entity.resource.attribute.labels.value | Der Schlüssel wird direkt aus dem Feld Users.PermissionsBoundary.PermissionsBoundaryArn in der Nutzerbeziehung zugeordnet und ist fest auf permissions_boundary_arn codiert. |
Users.PermissionsBoundary.PermissionsBoundaryType | relations.entity.resource.attribute.labels.value | Der Schlüssel wird direkt aus dem Feld Users.PermissionsBoundary.PermissionsBoundaryType in der Nutzerbeziehung zugeordnet und ist fest auf permissions_boundary_type codiert. |
Users.UserID | relations.entity.user.product_object_id | Direkt aus dem Feld Users.UserID in der Nutzerbeziehung abgeleitet. |
Users.UserName | relations.entity.user.userid | Direkt aus dem Feld Users.UserName in der Nutzerbeziehung abgeleitet. |
– | entity.metadata.collected_timestamp | Wird mit dem Ereigniszeitstempel aus dem Rohlog gefüllt. |
– | entity.metadata.vendor_name | Hartcodiert auf AWS . |
– | entity.metadata.product_name | Hartcodiert auf AWS IAM . |
– | entity.metadata.entity_type | Wird anhand des Vorhandenseins 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 | Auf User für die Entitätstypen USER und GROUP festgelegt. |
– | entity.entity.resource.resource_type | Auf ACCESS_POLICY für den Entitätstyp RESOURCE festgelegt. |
– | entity.entity.resource.attribute.cloud.environment | Hartcodiert auf AMAZON_WEB_SERVICES . |
– | relations.entity_type | Für Nutzerbeziehungen innerhalb einer Gruppe ist USER fest codiert. |
– | relations.relationship | Für Nutzerbeziehungen innerhalb einer Gruppe ist MEMBER fest codiert. |
– | relations.direction | Für Nutzerbeziehungen innerhalb einer Gruppe ist UNIDIRECTIONAL fest codiert. |
– | relations.entity.resource.resource_subtype | Für Nutzerbeziehungen innerhalb einer Gruppe ist User fest codiert. |
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten