Raccogli i log di Oracle Cloud Infrastructure Audit

Supportato in:

Questo documento spiega come importare i log di controllo di Oracle Cloud Infrastructure (OCI) in Google Security Operations utilizzando uno dei seguenti metodi:

  • Metodo 1: Cloud Storage: una funzione OCI scrive i log in un bucket Cloud Storage e un feed di Google SecOps li legge dal bucket.
  • Metodo 2: webhook: una funzione OCI invia i log direttamente a un feed webhook di Google SecOps. Questo metodo non utilizza un bucket Cloud Storage.

Entrambi i metodi utilizzano OCI Connector Hub per inviare gli audit log alla funzione, perché OCI non può inviare i log direttamente a Cloud Storage o a un endpoint HTTPS.

Il servizio di controllo di Oracle Cloud Infrastructure registra automaticamente le chiamate a tutti gli endpoint API pubblici OCI supportati come eventi di log. Tutti i servizi supportano il logging tramite OCI Audit. Gli eventi dei log registrati da OCI Audit includono le chiamate API effettuate dalla console OCI, dalla CLI, dagli SDK, dai tuoi client personalizzati o da altri servizi OCI.

Prima di iniziare

Assicurati di soddisfare i seguenti prerequisiti:

  • Un'istanza Google SecOps
  • Accesso con privilegi alla console Oracle Cloud, con autorizzazioni per creare e gestire:
    • Connettori Connector Hub
    • Applicazioni e funzioni di Functions
    • Criteri IAM
  • Una subnet VCN con accesso a internet per la funzione OCI
  • OCI Cloud Shell o un ambiente locale con l'interfaccia a riga di comando Fn
  • Per il metodo 1: un progetto Google Cloud con l'API Storage di Cloud abilitata e le autorizzazioni per creare bucket Cloud Storage, service account e policy di Identity and Access Management (IAM) per i bucket
  • Per il metodo 2: autorizzazione per creare chiavi API nel progetto Google Cloud collegato alla tua istanza di Google SecOps

Metodo 1: Cloud Storage

Crea un bucket Cloud Storage

  1. Vai alla consoleGoogle Cloud .
  2. Seleziona il tuo progetto o creane uno nuovo.
  3. Nel menu di navigazione, vai a Cloud Storage > Bucket.
  4. Fai clic su Crea bucket.
  5. Fornisci i seguenti dettagli di configurazione:

    Impostazione Valore
    Assegna un nome al bucket Inserisci un nome globalmente univoco (ad esempio oci-audit-logs-gcs)
    Tipo di località Scegli in base alle tue esigenze (regione singola, a due regioni, multiregionale)
    Località Seleziona la località (ad esempio us-central1)
    Classe di archiviazione Standard (consigliato per i log ad accesso frequente)
    Controllo degli accessi Uniforme (consigliato)
    Strumenti di protezione (Facoltativo) Abilita il controllo delle versioni degli oggetti o la policy di conservazione
  6. Fai clic su Crea.

Configura OCI per esportare gli audit log in Cloud Storage

Oracle Cloud Infrastructure non supporta l'esportazione integrata in Cloud Storage. Utilizzi l'hub del connettore di servizi OCI con una funzione per inoltrare gli audit log a Cloud Storage.

