GITHUB
In diesem Dokument wird beschrieben, wie Sie GitHub-Audit-Logs mithilfe von Amazon S3 in Google Security Operations aufnehmen. Der Parser versucht, Daten aus dem Feld „message“ mit verschiedenen Grok-Mustern zu extrahieren, wobei sowohl JSON- als auch Nicht-JSON-Formate verarbeitet werden. Anhand des extrahierten „process_type“ wird eine bestimmte Parsing-Logik mit grok, kv und anderen Filtern angewendet, um die Logrohdaten dem Schema für einheitliche Datenmodelle (Unified Data Model, UDM) zuzuordnen.
Hinweise
Prüfen Sie, ob folgende Voraussetzungen erfüllt sind:
- Google SecOps-Instanz.
- Privilegierter Zugriff auf den GitHub Enterprise Cloud-Mandanten mit Berechtigungen als Enterprise-Inhaber.
- Privilegierter Zugriff auf AWS (S3, IAM).
Voraussetzungen für GitHub Enterprise Cloud (Enterprise-Zugriff)
- Melden Sie sich in der Admin-Konsole für GitHub Enterprise Cloud an.
- Gehen Sie zu Unternehmenseinstellungen > Einstellungen > Audit-Log > Log-Streaming.
- Sie benötigen die Berechtigungen eines Enterprise-Inhabers, um das Streamen von Audit-Logs zu konfigurieren.
- Kopieren und speichern Sie die folgenden Details an einem sicheren Ort:
- Name von GitHub Enterprise
- Namen von Organisationen im Unternehmen
AWS S3-Bucket und Identity and Access Management für Google SecOps konfigurieren
- Erstellen Sie einen Amazon S3-Bucket. Folgen Sie dazu dieser Anleitung: Bucket erstellen.
- Speichern Sie den Namen und die Region des Buckets zur späteren Verwendung (z. B.
github-audit-logs
). - 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 Drittanbieterdienst als Anwendungsfall 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 zukünftige Verwendung zu speichern.
- Klicken Sie auf Fertig.
IAM-Richtlinie für GitHub S3-Streaming konfigurieren
- Rufen Sie in der AWS-Konsole IAM > Richtlinien > Richtlinie erstellen > Tab „JSON“ auf.
- Kopieren Sie die folgende Richtlinie und fügen Sie sie ein.
Policy JSON (ersetzen Sie
github-audit-logs
, wenn Sie einen anderen Bucket-Namen eingegeben haben):{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutObjects", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::github-audit-logs/*" } ] }
Klicken Sie auf Weiter > Richtlinie erstellen.
Geben Sie der Richtlinie den Namen
GitHubAuditStreamingPolicy
und klicken Sie auf Richtlinie erstellen.Kehren Sie zum zuvor erstellten IAM-Nutzer zurück.
Wählen Sie den Tab Berechtigungen aus.
Klicken Sie auf Berechtigungen hinzufügen > Richtlinien direkt anhängen.
Suchen Sie nach
GitHubAuditStreamingPolicy
und wählen Sie den Eintrag aus.Klicken Sie auf Weiter > Berechtigungen hinzufügen.
Streaming von GitHub Enterprise Cloud-Audit-Logs konfigurieren
- Melden Sie sich als Enterprise-Inhaber bei GitHub Enterprise Cloud an.
- Klicken Sie auf Ihr Profilbild und dann auf Enterprise-Einstellungen.
- Klicken Sie in der Seitenleiste des Unternehmenskontos auf Einstellungen> Audit-Log> Log-Streaming.
- Wählen Sie Stream konfigurieren aus und klicken Sie auf Amazon S3.
- Klicken Sie unter Authentifizierung auf Zugriffsschlüssel.
- Geben Sie die folgenden Konfigurationsdetails an:
- Region: Wählen Sie die Region des Buckets aus, z. B.
us-east-1
. - Bucket: Geben Sie den Namen des Buckets ein, in den Sie streamen möchten, z. B.
github-audit-logs
. - Zugriffsschlüssel-ID: Geben Sie die Zugriffsschlüssel-ID des IAM-Nutzers ein.
- Secret Key (Geheimer Schlüssel): Geben Sie Ihren geheimen Schlüssel des IAM-Nutzers ein.
- Region: Wählen Sie die Region des Buckets aus, z. B.
- Klicken Sie auf Endpunkt prüfen, um zu prüfen, ob GitHub eine Verbindung zum Amazon S3-Endpunkt herstellen und Daten darauf schreiben kann.
- Nachdem Sie den Endpunkt erfolgreich bestätigt haben, klicken Sie auf Speichern.
IAM-Nutzer mit Lesezugriff und Schlüssel für Google SecOps erstellen
- Rufen Sie die AWS-Konsole > IAM > Nutzer > Nutzer hinzufügen auf.
- Klicken Sie auf Add users (Nutzer hinzufügen).
- Geben Sie die folgenden Konfigurationsdetails an:
- Nutzer: Geben Sie
secops-reader
ein. - Zugriffstyp: Wählen Sie Zugriffsschlüssel – programmatischer Zugriff aus.
- Nutzer: Geben Sie
- Klicken Sie auf Nutzer erstellen.
- Hängen Sie die benutzerdefinierte Richtlinie mit minimalen Leseberechtigungen an: Nutzer > secops-reader > Berechtigungen > Berechtigungen hinzufügen > Richtlinien direkt anhängen > Richtlinie erstellen.
JSON:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::github-audit-logs/*" }, { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::github-audit-logs" } ] }
Name =
secops-reader-policy
.Klicken Sie auf Richtlinie erstellen> suchen/auswählen > Weiter> Berechtigungen hinzufügen.
Erstellen Sie einen Zugriffsschlüssel für
secops-reader
: Sicherheitsanmeldedaten > Zugriffsschlüssel > Zugriffsschlüssel erstellen >.CSV
herunterladen (diese Werte fügen Sie in den Feed ein).
Feed in Google SecOps konfigurieren, um GitHub-Logs aufzunehmen
- Rufen Sie die SIEM-Einstellungen > Feeds auf.
- Klicken Sie auf + Neuen Feed hinzufügen.
- Geben Sie im Feld Feed name (Feedname) einen Namen für den Feed ein, z. B.
GitHub audit logs
. - Wählen Sie Amazon S3 V2 als Quelltyp aus.
- Wählen Sie GitHub als Logtyp aus.
- Klicken Sie auf Weiter.
- Geben Sie Werte für die folgenden Eingabeparameter an:
- S3-URI:
s3://github-audit-logs/
- Optionen zum Löschen von Quellen: Wählen Sie die gewünschte Option zum Löschen aus.
- Maximales Dateialter: Dateien einschließen, die in den letzten Tagen geändert wurden. Der Standardwert ist 180 Tage.
- Zugriffsschlüssel-ID: Zugriffsschlüssel des Nutzers mit Zugriff auf den S3-Bucket.
- Secret Access Key (Geheimer Zugriffsschlüssel): Geheimer Nutzersicherheitsschlüssel mit Zugriff auf den S3-Bucket.
- Asset-Namespace: der Asset-Namespace.
- Aufnahmelabels: Das Label, das auf die Ereignisse aus diesem Feed angewendet wird.
- S3-URI:
- 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 |
---|---|---|
actor |
principal.user.userid |
Der Wert wird aus dem Feld actor übernommen. |
actor_id |
principal.user.attribute.labels.value |
Der Wert wird aus dem Feld actor_id übernommen. |
actor_ip |
principal.ip |
Der Wert wird aus dem Feld actor_ip übernommen. |
actor_location.country_code |
principal.location.country_or_region |
Der Wert wird aus dem Feld actor_location.country_code übernommen. |
application_name |
target.application |
Der Wert wird aus dem Feld application_name übernommen. |
business |
target.user.company_name |
Der Wert wird aus dem Feld business übernommen. |
business_id |
target.resource.attribute.labels.value |
Der Wert wird aus dem Feld business_id übernommen. |
config.url |
target.url |
Der Wert wird aus dem Feld config.url übernommen. |
created_at |
metadata.event_timestamp |
Der Wert wird von UNIX-Millisekunden in einen Zeitstempel konvertiert. |
data.cancelled_at |
extensions.vulns.vulnerabilities.scan_end_time |
Der Wert wird vom ISO8601-Format in einen Zeitstempel konvertiert. |
data.email |
target.email |
Der Wert wird aus dem Feld data.email übernommen. |
data.event |
security_result.about.labels.value |
Der Wert wird aus dem Feld data.event übernommen. |
data.events |
security_result.about.labels.value |
Der Wert wird aus dem Feld data.events übernommen. |
data.head_branch |
security_result.about.labels.value |
Der Wert wird aus dem Feld data.head_branch übernommen. |
data.head_sha |
target.file.sha256 |
Der Wert wird aus dem Feld data.head_sha übernommen. |
data.hook_id |
target.resource.attribute.labels.value |
Der Wert wird aus dem Feld data.hook_id übernommen. |
data.started_at |
extensions.vulns.vulnerabilities.scan_start_time |
Der Wert wird vom ISO8601-Format in einen Zeitstempel konvertiert. |
data.team |
target.user.group_identifiers |
Der Wert wird aus dem Feld data.team übernommen. |
data.trigger_id |
security_result.about.labels.value |
Der Wert wird aus dem Feld data.trigger_id übernommen. |
data.workflow_id |
security_result.about.labels.value |
Der Wert wird aus dem Feld data.workflow_id übernommen. |
data.workflow_run_id |
security_result.about.labels.value |
Der Wert wird aus dem Feld data.workflow_run_id übernommen. |
enterprise.name |
additional.fields.value.string_value |
Der Wert wird aus dem Feld enterprise.name übernommen. |
external_identity_nameid |
target.user.email_addresses |
Wenn der Wert eine E-Mail-Adresse ist, wird er dem target.user.email_addresses -Array hinzugefügt. |
external_identity_nameid |
target.user.userid |
Der Wert wird aus dem Feld external_identity_nameid übernommen. |
external_identity_username |
target.user.user_display_name |
Der Wert wird aus dem Feld external_identity_username übernommen. |
hashed_token |
network.session_id |
Der Wert wird aus dem Feld hashed_token übernommen. |
job_name |
target.resource.attribute.labels.value |
Der Wert wird aus dem Feld job_name übernommen. |
job_workflow_ref |
target.resource.attribute.labels.value |
Der Wert wird aus dem Feld job_workflow_ref übernommen. |
org |
target.administrative_domain |
Der Wert wird aus dem Feld org übernommen. |
org_id |
additional.fields.value.string_value |
Der Wert wird aus dem Feld org_id übernommen. |
programmatic_access_type |
additional.fields.value.string_value |
Der Wert wird aus dem Feld programmatic_access_type übernommen. |
public_repo |
additional.fields.value.string_value |
Der Wert wird aus dem Feld public_repo übernommen. |
public_repo |
target.location.name |
Wenn der Wert „false“ ist, wird er „PRIVATE“ zugeordnet. Andernfalls wird sie „PUBLIC“ zugeordnet. |
query_string |
additional.fields.value.string_value |
Der Wert wird aus dem Feld query_string übernommen. |
rate_limit_remaining |
additional.fields.value.string_value |
Der Wert wird aus dem Feld rate_limit_remaining übernommen. |
repo |
target.resource.name |
Der Wert wird aus dem Feld repo übernommen. |
repo_id |
additional.fields.value.string_value |
Der Wert wird aus dem Feld repo_id übernommen. |
repository_public |
additional.fields.value.string_value |
Der Wert wird aus dem Feld repository_public übernommen. |
request_body |
additional.fields.value.string_value |
Der Wert wird aus dem Feld request_body übernommen. |
request_method |
network.http.method |
Der Wert wird in Großbuchstaben umgewandelt. |
route |
additional.fields.value.string_value |
Der Wert wird aus dem Feld route übernommen. |
status_code |
network.http.response_code |
Der Wert wird in eine Ganzzahl konvertiert. |
timestamp |
metadata.event_timestamp |
Der Wert wird von UNIX-Millisekunden in einen Zeitstempel konvertiert. |
token_id |
additional.fields.value.string_value |
Der Wert wird aus dem Feld token_id übernommen. |
token_scopes |
additional.fields.value.string_value |
Der Wert wird aus dem Feld token_scopes übernommen. |
transport_protocol_name |
network.application_protocol |
Der Wert wird in Großbuchstaben umgewandelt. |
url_path |
target.url |
Der Wert wird aus dem Feld url_path übernommen. |
user |
target.user.user_display_name |
Der Wert wird aus dem Feld user übernommen. |
user_agent |
network.http.user_agent |
Der Wert wird aus dem Feld user_agent übernommen. |
user_agent |
network.http.parsed_user_agent |
Der Wert wird geparst. |
user_id |
target.user.userid |
Der Wert wird aus dem Feld user_id übernommen. |
workflow.name |
security_result.about.labels.value |
Der Wert wird aus dem Feld workflow.name übernommen. |
workflow_run.actor.login |
principal.user.userid |
Der Wert wird aus dem Feld workflow_run.actor.login übernommen. |
workflow_run.event |
additional.fields.value.string_value |
Der Wert wird aus dem Feld workflow_run.event übernommen. |
workflow_run.head_branch |
security_result.about.labels.value |
Der Wert wird aus dem Feld workflow_run.head_branch übernommen. |
workflow_run.head_sha |
target.file.sha256 |
Der Wert wird aus dem Feld workflow_run.head_sha übernommen. |
workflow_run.id |
target.resource.attribute.labels.value |
Der Wert wird aus dem Feld workflow_run.id übernommen. |
workflow_run.workflow_id |
security_result.about.labels.value |
Der Wert wird aus dem Feld workflow_run.workflow_id übernommen. |
– | metadata.event_type |
Der Wert wird anhand der Felder action und actor bestimmt. Wenn das Feld action „_member“ enthält, wird der Wert auf „USER_RESOURCE_UPDATE_PERMISSIONS“ gesetzt. Wenn das Feld action nicht leer ist und das Feld actor nicht leer ist, wird der Wert auf „USER_RESOURCE_UPDATE_CONTENT“ gesetzt. Andernfalls wird der Wert auf „USER_RESOURCE_ACCESS“ festgelegt. |
– | metadata.log_type |
Der Wert ist auf „GITHUB“ festgelegt. |
– | metadata.product_name |
Der Wert ist auf „GITHUB“ festgelegt. |
– | metadata.vendor_name |
Der Wert ist auf „GITHUB“ festgelegt. |
– | target.resource.resource_type |
Der Wert wird auf „STORAGE_OBJECT“ festgelegt. |
– | security_result.about.labels.key |
Der Wert wird auf einen konstanten String basierend auf dem entsprechenden data -Feld festgelegt. Für data.workflow_id wird der Schlüssel beispielsweise auf „Workflow-ID“ festgelegt. |
– | target.resource.attribute.labels.key |
Der Wert wird auf einen konstanten String basierend auf dem entsprechenden data -Feld festgelegt. Für data.hook_id wird der Schlüssel beispielsweise auf „Hook Id“ festgelegt. |
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten