Raccogli i log di controllo di Oracle Cloud Infrastructure
Questo documento spiega come importare i log di controllo di Oracle Cloud Infrastructure in Google Security Operations utilizzando Amazon S3.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Istanza Google SecOps.
- Account Oracle Cloud Infrastructure con autorizzazioni per creare e gestire:
- Service Connector Hub
- Oracle Functions
- Vault e secret
- Gruppi dinamici e criteri IAM
- Logging
- Account AWS con autorizzazioni per creare e gestire:
- Bucket S3
- Utenti e criteri IAM
Crea un bucket Amazon S3
- Accedi alla console di gestione AWS.
- Vai a S3 > Crea bucket.
- Fornisci i seguenti dettagli di configurazione:
- Nome bucket: inserisci un nome univoco (ad esempio
oci-audit-logs-bucket). - Regione AWS: seleziona una regione (ad esempio,
us-east-1). - Mantieni le impostazioni predefinite per le altre opzioni.
- Nome bucket: inserisci un nome univoco (ad esempio
- Fai clic su Crea bucket.
- Salva il nome e la regione del bucket per utilizzarli in un secondo momento.
Crea un utente IAM in AWS per OCI Functions
- Accedi alla console di gestione AWS.
- Vai a IAM > Utenti > Aggiungi utenti.
- Fornisci i seguenti dettagli di configurazione:
- Nome utente: inserisci un nome utente (ad esempio,
oci-functions-s3-user). - Tipo di accesso: seleziona Chiave di accesso - Accesso programmatico.
- Nome utente: inserisci un nome utente (ad esempio,
- Fai clic su Avanti: autorizzazioni.
- Fai clic su Collega direttamente le policy esistenti.
- Cerca e seleziona il criterio AmazonS3FullAccess.
- Fai clic su Avanti: tag.
- Fai clic su Successivo: esamina.
- Fai clic su Crea utente.
- Importante: nella pagina di conferma, copia e salva le seguenti credenziali:
- ID chiave di accesso
- Chiave di accesso segreta
Archivia le credenziali AWS in OCI Vault
Per archiviare in modo sicuro le credenziali AWS, devi utilizzare Oracle Cloud Infrastructure Vault anziché codificarle nel codice della funzione.
Crea un vault e una chiave di crittografia principale
- Accedi alla console Oracle Cloud.
- Vai a Identità e sicurezza > Vault.
- Se non hai un Vault, fai clic su Crea Vault.
- Fornisci i seguenti dettagli di configurazione:
- Crea in Compartment: seleziona il tuo comparto.
- Nome: inserisci un nome (ad esempio,
oci-functions-vault).
- Fai clic su Crea Vault.
- Una volta creato il Vault, fai clic sul suo nome per aprirlo.
- In Chiavi di crittografia master, fai clic su Crea chiave.
- Fornisci i seguenti dettagli di configurazione:
- Modalità di protezione: software
- Nome: inserisci un nome (ad esempio,
oci-functions-key). - Key Shape: Algorithm (Forma della chiave: algoritmo): AES
- Forma della chiave: lunghezza: 256 bit
- Fai clic su Crea chiave.
Crea secret per le credenziali AWS
- In Vault, sotto Secret, fai clic su Crea secret.
- Fornisci i seguenti dettagli di configurazione per la chiave di accesso AWS:
- Crea in Compartment: seleziona il tuo comparto.
- Nome:
aws-access-key - Descrizione: chiave di accesso AWS per S3
- Chiave di crittografia: seleziona la chiave di crittografia principale che hai creato.
- Contenuti del tipo di secret: testo normale
- Contenuti del segreto: incolla l'ID chiave di accesso AWS.
- Fai clic su Crea secret.
- Copia e salva l'OCID di questo secret (ha l'aspetto di
ocid1.vaultsecret.oc1...). - Fai di nuovo clic su Crea secret per creare il secondo secret.
- Fornisci i seguenti dettagli di configurazione per la chiave segreta AWS:
- Crea in Compartment: seleziona il tuo comparto.
- Nome:
aws-secret-key - Description: AWS secret key for S3
- Chiave di crittografia: seleziona la stessa chiave di crittografia master.
- Contenuti del tipo di secret: testo normale
- Contenuti del segreto: incolla la tua chiave di accesso segreta AWS.
- Fai clic su Crea secret.
- Copia e salva l'OCID di questo secret.
Creare un gruppo dinamico per le funzioni OCI
- Accedi alla console Oracle Cloud.
- Vai a Identity & Security > Identity > Dynamic Groups.
- Fai clic su Crea gruppo dinamico.
Fornisci i seguenti dettagli di configurazione:
- Nome:
oci-functions-dynamic-group - Descrizione: gruppo dinamico per consentire alle funzioni OCI di accedere ai secret di Vault
Regole di corrispondenza: inserisci la seguente regola (sostituisci
<your_compartment_ocid>con l'OCID del tuo compartimento):ALL {resource.type = 'fnfunc', resource.compartment.id = '<your_compartment_ocid>'}
- Nome:
Fai clic su Crea.
Crea un criterio IAM per l'accesso a Vault
- Accedi alla console Oracle Cloud.
- Vai a Identità e sicurezza > Identità > Norme.
- Seleziona il compartimento in cui vuoi creare il criterio.
- Fai clic su Crea criterio.
Fornisci i seguenti dettagli di configurazione:
- Nome:
oci-functions-vault-access-policy - Descrizione: consente a OCI Functions di leggere i secret da Vault
- Generatore di norme: attiva/disattiva Mostra editor manuale.
Policy statements (Istruzioni della policy): inserisci quanto segue (sostituisci
<compartment_name>con il nome del tuo compartimento):allow dynamic-group oci-functions-dynamic-group to manage secret-family in compartment <compartment_name>
- Nome:
Fai clic su Crea.
Crea un'applicazione di funzioni OCI
- Accedi alla console Oracle Cloud.
- Vai a Servizi per gli sviluppatori > Applicazioni (in Funzioni).
- Fai clic su Crea applicazione.
- Fornisci i seguenti dettagli di configurazione:
- Nome: inserisci un nome (ad esempio,
oci-logs-to-s3-app). - VCN: seleziona un VCN nel tuo compartimento.
- Subnet: seleziona una o più subnet.
- Nome: inserisci un nome (ad esempio,
- Fai clic su Crea.
Crea ed esegui il deployment della funzione OCI
Configura Cloud Shell (consigliato)
- Nella console Oracle Cloud, fai clic sull'icona Cloud Shell nell'angolo in alto a destra.
- Attendi l'inizializzazione di Cloud Shell.
Crea la funzione
In Cloud Shell, crea una nuova directory per la funzione:
mkdir pushlogs cd pushlogsInizializza una nuova funzione Python:
fn init --runtime pythonVengono creati tre file:
func.py,func.yamlerequirements.txt.
Aggiorna func.py
Sostituisci i contenuti di
func.pycon il seguente codice:import io import json import logging import boto3 import oci import base64 import os from fdk import response def handler(ctx, data: io.BytesIO = None): """ OCI Function to push audit logs from OCI Logging to AWS S3 """ try: # Parse incoming log data from Service Connector funDataStr = data.read().decode('utf-8') funData = json.loads(funDataStr) logging.getLogger().info(f"Received {len(funData)} log entries") # Replace these with your actual OCI Vault secret OCIDs secret_key_id = "ocid1.vaultsecret.oc1..<your_secret_key_ocid>" access_key_id = "ocid1.vaultsecret.oc1..<your_access_key_ocid>" # Replace with your S3 bucket name s3_bucket_name = "oci-audit-logs-bucket" # Use Resource Principals for OCI authentication signer = oci.auth.signers.get_resource_principals_signer() secret_client = oci.secrets.SecretsClient({}, signer=signer) def read_secret_value(secret_client, secret_id): """Retrieve and decode secret value from OCI Vault""" response = secret_client.get_secret_bundle(secret_id) base64_secret_content = response.data.secret_bundle_content.content base64_secret_bytes = base64_secret_content.encode('ascii') base64_message_bytes = base64.b64decode(base64_secret_bytes) secret_content = base64_message_bytes.decode('ascii') return secret_content # Retrieve AWS credentials from OCI Vault awsaccesskey = read_secret_value(secret_client, access_key_id) awssecretkey = read_secret_value(secret_client, secret_key_id) # Initialize boto3 session with AWS credentials session = boto3.Session( aws_access_key_id=awsaccesskey, aws_secret_access_key=awssecretkey ) s3 = session.resource('s3') # Process each log entry for i in range(0, len(funData)): # Use timestamp as filename filename = funData[i].get('time', f'log_{i}') # Remove special characters from filename filename = filename.replace(':', '-').replace('.', '-') logging.getLogger().info(f"Processing log entry: {filename}") # Write log entry to temporary file temp_file = f'/tmp/{filename}.json' with open(temp_file, 'w', encoding='utf-8') as f: json.dump(funData[i], f, ensure_ascii=False, indent=4) # Upload to S3 s3_key = f'{filename}.json' s3.meta.client.upload_file( Filename=temp_file, Bucket=s3_bucket_name, Key=s3_key ) logging.getLogger().info(f"Uploaded {s3_key} to S3 bucket {s3_bucket_name}") # Clean up temporary file os.remove(temp_file) return response.Response( ctx, response_data=json.dumps({ "status": "success", "processed_logs": len(funData) }), headers={"Content-Type": "application/json"} ) except Exception as e: logging.getLogger().error(f"Error processing logs: {str(e)}") return response.Response( ctx, response_data=json.dumps({ "status": "error", "message": str(e) }), headers={"Content-Type": "application/json"}, status_code=500 )- Sostituisci
secret_key_idcon l'OCID del secret del vault effettivo per la chiave segreta AWS - Sostituisci
access_key_idcon l'OCID segreto del vault effettivo per la chiave di accesso AWS - Sostituisci
s3_bucket_namecon il nome effettivo del bucket S3
- Sostituisci
Aggiorna func.yaml
Sostituisci i contenuti di func.yaml con:
schema_version: 20180708
name: pushlogs
version: 0.0.1
runtime: python
build_image: fnproject/python:3.9-dev
run_image: fnproject/python:3.9
entrypoint: /python/bin/fdk /function/func.py handler
memory: 256
Aggiorna requirements.txt
Sostituisci i contenuti di
requirements.txtcon:fdk>=0.1.56 boto3 oci
esegui il deployment della funzione
Imposta il contesto Fn per utilizzare l'applicazione:
fn use context <region-context> fn update context oracle.compartment-id <compartment-ocid>Esegui il deployment della funzione:
fn -v deploy --app oci-logs-to-s3-appAttendi il completamento del deployment. Dovresti visualizzare un output che indica che il deployment della funzione è stato eseguito correttamente.
Verifica che la funzione sia stata creata:
fn list functions oci-logs-to-s3-app
Crea un connettore di servizio per inviare i log di controllo OCI alla funzione
- Accedi alla console Oracle Cloud.
- Vai a Analytics e AI > Messaggistica > Service Connector Hub.
- Seleziona il compartimento in cui vuoi creare il connettore di servizio.
- Fai clic su Crea connettore di servizio.
Configura i dettagli del connettore di servizi
- Fornisci i seguenti dettagli di configurazione:
Informazioni sul connettore di servizio:
* Nome connettore: inserisci un nome descrittivo (ad esempio, audit-logs-to-s3-connector).
* Descrizione: descrizione facoltativa (ad esempio, "Inoltra i log di controllo OCI ad AWS S3").
* Compartimento risorse: seleziona il compartimento.
Configura origine
- In Configura origine:
- Origine: seleziona Logging.
- Compartimento: seleziona il compartimento contenente i log di controllo.
- Gruppo di log: seleziona
_Audit(questo è il gruppo di log predefinito per i log di controllo). - Log: fai clic su + Another Log (Un altro log).
- Seleziona il log di controllo per il tuo compartimento (ad esempio,
_Audit_Include_Subcompartment).
Configura target
- In Configura target:
- Target: seleziona Funzioni.
- Compartment: seleziona il compartimento contenente l'applicazione di funzione.
- Applicazione di funzione: seleziona
oci-logs-to-s3-app(l'applicazione che hai creato in precedenza). - Funzione: seleziona
pushlogs(la funzione di cui hai eseguito il deployment).
Configura la policy
In Configura criterio:
- Esamina le istruzioni dei criteri IAM richieste visualizzate.
- Fai clic su Crea per creare automaticamente i criteri richiesti.
Fai clic su Crea per creare il connettore di servizio.
Attendi che il connettore di servizio venga creato e attivato. Lo stato dovrebbe cambiare in Attivo.
Verifica che i log vengano inviati ad AWS S3
- Accedi alla console Oracle Cloud.
- Esegui alcune azioni che generano audit log (ad esempio, crea o modifica una risorsa).
- Attendi 2-5 minuti affinché i log vengano elaborati.
- Accedi alla console di gestione AWS.
- Vai a S3 > Buckets.
- Fai clic sul tuo bucket (ad esempio
oci-audit-logs-bucket). - Verifica che i file di log JSON vengano visualizzati nel bucket.
Configura il bucket AWS S3 e IAM per Google SecOps
Crea un utente IAM per Chronicle
- Accedi alla console di gestione AWS.
- Vai a IAM > Utenti > Aggiungi utenti.
- Fornisci i seguenti dettagli di configurazione:
- Nome utente: inserisci
chronicle-s3-reader. - Tipo di accesso: seleziona Chiave di accesso - Accesso programmatico.
- Nome utente: inserisci
- Fai clic su Avanti: autorizzazioni.
- Fai clic su Collega direttamente le policy esistenti.
- Cerca e seleziona il criterio AmazonS3ReadOnlyAccess.
- Fai clic su Avanti: tag.
- Fai clic su Successivo: esamina.
- Fai clic su Crea utente.
- Fai clic su Scarica file CSV per salvare l'ID chiave di accesso e la chiave di accesso segreta.
- Fai clic su Chiudi.
(Facoltativo) Crea un criterio IAM personalizzato per l'accesso con privilegi minimi
Se vuoi limitare l'accesso solo al bucket specifico:
- Vai a IAM > Policy > Crea policy.
- Fai clic sulla scheda JSON.
Inserisci la seguente policy:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::oci-audit-logs-bucket", "arn:aws:s3:::oci-audit-logs-bucket/*" ] } ] }- Sostituisci
oci-audit-logs-bucketcon il nome del tuo bucket.
- Sostituisci
Fai clic su Avanti: tag.
Fai clic su Successivo: esamina.
Fornisci i seguenti dettagli di configurazione:
- Nome:
chronicle-s3-read-policy - Descrizione: accesso di sola lettura al bucket degli audit log OCI
- Nome:
Fai clic su Crea policy.
Torna a IAM > Utenti e seleziona l'utente
chronicle-s3-reader.Fai clic su Aggiungi autorizzazioni > Allega direttamente le policy.
Cerca e seleziona
chronicle-s3-read-policy.Rimuovi la policy AmazonS3ReadOnlyAccess se l'hai aggiunta in precedenza.
Fai clic su Aggiungi autorizzazioni.
Configura un feed in Google SecOps per importare i log di controllo di Oracle Cloud
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo feed.
- Nella pagina successiva, fai clic su Configura un singolo feed.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio,
Oracle Cloud Audit Logs). - Seleziona Amazon S3 V2 come Tipo di origine.
- Seleziona Oracle Cloud Infrastructure come Tipo di log.
- Fai clic su Avanti.
- Specifica i valori per i seguenti parametri di input:
- URI S3: inserisci l'URI del bucket S3 (ad esempio,
s3://oci-audit-logs-bucket/). - Opzione di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze:
- Mai: consigliato per i test e la configurazione iniziale.
- Elimina file trasferiti: elimina i file dopo l'importazione riuscita (utilizza questa opzione per la produzione per gestire i costi di archiviazione).
- Età massima del file: includi i file modificati nell'ultimo numero di giorni. Il valore predefinito è 180 giorni.
- ID chiave di accesso: inserisci l'ID chiave di accesso dell'utente IAM di Chronicle che hai creato.
- Chiave di accesso segreta: inserisci la chiave di accesso segreta dell'utente IAM di Chronicle che hai creato.
- Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset.
- Etichette di importazione: l'etichetta da applicare agli eventi di questo feed.
- URI S3: inserisci l'URI del bucket S3 (ad esempio,
- Fai clic su Avanti.
- Controlla la nuova configurazione del feed nella schermata Finalizza e poi fai clic su Invia.
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logic |
|---|---|---|
data.request.headers.authorization.0 |
event.idm.read_only_udm.additional.fields |
Valore estratto da data.request.headers.authorization.0 e aggiunto come coppia chiave-valore in cui la chiave è "Request Headers Authorization". |
data.compartmentId |
event.idm.read_only_udm.additional.fields |
Valore estratto da data.compartmentId e aggiunto come coppia chiave-valore in cui la chiave è "compartmentId". |
data.compartmentName |
event.idm.read_only_udm.additional.fields |
Valore estratto da data.compartmentName e aggiunto come coppia chiave-valore in cui la chiave è "compartmentName". |
data.response.headers.Content-Length.0 |
event.idm.read_only_udm.additional.fields |
Valore estratto da data.response.headers.Content-Length.0 e aggiunto come coppia chiave-valore in cui la chiave è "Response Headers Content-Length". |
data.response.headers.Content-Type.0 |
event.idm.read_only_udm.additional.fields |
Valore estratto da data.response.headers.Content-Type.0 e aggiunto come coppia chiave-valore in cui la chiave è "Content-Type delle intestazioni della risposta". |
data.eventGroupingId |
event.idm.read_only_udm.additional.fields |
Valore estratto da data.eventGroupingId e aggiunto come coppia chiave-valore in cui la chiave è "eventGroupingId". |
oracle.tenantid, data.identity.tenantId |
event.idm.read_only_udm.additional.fields |
Il valore viene preso da oracle.tenantid se presente, altrimenti da data.identity.tenantId. Viene aggiunto come coppia chiave-valore in cui la chiave è "tenantId". |
data.message |
event.idm.read_only_udm.metadata.description |
Valore tratto da data.message. |
time |
event.idm.read_only_udm.metadata.event_timestamp |
Valore estratto da time e analizzato come timestamp ISO8601. |
event.idm.read_only_udm.metadata.event_type |
Impostato su GENERIC_EVENT per impostazione predefinita. Imposta su NETWORK_CONNECTION se sono presenti un principal (IP o nome host) e un IP di destinazione. Impostato su STATUS_UPDATE se è presente solo un'entità. |
|
time |
event.idm.read_only_udm.metadata.ingested_timestamp |
Se oracle.ingestedtime non è vuoto, il valore viene estratto dal campo time e analizzato come timestamp ISO8601. |
oracle.tenantid |
event.idm.read_only_udm.metadata.product_deployment_id |
Valore tratto da oracle.tenantid. |
type |
event.idm.read_only_udm.metadata.product_event_type |
Valore tratto da type. |
oracle.logid |
event.idm.read_only_udm.metadata.product_log_id |
Valore tratto da oracle.logid. |
specversion |
event.idm.read_only_udm.metadata.product_version |
Valore tratto da specversion. |
data.request.action |
event.idm.read_only_udm.network.http.method |
Valore tratto da data.request.action. |
data.identity.userAgent |
event.idm.read_only_udm.network.http.parsed_user_agent |
Valore estratto da data.identity.userAgent e analizzato. |
data.response.status |
event.idm.read_only_udm.network.http.response_code |
Valore estratto da data.response.status e convertito in un numero intero. |
data.protocol |
event.idm.read_only_udm.network.ip_protocol |
Il valore numerico di data.protocol viene convertito nella relativa rappresentazione di stringa (ad es. 6 diventa "TCP", 17 diventa "UDP"). |
data.bytesOut |
event.idm.read_only_udm.network.sent_bytes |
Valore estratto da data.bytesOut e convertito in un numero intero senza segno. |
data.packets |
event.idm.read_only_udm.network.sent_packets |
Valore estratto da data.packets e convertito in un numero intero. |
data.identity.consoleSessionId |
event.idm.read_only_udm.network.session_id |
Valore tratto da data.identity.consoleSessionId. |
id |
event.idm.read_only_udm.principal.asset.product_object_id |
Valore tratto da id. |
source |
event.idm.read_only_udm.principal.hostname |
Valore tratto da source. |
data.sourceAddress, data.identity.ipAddress |
event.idm.read_only_udm.principal.ip |
I valori di data.sourceAddress e data.identity.ipAddress vengono uniti in questo campo. |
data.sourcePort |
event.idm.read_only_udm.principal.port |
Valore estratto da data.sourcePort e convertito in un numero intero. |
data.request.headers.X-Forwarded-For.0 |
event.idm.read_only_udm.principal.resource.attribute.labels |
Valore estratto da data.request.headers.X-Forwarded-For.0 e aggiunto come coppia chiave-valore in cui la chiave è "x forward". |
oracle.compartmentid |
event.idm.read_only_udm.principal.resource.attribute.labels |
Valore estratto da oracle.compartmentid e aggiunto come coppia chiave-valore in cui la chiave è "compartmentid". |
oracle.loggroupid |
event.idm.read_only_udm.principal.resource.attribute.labels |
Valore estratto da oracle.loggroupid e aggiunto come coppia chiave-valore in cui la chiave è "loggroupid". |
oracle.vniccompartmentocid |
event.idm.read_only_udm.principal.resource.attribute.labels |
Valore estratto da oracle.vniccompartmentocid e aggiunto come coppia chiave-valore in cui la chiave è "vniccompartmentocid". |
oracle.vnicocid |
event.idm.read_only_udm.principal.resource.attribute.labels |
Valore estratto da oracle.vnicocid e aggiunto come coppia chiave-valore in cui la chiave è "vnicocid". |
oracle.vnicsubnetocid |
event.idm.read_only_udm.principal.resource.attribute.labels |
Valore estratto da oracle.vnicsubnetocid e aggiunto come coppia chiave-valore in cui la chiave è "vnicsubnetocid". |
data.flowid |
event.idm.read_only_udm.principal.resource.product_object_id |
Valore tratto da data.flowid. |
data.identity.credentials |
event.idm.read_only_udm.principal.user.attribute.labels |
Valore estratto da data.identity.credentials e aggiunto come coppia chiave-valore in cui la chiave è "credentials". |
data.identity.principalName |
event.idm.read_only_udm.principal.user.user_display_name |
Valore tratto da data.identity.principalName. |
data.identity.principalId |
event.idm.read_only_udm.principal.user.userid |
Valore tratto da data.identity.principalId. |
data.action |
event.idm.read_only_udm.security_result.action |
Impostato su UNKNOWN_ACTION per impostazione predefinita. Se data.action è "REJECT", questo valore è impostato su BLOCK. Se data.action è "ACCEPT", questo campo è impostato su ALLOW. |
data.endTime |
event.idm.read_only_udm.security_result.detection_fields |
Valore estratto da data.endTime e aggiunto come coppia chiave-valore in cui la chiave è "endTime". |
data.startTime |
event.idm.read_only_udm.security_result.detection_fields |
Valore estratto da data.startTime e aggiunto come coppia chiave-valore in cui la chiave è "startTime". |
data.status |
event.idm.read_only_udm.security_result.detection_fields |
Valore estratto da data.status e aggiunto come coppia chiave-valore in cui la chiave è "status". |
data.version |
event.idm.read_only_udm.security_result.detection_fields |
Valore estratto da data.version e aggiunto come coppia chiave-valore in cui la chiave è "version". |
data.destinationAddress |
event.idm.read_only_udm.target.ip |
Valore tratto da data.destinationAddress. |
data.destinationPort |
event.idm.read_only_udm.target.port |
Valore estratto da data.destinationPort e convertito in un numero intero. |
data.request.path |
event.idm.read_only_udm.target.url |
Valore tratto da data.request.path. |
event.idm.read_only_udm.metadata.product_name |
Imposta "ORACLE CLOUD AUDIT". | |
event.idm.read_only_udm.metadata.vendor_name |
Imposta su "ORACLE". |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.