Crea una funzione OCI per inoltrare i log a Cloud Storage

  1. Accedi alla console Oracle Cloud.
  2. Vai a Developer Services > Functions > Applications.
  3. Seleziona il compartimento in cui vuoi creare l'applicazione della funzione.
  4. Fai clic su Crea applicazione.
  5. Fornisci i seguenti dettagli di configurazione:
    • Nome: inserisci audit-logs-to-gcs-app.
    • VCN: seleziona una rete cloud virtuale.
    • Subnet: seleziona una subnet con accesso a internet.
  6. Fai clic su Crea.
  7. Dopo aver creato l'applicazione, fai clic su Getting Started (Per iniziare) e segui le istruzioni per configurare l'ambiente di sviluppo locale con l'interfaccia a riga di comando Fn.
  8. Crea una nuova directory delle funzioni sulla tua macchina locale:

    mkdir oci-audit-to-gcs
    cd oci-audit-to-gcs
    
  9. Inizializza una funzione Python:

    fn init --runtime python oci-audit-to-gcs
    cd oci-audit-to-gcs
    
  10. Sostituisci i contenuti di func.py con il seguente codice:

    import io
    import json
    import logging
    import os
    from fdk import response
    from google.cloud import storage
    from google.oauth2 import service_account
    from datetime import datetime
    
    # Configure logging
    logging.basicConfig(level=logging.INFO)
    logger = logging.getLogger()
    
    # Environment variables
    GCS_BUCKET = os.environ.get('GCS_BUCKET')
    GCS_PREFIX = os.environ.get('GCS_PREFIX', 'oci-audit-logs')
    GCS_CREDENTIALS_JSON = os.environ.get('GCS_CREDENTIALS_JSON')
    
    def handler(ctx, data: io.BytesIO = None):
        """
        Oracle Cloud Infrastructure Function to forward Audit logs to GCS.
    
        Args:
            ctx: Function context
            data: Input data containing Audit log events
        """
    
        if not all([GCS_BUCKET, GCS_CREDENTIALS_JSON]):
            logger.error('Missing required environment variables: GCS_BUCKET or GCS_CREDENTIALS_JSON')
            return response.Response(
                ctx, response_data=json.dumps({"error": "Missing configuration"}),
                headers={"Content-Type": "application/json"}
            )
    
        try:
            # Parse input data
            body = json.loads(data.getvalue())
            logger.info(f"Received event: {json.dumps(body)}")
    
            # Extract log entries
            log_entries = []
            if isinstance(body, list):
                log_entries = body
            elif isinstance(body, dict):
                # Service Connector Hub sends data in specific format
                if 'data' in body:
                    log_entries = [body['data']] if isinstance(body['data'], dict) else body['data']
                else:
                    log_entries = [body]
    
            if not log_entries:
                logger.info("No log entries to process")
                return response.Response(
                    ctx, response_data=json.dumps({"status": "no_logs"}),
                    headers={"Content-Type": "application/json"}
                )
    
            # Initialize GCS client with service account credentials
            credentials_dict = json.loads(GCS_CREDENTIALS_JSON)
            credentials = service_account.Credentials.from_service_account_info(credentials_dict)
            storage_client = storage.Client(credentials=credentials, project=credentials_dict.get('project_id'))
            bucket = storage_client.bucket(GCS_BUCKET)
    
            # Write logs to GCS as NDJSON
            timestamp = datetime.utcnow().strftime('%Y%m%d_%H%M%S_%f')
            object_key = f"{GCS_PREFIX}/logs_{timestamp}.ndjson"
            blob = bucket.blob(object_key)
    
            ndjson = '\n'.join([json.dumps(entry, ensure_ascii=False) for entry in log_entries]) + '\n'
            blob.upload_from_string(ndjson, content_type='application/x-ndjson')
    
            logger.info(f"Wrote {len(log_entries)} records to gs://{GCS_BUCKET}/{object_key}")
    
            return response.Response(
                ctx, response_data=json.dumps({"status": "success", "records": len(log_entries)}),
                headers={"Content-Type": "application/json"}
            )
    
        except Exception as e:
            logger.error(f'Error processing logs: {str(e)}')
            return response.Response(
                ctx, response_data=json.dumps({"error": str(e)}),
                headers={"Content-Type": "application/json"},
                status_code=500
            )
    

  11. Aggiorna requirements.txt con le seguenti dipendenze:

    fdk>=0.1.0
    google-cloud-storage>=2.0.0
    google-auth>=2.0.0
    
  12. Esegui il deployment della funzione in OCI:

    fn -v deploy --app audit-logs-to-gcs-app
    
  13. Al termine del deployment, prendi nota dell'OCID della funzione. Lo utilizzerai nel prossimo passaggio.

Configura le variabili di ambiente delle funzioni

  1. Nella console Oracle Cloud, vai a Developer Services > Functions > Applications.
  2. Fai clic sull'applicazione (audit-logs-to-gcs-app).
  3. Fai clic sul nome della funzione (oci-audit-to-gcs).
  4. Fai clic su Configurazione.
  5. Aggiungi le seguenti variabili di configurazione:

    Chiave Valore
    GCS_BUCKET Il nome del tuo bucket Cloud Storage (ad esempio, oci-audit-logs-gcs)
    GCS_PREFIX Prefisso per i file di log (ad esempio oci-audit-logs)
    GCS_CREDENTIALS_JSON Stringa JSON della chiave del service account Google Cloud (vedi sotto)
  6. Fai clic su Salva modifiche.

Crea un service account Google Cloud per la funzione OCI

La funzione OCI richiede un service account Google Cloud per scrivere nel bucket Cloud Storage.

  1. Nella consoleGoogle Cloud , vai a IAM e amministrazione > Account di servizio.
  2. Fai clic su Crea account di servizio.
  3. Fornisci i seguenti dettagli di configurazione:
    • Nome service account: inserisci oci-function-gcs-writer.
    • Descrizione service account: inserisci Service account for OCI Function to write Audit logs to GCS.
  4. Fai clic su Crea e continua.
  5. Nella sezione Concedi a questo account di servizio l'accesso al progetto, aggiungi il seguente ruolo:
    1. Fai clic su Seleziona un ruolo.
    2. Cerca e seleziona Storage Object Admin.
  6. Fai clic su Continua.
  7. Fai clic su Fine.
  8. Fai clic sull'indirizzo email del account di servizio appena creato.
  9. Vai alla scheda Chiavi.
  10. Fai clic su Aggiungi chiave > Crea nuova chiave.
  11. Seleziona JSON come tipo di chiave.
  12. Fai clic su Crea.
  13. Il file della chiave JSON verrà scaricato sul computer.
  14. Apri il file della chiave JSON e copia tutti i contenuti.
  15. Torna alla configurazione della funzione della console Oracle Cloud.
  16. Incolla i contenuti JSON nella variabile di configurazione GCS_CREDENTIALS_JSON.

Concedi le autorizzazioni IAM sul bucket Cloud Storage

