Raccogli i log di Oracle Cloud Infrastructure Audit
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
- Vai alla consoleGoogle Cloud .
- Seleziona il tuo progetto o creane uno nuovo.
- Nel menu di navigazione, vai a Cloud Storage > Bucket.
- Fai clic su Crea bucket.
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 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
- Accedi alla console Oracle Cloud.
- Vai a Developer Services > Functions > Applications.
- Seleziona il compartimento in cui vuoi creare l'applicazione della funzione.
- Fai clic su Crea applicazione.
- 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.
- Nome: inserisci
- Fai clic su Crea.
- 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.
Crea una nuova directory delle funzioni sulla tua macchina locale:
mkdir oci-audit-to-gcs cd oci-audit-to-gcsInizializza una funzione Python:
fn init --runtime python oci-audit-to-gcs cd oci-audit-to-gcsSostituisci i contenuti di
func.pycon 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 )Aggiorna
requirements.txtcon le seguenti dipendenze:fdk>=0.1.0 google-cloud-storage>=2.0.0 google-auth>=2.0.0Esegui il deployment della funzione in OCI:
fn -v deploy --app audit-logs-to-gcs-appAl termine del deployment, prendi nota dell'OCID della funzione. Lo utilizzerai nel prossimo passaggio.
Configura le variabili di ambiente delle funzioni
- Nella console Oracle Cloud, vai a Developer Services > Functions > Applications.
- Fai clic sull'applicazione (
audit-logs-to-gcs-app). - Fai clic sul nome della funzione (
oci-audit-to-gcs). - Fai clic su Configurazione.
Aggiungi le seguenti variabili di configurazione:
Chiave Valore GCS_BUCKETIl nome del tuo bucket Cloud Storage (ad esempio, oci-audit-logs-gcs)GCS_PREFIXPrefisso per i file di log (ad esempio oci-audit-logs)GCS_CREDENTIALS_JSONStringa JSON della chiave del service account Google Cloud (vedi sotto) 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.
- Nella consoleGoogle Cloud , vai a IAM e amministrazione > Account di servizio.
- Fai clic su Crea account di servizio.
- 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.
- Nome service account: inserisci
- Fai clic su Crea e continua.
- Nella sezione Concedi a questo account di servizio l'accesso al progetto, aggiungi il seguente ruolo:
- Fai clic su Seleziona un ruolo.
- Cerca e seleziona Storage Object Admin.
- Fai clic su Continua.
- Fai clic su Fine.
- Fai clic sull'indirizzo email del account di servizio appena creato.
- Vai alla scheda Chiavi.
- Fai clic su Aggiungi chiave > Crea nuova chiave.
- Seleziona JSON come tipo di chiave.
- Fai clic su Crea.
- Il file della chiave JSON verrà scaricato sul computer.
- Apri il file della chiave JSON e copia tutti i contenuti.
- Torna alla configurazione della funzione della console Oracle Cloud.
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:
- Vai a Cloud Storage > Bucket.
- Fai clic sul nome del bucket (
oci-audit-logs-gcs). - Vai alla scheda Autorizzazioni.
- Fai clic su Concedi l'accesso.
- 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.
- Aggiungi entità: inserisci l'indirizzo email del account di servizio (
- Fai clic su Salva.
Crea un hub del connettore di servizi OCI
- Accedi alla console Oracle Cloud.
- Vai a Observability & Management > Logging > Service Connector Hub.
- Seleziona il compartimento in cui vuoi creare il connettore di servizio.
- Fai clic su Crea connettore di servizi.
Fornisci i seguenti dettagli di configurazione:
Informazioni sul connettore di servizio:
Impostazione Valore Nome connettore Inserisci audit-logs-to-gcs-connectorDescrizione Inserisci Forward OCI Audit logs to Cloud StorageScomparto 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)
Fai clic su + Another Log (+ Un altro log).
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-appFunzione Seleziona oci-audit-to-gcs
Vai a Configura attività (facoltativo) e lascia le impostazioni predefinite.
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:
- Nella console Oracle Cloud, vai a Identity & Security > Policies.
- Seleziona il compartimento in cui hai creato il Service Connector Hub.
- Fai clic su Crea criterio.
- 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.
- Nome: inserisci
- Nella sezione Policy Builder, attiva Mostra editor manuale.
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.
- Sostituisci
Fai clic su Crea.
Testa l'integrazione
- Accedi alla console Oracle Cloud.
- Esegui alcune azioni che generano audit log (ad esempio, crea o modifica una risorsa).
- Attendi 2-5 minuti per l'elaborazione dei log.
- Nella consoleGoogle Cloud , vai a Cloud Storage > Bucket.
- Fai clic sul nome del bucket (
oci-audit-logs-gcs). - Vai alla cartella del prefisso (
oci-audit-logs/). Verifica che i nuovi file
.ndjsonvengano 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
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo feed di notizie.
- Fai clic su Configura un singolo feed.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio
Oracle Cloud Audit Logs). - Seleziona Google Cloud Storage V2 come Tipo di origine.
- Seleziona Oracle Cloud Infrastructure Audit Logs come Tipo di log.
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.comCopia 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.
- Vai a Cloud Storage > Bucket.
- Fai clic sul nome del bucket (
oci-audit-logs-gcs). - Vai alla scheda Autorizzazioni.
- Fai clic su Concedi l'accesso.
- 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.
Fai clic su Salva.
Configura un feed in Google SecOps per importare gli audit log OCI
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo feed di notizie.
- Fai clic su Configura un singolo feed.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio
Oracle Cloud Audit Logs). - Seleziona Google Cloud Storage V2 come Tipo di origine.
- Seleziona Oracle Cloud Infrastructure Audit Logs come Tipo di log.
- Fai clic su Avanti.
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.
Fai clic su Avanti.
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
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo feed di notizie.
- Nella pagina successiva, fai clic su Configura un singolo feed.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio
OCI Audit Logs Webhook). - Seleziona Webhook come Tipo di origine.
- Seleziona Oracle Cloud Infrastructure Audit Logs come Tipo di log.
- Fai clic su Avanti.
- 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.
- Delimitatore di divisione: inserisci
- Fai clic su Avanti.
- Controlla la nuova configurazione del feed di notizie nella schermata Finalizza, quindi fai clic su Invia.
Genera e salva la chiave segreta
- Nella pagina dei dettagli del feed, fai clic su Genera chiave segreta.
Copia e salva la chiave segreta in modo sicuro.
Ottieni l'URL dell'endpoint del feed
- Vai alla scheda Dettagli del feed.
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>:importPushLogsFai clic su Fine.
Crea una chiave API Google Cloud
- Vai alla pagina Credenziali della consoleGoogle Cloud .
- Seleziona il progetto collegato alla tua istanza Google SecOps.
- Fai clic su Crea credenziali > Chiave API.
- Fai clic su Modifica chiave API per limitare la chiave.
- Nel campo Nome, inserisci un nome descrittivo (ad esempio
oci-audit-webhook). - In Restrizioni delle API, seleziona Limita chiave, quindi seleziona API Chronicle nell'elenco Seleziona API.
- Fai clic su Salva.
- Copia il valore della chiave API e salvalo in modo sicuro.
Crea una funzione OCI per inoltrare i log al webhook
Crea l'applicazione
- Accedi alla console Oracle Cloud.
- Apri il menu di navigazione e seleziona Developer Services > Functions > Applications.
- Seleziona il compartimento in cui vuoi creare l'applicazione della funzione.
- Fai clic su Crea applicazione.
- 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).
- Nome: inserisci
- Fai clic su Crea.
Crea ed esegui il deployment della funzione
- 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.
Inizializza una funzione Python:
fn init --runtime python oci-audit-to-secops cd oci-audit-to-secopsSostituisci i contenuti di
func.pycon 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'} )Sostituisci i contenuti di
requirements.txtcon le seguenti dipendenze:fdk>=0.1.0 requests>=2.32.0Apri
func.yamle aggiungi la riga seguente per aumentare il timeout della funzione dai 30 secondi predefiniti al massimo di 300 secondi:timeout: 300Esegui il deployment della funzione in OCI:
fn -v deploy --app audit-logs-to-secops-app
Configura le variabili di ambiente delle funzioni
- Nella console Oracle Cloud, vai a Developer Services > Functions > Applications.
- Fai clic sull'applicazione (
audit-logs-to-secops-app). - Fai clic sul nome della funzione (
oci-audit-to-secops). - Fai clic su Configurazione.
Aggiungi le seguenti variabili di configurazione:
Chiave Valore SECOPS_WEBHOOK_URLL'URL dell'endpoint del feed SECOPS_API_KEYLa chiave API Google Cloud SECOPS_SECRET_KEYLa chiave segreta del feed Fai clic su Salva modifiche.
Abilita i log delle funzioni
- Nella pagina dell'elenco Applicazioni, seleziona
audit-logs-to-secops-app. - Seleziona la scheda Monitoraggio e vai alla sezione Log.
- Dal menu Azioni (tre puntini) per la categoria Log di chiamata della funzione, seleziona Abilita log.
- Mantieni il compartimento, il gruppo di log e il nome del log predefiniti o modificali in base alle tue esigenze.
- Seleziona Attiva log.
Crea un connettore OCI Connector Hub
- Apri il menu di navigazione e seleziona Analisi e AI. In Messaggistica, seleziona Hub connettore.
- Seleziona il compartimento in cui vuoi creare il connettore.
- Fai clic su Crea connettore.
Fornisci i seguenti dettagli di configurazione:
Informazioni sul connettore:
Impostazione Valore Nome connettore Inserisci audit-logs-to-secops-connectorDescrizione Inserisci Forward OCI Audit logs to a webhook feedScomparto 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)
Fai clic su + Another Log (+ Un altro log).
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-appFunzione Seleziona oci-audit-to-secops
Vai a Configura attività (facoltativo) e lascia le impostazioni predefinite.
Se ti viene chiesto di creare una policy (necessaria per l'accesso per creare o aggiornare un connettore di servizi), seleziona Crea.
Fai clic su Crea.
Crea una policy IAM per Connector Hub
Connector Hub richiede le autorizzazioni per richiamare la funzione.
- Nella console Oracle Cloud, vai a Identity & Security > Policies.
- Seleziona il compartimento in cui hai creato il connettore.
- Fai clic su Crea criterio.
- 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.
- Nome: inserisci
- Nella sezione Policy Builder, attiva Mostra editor manuale.
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'}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:
- Esegui alcune azioni nella console Oracle Cloud che generano audit log (ad esempio, crea o modifica una risorsa).
- Attendi 2-5 minuti affinché Connector Hub invii i log.
- 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. In Google SecOps, esegui una ricerca nei log non elaborati per il tipo di log
OCI_AUDITe 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.