GITHUB

Unterstützt in:

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)

  1. Melden Sie sich in der Admin-Konsole für GitHub Enterprise Cloud an.
  2. Gehen Sie zu Unternehmenseinstellungen > Einstellungen > Audit-Log > Log-Streaming.
  3. Sie benötigen die Berechtigungen eines Enterprise-Inhabers, um das Streamen von Audit-Logs zu konfigurieren.
  4. 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

  1. Erstellen Sie einen Amazon S3-Bucket. Folgen Sie dazu dieser Anleitung: Bucket erstellen.
  2. Speichern Sie den Namen und die Region des Buckets zur späteren Verwendung (z. B. github-audit-logs).
  3. Erstellen Sie einen Nutzer gemäß dieser Anleitung: IAM-Nutzer erstellen.
  4. Wählen Sie den erstellten Nutzer aus.
  5. Wählen Sie den Tab Sicherheitsanmeldedaten aus.
  6. Klicken Sie im Abschnitt Zugriffsschlüssel auf Zugriffsschlüssel erstellen.
  7. Wählen Sie Drittanbieterdienst als Anwendungsfall aus.
  8. Klicken Sie auf Weiter.
  9. Optional: Fügen Sie ein Beschreibungstag hinzu.
  10. Klicken Sie auf Zugriffsschlüssel erstellen.
  11. 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.
  12. Klicken Sie auf Fertig.

IAM-Richtlinie für GitHub S3-Streaming konfigurieren

  1. Rufen Sie in der AWS-Konsole IAM > Richtlinien > Richtlinie erstellen > Tab „JSON“ auf.
  2. Kopieren Sie die folgende Richtlinie und fügen Sie sie ein.
  3. 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/*"
        }
    ]
    }
    
  4. Klicken Sie auf Weiter > Richtlinie erstellen.

  5. Geben Sie der Richtlinie den Namen GitHubAuditStreamingPolicy und klicken Sie auf Richtlinie erstellen.

  6. Kehren Sie zum zuvor erstellten IAM-Nutzer zurück.

  7. Wählen Sie den Tab Berechtigungen aus.

  8. Klicken Sie auf Berechtigungen hinzufügen > Richtlinien direkt anhängen.

  9. Suchen Sie nach GitHubAuditStreamingPolicy und wählen Sie den Eintrag aus.

  10. Klicken Sie auf Weiter > Berechtigungen hinzufügen.

Streaming von GitHub Enterprise Cloud-Audit-Logs konfigurieren

  1. Melden Sie sich als Enterprise-Inhaber bei GitHub Enterprise Cloud an.
  2. Klicken Sie auf Ihr Profilbild und dann auf Enterprise-Einstellungen.
  3. Klicken Sie in der Seitenleiste des Unternehmenskontos auf Einstellungen> Audit-Log> Log-Streaming.
  4. Wählen Sie Stream konfigurieren aus und klicken Sie auf Amazon S3.
  5. Klicken Sie unter Authentifizierung auf Zugriffsschlüssel.
  6. 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.
  7. Klicken Sie auf Endpunkt prüfen, um zu prüfen, ob GitHub eine Verbindung zum Amazon S3-Endpunkt herstellen und Daten darauf schreiben kann.
  8. Nachdem Sie den Endpunkt erfolgreich bestätigt haben, klicken Sie auf Speichern.

IAM-Nutzer mit Lesezugriff und Schlüssel für Google SecOps erstellen

  1. Rufen Sie die AWS-Konsole > IAM > Nutzer > Nutzer hinzufügen auf.
  2. Klicken Sie auf Add users (Nutzer hinzufügen).
  3. Geben Sie die folgenden Konfigurationsdetails an:
    • Nutzer: Geben Sie secops-reader ein.
    • Zugriffstyp: Wählen Sie Zugriffsschlüssel – programmatischer Zugriff aus.
  4. Klicken Sie auf Nutzer erstellen.
  5. Hängen Sie die benutzerdefinierte Richtlinie mit minimalen Leseberechtigungen an: Nutzer > secops-reader > Berechtigungen > Berechtigungen hinzufügen > Richtlinien direkt anhängen > Richtlinie erstellen.
  6. 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"
        }
    ]
    }
    
  7. Name = secops-reader-policy.

  8. Klicken Sie auf Richtlinie erstellen> suchen/auswählen > Weiter> Berechtigungen hinzufügen.

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

  1. Rufen Sie die SIEM-Einstellungen > Feeds auf.
  2. Klicken Sie auf + Neuen Feed hinzufügen.
  3. Geben Sie im Feld Feed name (Feedname) einen Namen für den Feed ein, z. B. GitHub audit logs.
  4. Wählen Sie Amazon S3 V2 als Quelltyp aus.
  5. Wählen Sie GitHub als Logtyp aus.
  6. Klicken Sie auf Weiter.
  7. 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.
  8. Klicken Sie auf Weiter.
  9. 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