Concedi al account di servizio le autorizzazioni in scrittura sul bucket Cloud Storage:

  1. Vai a Cloud Storage > Bucket.
  2. Fai clic sul nome del bucket (oci-audit-logs-gcs).
  3. Vai alla scheda Autorizzazioni.
  4. Fai clic su Concedi l'accesso.
  5. Fornisci i seguenti dettagli di configurazione:
    • Aggiungi entità: inserisci l'indirizzo email del account di servizio (oci-function-gcs-writer@PROJECT_ID.iam.gserviceaccount.com).
    • Assegna i ruoli: seleziona Storage Object Admin.
  6. Fai clic su Salva.

Crea un hub del connettore di servizi OCI

  1. Accedi alla console Oracle Cloud.
  2. Vai a Observability & Management > Logging > Service Connector Hub.
  3. Seleziona il compartimento in cui vuoi creare il connettore di servizio.
  4. Fai clic su Crea connettore di servizi.
  5. Fornisci i seguenti dettagli di configurazione:

    • Informazioni sul connettore di servizio:

      Impostazione Valore
      Nome connettore Inserisci audit-logs-to-gcs-connector
      Descrizione Inserisci Forward OCI Audit logs to Cloud Storage
      Scomparto per le risorse Seleziona il compartimento
    • Configura l'origine:

      Impostazione Valore
      Origine Seleziona Logging
      Compartment Seleziona il compartimento contenente gli audit log
      Gruppo di log Seleziona _Audit (gruppo di log predefinito per gli audit log)
  6. Fai clic su + Another Log (+ Un altro log).

  7. Seleziona l'audit log per il tuo compartimento (ad esempio, _Audit_Include_Subcompartment).

    • Configura la destinazione:

      Impostazione Valore
      Destinazione Seleziona Funzioni
      Scomparto per le funzioni Seleziona il compartimento contenente la funzione
      Applicazione della funzione Seleziona audit-logs-to-gcs-app
      Funzione Seleziona oci-audit-to-gcs
  8. Vai a Configura attività (facoltativo) e lascia le impostazioni predefinite.

  9. Fai clic su Crea.

Crea una policy IAM per l'hub del connettore di servizi

L'hub del connettore di servizi richiede le autorizzazioni per richiamare la funzione, che crei nel seguente modo:

  1. Nella console Oracle Cloud, vai a Identity & Security > Policies.
  2. Seleziona il compartimento in cui hai creato il Service Connector Hub.
  3. Fai clic su Crea criterio.
  4. Fornisci i seguenti dettagli di configurazione:
    • Nome: inserisci service-connector-functions-policy.
    • Descrizione: inserisci Allow Service Connector Hub to invoke Functions.
    • Compartment (Scomparto): seleziona lo scomparto.
  5. Nella sezione Policy Builder, attiva Mostra editor manuale.
  6. Inserisci le seguenti istruzioni delle policy:

    Allow any-user to use fn-function in compartment <compartment-name> where all {request.principal.type='serviceconnector'}
    Allow any-user to use fn-invocation in compartment <compartment-name> where all {request.principal.type='serviceconnector'}
    
    • Sostituisci <compartment-name> con il nome del tuo compartimento.
  7. Fai clic su Crea.

Testa l'integrazione

  1. Accedi alla console Oracle Cloud.
  2. Esegui alcune azioni che generano audit log (ad esempio, crea o modifica una risorsa).
  3. Attendi 2-5 minuti per l'elaborazione dei log.
  4. Nella consoleGoogle Cloud , vai a Cloud Storage > Bucket.
  5. Fai clic sul nome del bucket (oci-audit-logs-gcs).
  6. Vai alla cartella del prefisso (oci-audit-logs/).
  7. Verifica che i nuovi file .ndjson vengano visualizzati nel bucket.

Recupera il account di servizio Google SecOps

Google SecOps utilizza un account di servizio univoco per leggere i dati dal tuo bucket Cloud Storage. Devi concedere a questo account di servizio l'accesso al tuo bucket.

Recupera l'indirizzo email del account di servizio

  1. Vai a Impostazioni SIEM > Feed.
  2. Fai clic su Aggiungi nuovo feed di notizie.
  3. Fai clic su Configura un singolo feed.
  4. Nel campo Nome feed, inserisci un nome per il feed (ad esempio Oracle Cloud Audit Logs).
  5. Seleziona Google Cloud Storage V2 come Tipo di origine.
  6. Seleziona Oracle Cloud Infrastructure Audit Logs come Tipo di log.
  7. Fai clic su Get Service Account (Ottieni service account). Viene visualizzato un indirizzo email univoco del account di servizio, ad esempio:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. Copia questo indirizzo email per utilizzarlo nel passaggio successivo.

Concedi le autorizzazioni IAM al account di servizio Google SecOps

Il account di servizio Google SecOps richiede due ruoli sul bucket Cloud Storage: Storage Object Viewer per leggere gli oggetti di log e un ruolo a livello di bucket per leggere i metadati del bucket.

  1. Vai a Cloud Storage > Bucket.
  2. Fai clic sul nome del bucket (oci-audit-logs-gcs).
  3. Vai alla scheda Autorizzazioni.
  4. Fai clic su Concedi l'accesso.
  5. Fornisci i seguenti dettagli di configurazione:
    • Aggiungi entità: incolla l'indirizzo email del account di servizio Google SecOps.
    • Assegna i ruoli: seleziona entrambe le seguenti opzioni:
    • Storage Object Viewer: legge gli oggetti di log.
    • Storage Legacy Bucket Reader: legge i metadati del bucket. Se hai selezionato l'opzione di eliminazione Elimina i file trasferiti e le directory vuote, seleziona Storage Legacy Bucket Writer, che concede anche l'autorizzazione di eliminazione.
  6. Fai clic su Salva.

Configura un feed in Google SecOps per importare gli audit log OCI

  1. Vai a Impostazioni SIEM > Feed.
  2. Fai clic su Aggiungi nuovo feed di notizie.
  3. Fai clic su Configura un singolo feed.
  4. Nel campo Nome feed, inserisci un nome per il feed (ad esempio Oracle Cloud Audit Logs).
  5. Seleziona Google Cloud Storage V2 come Tipo di origine.
  6. Seleziona Oracle Cloud Infrastructure Audit Logs come Tipo di log.
  7. Fai clic su Avanti.
  8. Specifica i valori per i seguenti parametri di input:

    • URL bucket di archiviazione: inserisci l'URI del bucket Cloud Storage con il percorso del prefisso:
    gs://oci-audit-logs-gcs/oci-audit-logs/
    
    • Sostituisci:

      • oci-audit-logs-gcs: il nome del tuo bucket Cloud Storage.
      • oci-audit-logs: prefisso o percorso facoltativo in cui vengono archiviati i log (lascia vuoto per la directory principale).

      Esempi:

      • Bucket root: gs://company-logs/
      • Con prefisso: gs://company-logs/oci-audit-logs/
      • Con sottocartella: gs://company-logs/oracle/audit/

    • Opzione di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze:

      • Non eliminare mai i file: non eliminare mai i file dall'origine (opzione consigliata per i test).
      • Elimina i file trasferiti e le directory vuote: elimina i file e le directory vuote dall'origine dopo il completamento di un recupero riuscito.
    • Età massima del file: includi i file modificati negli ultimi giorni. Il valore predefinito è 180 giorni.

    • Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset.

    • Etichette di importazione: l'etichetta da applicare agli eventi di questo feed.

  9. Fai clic su Avanti.

  10. Controlla la nuova configurazione del feed di notizie nella schermata Finalizza, quindi fai clic su Invia.

Metodo 2: webhook

Con questo metodo, Connector Hub invia batch di voci di audit log a una funzione OCI, che le invia a un feed webhook di Google SecOps tramite HTTPS. Non è coinvolto alcun bucket Cloud Storage.

Crea un feed webhook in Google SecOps

Crea il feed

  1. Vai a Impostazioni SIEM > Feed.
  2. Fai clic su Aggiungi nuovo feed di notizie.
  3. Nella pagina successiva, fai clic su Configura un singolo feed.
  4. Nel campo Nome feed, inserisci un nome per il feed (ad esempio OCI Audit Logs Webhook).
  5. Seleziona Webhook come Tipo di origine.
  6. Seleziona Oracle Cloud Infrastructure Audit Logs come Tipo di log.
  7. Fai clic su Avanti.
  8. Specifica i valori per i seguenti parametri di input:
    • Delimitatore di divisione: inserisci \n. La funzione invia ogni voce di log nella riga corrispondente.
    • Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset.
    • Etichette di importazione: l'etichetta da applicare agli eventi di questo feed.
  9. Fai clic su Avanti.
  10. Controlla la nuova configurazione del feed di notizie nella schermata Finalizza, quindi fai clic su Invia.

Genera e salva la chiave segreta

  1. Nella pagina dei dettagli del feed, fai clic su Genera chiave segreta.
  2. Copia e salva la chiave segreta in modo sicuro.

Ottieni l'URL dell'endpoint del feed

  1. Vai alla scheda Dettagli del feed.
  2. Nella sezione Endpoint Information (Informazioni sull'endpoint), copia l'Feed endpoint URL (URL endpoint del feed). L'URL ha il seguente formato:

    https://<REGION>-chronicle.googleapis.com/v1alpha/projects/<PROJECT_NUMBER>/locations/<REGION>/instances/<INSTANCE_ID>/feeds/<FEED_ID>:importPushLogs
    
  3. Fai clic su Fine.

Crea una chiave API Google Cloud

  1. Vai alla pagina Credenziali della consoleGoogle Cloud .
  2. Seleziona il progetto collegato alla tua istanza Google SecOps.
  3. Fai clic su Crea credenziali > Chiave API.
  4. Fai clic su Modifica chiave API per limitare la chiave.
  5. Nel campo Nome, inserisci un nome descrittivo (ad esempio oci-audit-webhook).
  6. In Restrizioni delle API, seleziona Limita chiave, quindi seleziona API Chronicle nell'elenco Seleziona API.
  7. Fai clic su Salva.
  8. Copia il valore della chiave API e salvalo in modo sicuro.

Crea una funzione OCI per inoltrare i log al webhook

Crea l'applicazione

  1. Accedi alla console Oracle Cloud.
  2. Apri il menu di navigazione e seleziona Developer Services > Functions > Applications.
  3. Seleziona il compartimento in cui vuoi creare l'applicazione della funzione.
  4. Fai clic su Crea applicazione.
  5. Fornisci i seguenti dettagli di configurazione:
    • Nome: inserisci audit-logs-to-secops-app.
    • VCN: seleziona una rete cloud virtuale.
    • Subnet: seleziona una subnet con accesso a internet, ovvero una subnet pubblica con un gateway internet o una subnet privata con un gateway NAT. La funzione deve raggiungere l'endpoint Google SecOps tramite HTTPS (porta 443).
  6. Fai clic su Crea.

Crea ed esegui il deployment della funzione

  1. Dopo aver creato l'applicazione, fai clic su Inizia e segui le istruzioni per configurare OCI Cloud Shell o l'ambiente di sviluppo locale con l'interfaccia a riga di comando Fn.
  2. Inizializza una funzione Python:

    fn init --runtime python oci-audit-to-secops
    cd oci-audit-to-secops
    
  3. Sostituisci i contenuti di func.py con il seguente codice:

    import io
    import json
    import logging
    import os
    import random
    import time
    from email.utils import parsedate_to_datetime
    
    import requests
    from fdk import response
    
    logging.basicConfig(level=logging.INFO)
    logger = logging.getLogger()
    
    # The webhook accepts at most 4 MB per request and 1 MB per log line.
    # Connector Hub delivers batches of up to 6 MB, so a batch is sent as several
    # requests, each made of whole log entries.
    MAX_REQUEST_BYTES = 3 * 1024 * 1024
    MAX_LINE_BYTES = 1024 * 1024
    
    MAX_ATTEMPTS = 5
    RETRYABLE_STATUS = {429, 500, 502, 503, 504}
    # OCI stops the function at its configured timeout (300 seconds). Stop retrying
    # early enough to fail cleanly so that Connector Hub retries the whole batch.
    DEADLINE_SECONDS = 240
    
    def to_lines(body):
        """Serialize each log entry from the Connector Hub batch as one JSON line."""
        entries = body if isinstance(body, list) else [body]
        lines = []
        for entry in entries:
            line = json.dumps(entry, ensure_ascii=False, separators=(',', ':')).encode('utf-8')
            if len(line) > MAX_LINE_BYTES:
                entry_id = entry.get('id') if isinstance(entry, dict) else None
                logger.error(f'Skipping log entry {entry_id}: {len(line)} bytes exceeds the 1 MB line limit')
                continue
            lines.append(line)
        return lines
    
    def to_requests(lines):
        """Group whole lines into newline-delimited request bodies below MAX_REQUEST_BYTES."""
        chunk, size = [], 0
        for line in lines:
            if chunk and size + len(line) + 1 > MAX_REQUEST_BYTES:
                yield b'\n'.join(chunk), len(chunk)
                chunk, size = [], 0
            chunk.append(line)
            size += len(line) + 1
        if chunk:
            yield b'\n'.join(chunk), len(chunk)
    
    def retry_after_seconds(value):
        """Parse a Retry-After header given either in seconds or as an HTTP date."""
        if not value:
            return None
        try:
            return max(0.0, float(value))
        except ValueError:
            pass
        try:
            return max(0.0, parsedate_to_datetime(value).timestamp() - time.time())
        except (TypeError, ValueError, IndexError, OverflowError):
            return None
    
    def post(session, url, headers, payload, deadline):
        """Send one request, retrying throttling and server errors until the deadline."""
        status, detail = None, ''
        for attempt in range(1, MAX_ATTEMPTS + 1):
            remaining = deadline - time.monotonic()
            if remaining < 5:
                break
            wait = None
            try:
                resp = session.post(url, data=payload, headers=headers, timeout=(10, min(60, remaining)))
            except requests.RequestException as e:
                status, detail = None, str(e)
            else:
                if 200 <= resp.status_code < 300:
                    return
                status, detail = resp.status_code, resp.text[:500]
                if status not in RETRYABLE_STATUS:
                    raise RuntimeError(f'Webhook rejected the request with HTTP {status}: {detail}')
                wait = retry_after_seconds(resp.headers.get('Retry-After'))
            if wait is None:
                wait = min(30, 2 ** attempt) + random.uniform(0, 1)
            if attempt == MAX_ATTEMPTS or time.monotonic() + wait >= deadline:
                break
            logger.warning(f'Attempt {attempt} failed (HTTP {status}): {detail}. Retrying in {wait:.1f} seconds')
            time.sleep(wait)
        raise RuntimeError(f'Webhook request failed (HTTP {status}): {detail}')
    
    def handler(ctx, data: io.BytesIO = None):
        """Forward a Connector Hub batch of OCI Audit log entries to the webhook feed.
    
        Any exception fails the invocation, and Connector Hub then retries the batch.
        """
        deadline = time.monotonic() + DEADLINE_SECONDS
    
        url = os.environ.get('SECOPS_WEBHOOK_URL')
        api_key = os.environ.get('SECOPS_API_KEY')
        secret_key = os.environ.get('SECOPS_SECRET_KEY')
        if not all([url, api_key, secret_key]):
            raise RuntimeError('Missing configuration: SECOPS_WEBHOOK_URL, SECOPS_API_KEY and SECOPS_SECRET_KEY are required')
    
        raw = data.getvalue() if data else b''
        if not raw.strip():
            logger.info('Received an empty batch')
            return response.Response(
                ctx, response_data=json.dumps({'records': 0}),
                headers={'Content-Type': 'application/json'}
            )
    
        lines = to_lines(json.loads(raw))
        headers = {
            'Content-Type': 'application/json',
            'X-goog-api-key': api_key,
            'X-Webhook-Access-Key': secret_key,
        }
    
        sent = 0
        with requests.Session() as session:
            for payload, count in to_requests(lines):
                post(session, url, headers, payload, deadline)
                sent += count
    
        logger.info(f'Forwarded {sent} log entries')
        return response.Response(
            ctx, response_data=json.dumps({'records': sent}),
            headers={'Content-Type': 'application/json'}
        )
    

  4. Sostituisci i contenuti di requirements.txt con le seguenti dipendenze:

    fdk>=0.1.0
    requests>=2.32.0
    
  5. Apri func.yaml e aggiungi la riga seguente per aumentare il timeout della funzione dai 30 secondi predefiniti al massimo di 300 secondi:

    timeout: 300
    
  6. Esegui il deployment della funzione in OCI:

    fn -v deploy --app audit-logs-to-secops-app
    

Configura le variabili di ambiente delle funzioni

  1. Nella console Oracle Cloud, vai a Developer Services > Functions > Applications.
  2. Fai clic sull'applicazione (audit-logs-to-secops-app).
  3. Fai clic sul nome della funzione (oci-audit-to-secops).
  4. Fai clic su Configurazione.
  5. Aggiungi le seguenti variabili di configurazione:

    Chiave Valore
    SECOPS_WEBHOOK_URL L'URL dell'endpoint del feed
    SECOPS_API_KEY La chiave API Google Cloud
    SECOPS_SECRET_KEY La chiave segreta del feed
  6. Fai clic su Salva modifiche.

Abilita i log delle funzioni

  1. Nella pagina dell'elenco Applicazioni, seleziona audit-logs-to-secops-app.
  2. Seleziona la scheda Monitoraggio e vai alla sezione Log.
  3. Dal menu Azioni (tre puntini) per la categoria Log di chiamata della funzione, seleziona Abilita log.
  4. Mantieni il compartimento, il gruppo di log e il nome del log predefiniti o modificali in base alle tue esigenze.
  5. Seleziona Attiva log.

Crea un connettore OCI Connector Hub

  1. Apri il menu di navigazione e seleziona Analisi e AI. In Messaggistica, seleziona Hub connettore.
  2. Seleziona il compartimento in cui vuoi creare il connettore.
  3. Fai clic su Crea connettore.
  4. Fornisci i seguenti dettagli di configurazione:

    • Informazioni sul connettore:

      Impostazione Valore
      Nome connettore Inserisci audit-logs-to-secops-connector
      Descrizione Inserisci Forward OCI Audit logs to a webhook feed
      Scomparto per le risorse Seleziona il compartimento
    • Configura l'origine:

      Impostazione Valore
      Origine Seleziona Logging
      Compartment Seleziona il compartimento contenente gli audit log
      Gruppo di log Seleziona _Audit (gruppo di log predefinito per gli audit log)
  5. Fai clic su + Another Log (+ Un altro log).

  6. Seleziona l'audit log per il tuo compartimento (ad esempio, _Audit_Include_Subcompartment).

    • Configura il target:

      Impostazione Valore
      Destinazione Seleziona Funzioni
      Scomparto per le funzioni Seleziona il compartimento contenente la funzione
      Applicazione della funzione Seleziona audit-logs-to-secops-app
      Funzione Seleziona oci-audit-to-secops
  7. Vai a Configura attività (facoltativo) e lascia le impostazioni predefinite.

  8. Se ti viene chiesto di creare una policy (necessaria per l'accesso per creare o aggiornare un connettore di servizi), seleziona Crea.

  9. Fai clic su Crea.

Crea una policy IAM per Connector Hub

Connector Hub richiede le autorizzazioni per richiamare la funzione.

  1. Nella console Oracle Cloud, vai a Identity & Security > Policies.
  2. Seleziona il compartimento in cui hai creato il connettore.
  3. Fai clic su Crea criterio.
  4. Fornisci i seguenti dettagli di configurazione:
    • Nome: inserisci connector-hub-secops-function-policy.
    • Descrizione: inserisci Allow Connector Hub to invoke the webhook forwarding function.
    • Compartment (Scomparto): seleziona lo scomparto.
  5. Nella sezione Policy Builder, attiva Mostra editor manuale.
  6. Inserisci le seguenti istruzioni delle policy:

    Allow any-user to use fn-function in compartment <compartment-name> where all {request.principal.type='serviceconnector'}
    Allow any-user to use fn-invocation in compartment <compartment-name> where all {request.principal.type='serviceconnector'}
    
  7. Fai clic su Crea.

Come la funzione invia i log

  • Dimensioni del batch: Connector Hub invia alla funzione batch di dimensioni fino a 6 MB e il webhook accetta fino a 4 MB per richiesta. La funzione suddivide ogni batch in richieste di massimo 3 MB. La suddivisione avviene solo tra le voci di log, mai all'interno di una voce, e ogni voce arriva in Google SecOps come un singolo evento.
  • Nuovi tentativi: la funzione riprova le risposte HTTP 429 e 5xx con backoff esponenziale e rispetta l'intestazione Retry-After. Qualsiasi altro errore o una richiesta che continua a non riuscire dopo cinque tentativi comporta l'esito negativo della chiamata. Connector Hub riprova quindi a inviare l'intero batch e non sposta i batch successivi finché non viene eseguito correttamente.
  • Conservazione: l'origine Logging di Connector Hub conserva i dati non recapitati per 24 ore. Se la consegna continua a non riuscire per un periodo di tempo più lungo, i log non consegnati più vecchi vengono persi, quindi correggi tempestivamente gli errori segnalati nel log della funzione.
  • Duplicati: Connector Hub invia ogni batch almeno una volta. Quando un batch viene ritentato dopo che una parte è già stata inviata, Google SecOps può ricevere queste voci due volte.
  • Voci di dimensioni eccessive: una voce di log di dimensioni superiori a 1 MB supera il limite di righe del webhook. La funzione lo ignora e scrive il suo ID nel log della funzione.

Verifica l'integrazione

Per verificare l'integrazione:

  1. Esegui alcune azioni nella console Oracle Cloud che generano audit log (ad esempio, crea o modifica una risorsa).
  2. Attendi 2-5 minuti affinché Connector Hub invii i log.
  3. Apri il log delle chiamate della funzione che hai attivato e verifica che contenga messaggi Forwarded N log entries. Un messaggio di errore include lo stato HTTP restituito da Google SecOps.
  4. In Google SecOps, esegui una ricerca nei log non elaborati per il tipo di log OCI_AUDIT e verifica che gli eventi di controllo arrivino.

Tabella di mappatura UDM

Campo log Mappatura UDM Logica
accept_encoding_field additional.fields Unita
accept_field additional.fields Unita
additional_app additional.fields Unita
additional_content_type additional.fields Unita
additional_sort_by additional.fields Unita
additionaldetails_data additional.fields Unita
allow_methods_field additional.fields Unita
auth_type_label additional.fields Unita
authorization_field additional.fields Unita
backend_connect_time_field additional.fields Unita
backend_processing_time_field additional.fields Unita
caller_id_label additional.fields Unita
caller_name_label additional.fields Unita
cloud_event_versiom_field additional.fields Unita
compartment_id_field additional.fields Unita
compartment_name_field additional.fields Unita
connection_field additional.fields Unita
content_length_field additional.fields Unita
content_type_field additional.fields Unita
event_grouping_id_field additional.fields Unita
event_name_label additional.fields Unita
event_resource_label additional.fields Unita
event_source_label additional.fields Unita
event_type_label additional.fields Unita
event_type_versiom_field additional.fields Unita
has_compariment_id additional.fields Mappatura: true → additional_app
has_sort_by additional.fields Mappatura: true → additional_sort_by
listener_name_field additional.fields Unita
log_group_id_field additional.fields Unita
log_id_field additional.fields Unita
message additional.fields Valori mappati (41 in totale, ad es. \/ → tenant_id_label, \/ → auth_type_label, \/ → `ca…
opc_request_id_field additional.fields Unita
origin_field additional.fields Unita
param0_field additional.fields Unita
param1_field additional.fields Unita
referer_field additional.fields Unita
request_processing_time_field additional.fields Unita
resource_id_field additional.fields Unita
routing_rules_engine_errors_field additional.fields Unita
routing_rules_matched_rule_field additional.fields Unita
routing_rules_rule_hits_field additional.fields Unita
routing_rules_rule_misses_field additional.fields Unita
source_field additional.fields Unita
tenant_id_label additional.fields Unita
column3 extensions.auth.type Mappatura: login successful → AUTHTYPE_UNSPECIFIED
message extensions.auth.type Mappatura: \/ → AUTHTYPE_UNSPECIFIED
column3 metadata.description Mappata direttamente
data.message metadata.description Mappata direttamente
column1 metadata.event_timestamp Analizzato come yyyy-MM-dd HH:mm:ss
data_event_time metadata.event_timestamp Analizzato come yyyy-MM-ddTHH:mm:ss.SSSSSSZ
time metadata.event_timestamp Analizzato come ISO8601
metadata_event_type metadata.event_type Mappata direttamente
type metadata.product_event_type Mappata direttamente
data_event_id metadata.product_log_id Mappata direttamente
id metadata.product_log_id Mappata direttamente
message metadata.product_name Mappatura: \/ → OCI_AUDIT
specversion metadata.product_version Mappata direttamente
message metadata.vendor_name Mappatura: \/ → Oracle
message network.application_protocol Mappatura: \/ → HTTPS, \/ → HTTP
protocol network.application_protocol Mappatura: (?i)HTTPS → HTTPS, (?i)HTTP → HTTP
version network.application_protocol_version Mappata direttamente
data_request_action network.http.method Mappata direttamente
method network.http.method Mappata direttamente
data_identity_userAgent network.http.parsed_user_agent Rinominato/mappato
data_request_agent network.http.parsed_user_agent Rinominato/mappato
url network.http.referral_url Mappata direttamente
data.backendStatusCode network.http.response_code Mappata direttamente
data_response_status network.http.response_code Rinominato/mappato
data.userAgent network.http.user_agent Mappata direttamente
data_identity_userAgent network.http.user_agent Mappata direttamente
data_request_agent network.http.user_agent Mappata direttamente
data.receivedBytes network.received_bytes Mappata direttamente
message network.received_bytes Mappatura: \/ → uinteger
data.sentBytes network.sent_bytes Mappata direttamente
message network.sent_bytes Mappatura: \/ → uinteger
data_identity_consoleSessionId network.session_id Rinominato/mappato
data.sslCipher network.tls.cipher Mappata direttamente
data.sslProtocol network.tls.version Mappata direttamente
data.host principal.asset.hostname Mappata direttamente
hostname principal.asset.hostname Mappata direttamente
column6 principal.asset.ip Unita
data.forwardedForAddr principal.asset.ip Unita
data_identity_ipAddress principal.asset.ip Mappatura: ^(?:[0-9]{1,3}[.]){3}[0-9]{1,3}$ → data_identity_ipAddress
data_request_origin principal.asset.ip Unita
ip1 principal.asset.ip Unita
ip2 principal.asset.ip Unita
message principal.asset.ip Valori mappati (7 in totale, ad es. \/ → column6, \/ → data_request_origin, \/ → ip2)
src_ip principal.asset.ip Unita
data.host principal.hostname Mappata direttamente
hostname principal.hostname Mappata direttamente
column6 principal.ip Unita
data.forwardedForAddr principal.ip Unita
data_identity_ipAddress principal.ip Mappatura: ^(?:[0-9]{1,3}[.]){3}[0-9]{1,3}$ → data_identity_ipAddress
data_request_origin principal.ip Unita
ip1 principal.ip Unita
ip2 principal.ip Unita
message principal.ip Valori mappati (7 in totale, ad es. \/ → column6, \/ → data_request_origin, \/ → ip2)
src_ip principal.ip Unita
data_request_headers_sec-ch-ua-platform_0 principal.platform Mappatura: (?i)Linux → LINUX, (?i)windows → WINDOWS, (?i)mac/ios → MAC
message principal.platform Mappatura: \/ → LINUX, \/ → WINDOWS, \/ → MAC
originalConnection.sourcePort principal.port Mappata direttamente
src_port principal.port Mappata direttamente
data_request_headers_oci-original-url_0 principal.url Mappata direttamente
credentials_label principal.user.attribute.labels Unita
message principal.user.attribute.labels Mappatura: \/ → credentials_label
data.identity.principalName principal.user.user_display_name Mappata direttamente
data.username principal.user.user_display_name Mappata direttamente
data.identity.principalId principal.user.userid Mappata direttamente
data.principalId principal.user.userid Mappata direttamente
column3 security_result Mappatura: login successful → security_result
message security_result Mappatura: \/ → security_result
allow_action security_result.action Unita
column3 security_result.action Mappatura: login successful → allow_action
message security_result.action Mappatura: \/ → allow_action
credential_type_field security_result.detection_fields Unita
message security_result.detection_fields Mappatura: \/ → credential_type_field
data.response.message security_result.summary Mappata direttamente
message target.asset.ip Mappatura: \/ → originalConnection.destinationIp, \/ → tar_ip
originalConnection.destinationIp target.asset.ip Unita
tar_ip target.asset.ip Unita
message target.ip Mappatura: \/ → originalConnection.destinationIp, \/ → tar_ip
originalConnection.destinationIp target.ip Unita
tar_ip target.ip Unita
originalConnection.destinationPort target.port Mappata direttamente
tar_port target.port Mappata direttamente
message target.resource.attribute.labels Mappatura: \/ → namespace_label
namespace_label target.resource.attribute.labels Unita
type target.resource.attribute.labels Mappatura: listretentionrules → namespace_label
data.resourceId target.resource.name Mappata direttamente
data.resourceName target.resource.name Mappata direttamente
bucketId target.resource.product_object_id Mappata direttamente
data.resourceId target.resource.product_object_id Mappata direttamente
data_request_id target.resource.product_object_id Mappata direttamente
message target.resource.resource_type Mappatura: \/ → STORAGE_BUCKET
type target.resource.resource_type Mappatura: listretentionrules → STORAGE_BUCKET
data_request_path target.url Mappata direttamente
column2 target.user.email_addresses Unita
message target.user.email_addresses Mappatura: \/ → column2
N/D extensions.auth.type Costante: AUTHTYPE_UNSPECIFIED
N/D metadata.product_name Costante: OCI_AUDIT
N/D metadata.vendor_name Costante: Oracle
N/D network.application_protocol Costante: HTTPS
N/D principal.platform Costante: LINUX
N/D target.resource.resource_type Costante: STORAGE_BUCKET

Log delle modifiche

Visualizza il log delle modifiche per questo parser

Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.