Nota:
- Questa esercitazione richiede l'accesso a Oracle Cloud. Per iscriversi a un account gratuito, consulta Inizia a utilizzare Oracle Cloud Infrastructure Free Tier.
- Utilizza valori di esempio per le credenziali, la tenancy e i compartimenti di Oracle Cloud Infrastructure. Al termine del laboratorio, sostituisci questi valori con quelli specifici del tuo ambiente cloud.
Esporta i log di audit OCI in formato CSV per un intervallo di tempo personalizzato
Introduzione
I log di audit OCI sono correlati agli eventi emessi dal servizio Oracle Cloud Infrastructure Audit. Questi log sono disponibili nella pagina di audit dei log della console OCI oppure sono ricercabili nella pagina di ricerca insieme agli altri log. Puoi esportare i log di audit di Oracle Cloud Infrastructure (OCI) in formato JSON per un intervallo di tempo personalizzato che dura al massimo 14 giorni dalla console di Oracle Cloud.
In questa esercitazione verrà descritto come distribuire uno script personalizzato per l'esportazione dei log di audit per una durata superiore a 14 giorni in formato CSV.
Nota: il periodo di conservazione massimo dei log di audit è solo di 365 giorni.
Obiettivi
Distribuisce uno script Python personalizzato per esportare i log di audit OCI in formato CSV per qualsiasi intervallo di tempo personalizzato (meno di 365 giorni).
Prerequisiti
- La VM sulla quale viene distribuito lo script deve essere un'istanza Linux.
- Installare l'interfaccia CLI OCI nella VM oppure eseguire lo script da Cloud Shell.
- Installare Python3 nella VM.
Task 1: distribuire lo script Python personalizzato
-
Verificare se Python è installato nella VM utilizzando il comando.
python3 –-version -
Installare la libreria Pandas utilizzando il comando.
pip3 install pandas -
Creare una nuova directory e passare alla directory per la distribuzione dello script.
mkdir <directory-name> cd <directory-name> -
Creare un file con il nome main.py e modificarlo utilizzando un editor qualsiasi (è stato utilizzato un editor vim).
touch main.py vim main.py -
Copiare (Copy) - Incollare il contenuto dello script come mostrato di seguito nel file main.py e salvare il contenuto del file digitando :x e facendo clic su Enter.
import pandas as pd import csv import os import datetime from datetime import timedelta,date import subprocess import json import sys import getopt def myfunc(argv): START_DATE = "" END_DATE = "" COMPARTMENT_ID = "" arg_help = "\nUsage:\n\npython3 main.py -s <log_start_date in YYYY-MM-DD Format> -e <log_end_date in YYYY-MM-DD Format> -c <Compartment_ID>\n".format(argv[0]) try: opts, args = getopt.getopt(argv[1:],"hs:e:c:") except: print("\nenter valid argument values. Try -h option with script to know the usage.\n") sys.exit(2) for opt, arg in opts: if opt in ("-h"): print(arg_help) # print the help message sys.exit(2) elif opt in ("-s"): START_DATE = arg elif opt in ("-e"): END_DATE = arg elif opt in ("-c"): COMPARTMENT_ID = arg INC = -1 year1, month1, day1 = map(int, START_DATE.split('-')) DATE1 = datetime.date(year1, month1, day1) year2, month2, day2 = map(int, END_DATE.split('-')) DATE2 = datetime.date(year2, month2, day2) NUM_DAYS = DATE2 - DATE1 NUM_DAYS = NUM_DAYS.days # Function for converting JSON to .CSV format def convert_csv(): with open('out.json', 'r') as file: data = json.load(file) datetimez = [] compartmentID = [] compartmentName = [] message = [] tenantId = [] userAgent = [] path = [] ingestedtime = [] type = [] id = [] for ele in data['data']['results']: datetimez.append(ele['data']['datetime']) compartmentID.append(ele['data']['logContent']['data']['compartmentId']) compartmentName.append(ele['data']['logContent']['data']['compartmentName']) message.append(ele['data']['logContent']['data']['message']) tenantId.append(ele['data']['logContent']['data']['identity']['tenantId']) userAgent.append(ele['data']['logContent']['data']['identity']['userAgent']) path.append(ele['data']['logContent']['data']['request']['path']) ingestedtime.append(ele['data']['logContent']['oracle']['ingestedtime']) type.append(ele['data']['logContent']['type']) id.append(ele['data']['logContent']['id']) finaldate = [] for ts in datetimez: finaldate.append(datetime.datetime.fromtimestamp(int(ts) / 1000).strftime('%Y-%m-%d %H:%M:%S')) output = zip(finaldate, compartmentID, compartmentName, message, tenantId, userAgent, path, ingestedtime, type, id) output = list(output) df = pd.DataFrame(output) df.to_csv('/tmp/out.csv', header=False , mode='a',index=False) return None # Check and validate the .CSV file in the /tmp directory os.system("touch /tmp/out.csv" ) os.remove("/tmp/out.csv") header=['Date-Time', 'CompartmentID', 'CompartmentName', 'Message', 'TenantId', 'UserAgent', 'Path', 'Ingested-Time', 'Type', 'ID'] data = [] with open('/tmp/out.csv', 'a') as f: writer = csv.writer(f) writer.writerow(header) writer.writerows(data) # Block for saving Audit Logs in JSON format to out.json file for i in range(INC, NUM_DAYS): print("\ncollecting logs for", DATE1) p = subprocess.Popen(''' oci logging-search search-logs --search-query 'search "''' + str(COMPARTMENT_ID) + '''/_Audit" | sort by datetime desc' --time-start ''' + str(DATE1) + '''"T00:00:00Z" --time-end ''' + str(DATE1) + '''"T23:59:00Z" > out.json ''', shell=True, stdout=subprocess.PIPE) (output, err) = p.communicate() convert_csv() PAG = subprocess.check_output(''' oci logging-search search-logs --search-query 'search "''' + str(COMPARTMENT_ID) + '''/_Audit" | sort by datetime desc' --time-start ''' + str(DATE1) + '''"T00:00:00Z" --time-end ''' + str(DATE1) + '''"T23:59:00Z" | grep "opc-next-page" | awk -F":" '{print $2}' | tr -d '"' | tr -d " " | tail -1 ''', shell=True).strip().decode('ascii') while (PAG != ""): p = subprocess.Popen(''' oci logging-search search-logs --search-query 'search "''' + str(COMPARTMENT_ID) + '''/_Audit" | sort by datetime desc' --time-start ''' + str(DATE1) + '''"T00:00:00Z" --time-end ''' + str(DATE1) + '''"T23:59:00Z" --page ''' + str(PAG) + ''' > out.json ''', shell=True, stdout=subprocess.PIPE) (output, err) = p.communicate() convert_csv() PAG = subprocess.check_output(''' oci logging-search search-logs --search-query 'search "''' + str(COMPARTMENT_ID) + '''/_Audit" | sort by datetime desc' --time-start ''' + str(DATE1) + '''"T00:00:00Z" --time-end ''' + str(DATE1) + '''"T23:59:00Z" --page ''' + str(PAG) + ''' | grep "opc-next-page" | awk -F":" '{print $2}' | tr -d '"' | tr -d " " | tail -1 ''', shell=True).strip().decode('ascii') print("successfully collected logs for", DATE1) DATE1 += timedelta(days=1) i = i + 1 print("\nThe .csv file is saved in location /tmp/out.csv") if __name__ == "__main__": myfunc(sys.argv)
Task 2: eseguire lo script Python personalizzato
-
Fornire le autorizzazioni di esecuzione per il file main.py utilizzando il comando.
chmod +x main.py -
Lo script deve essere eseguito con i parametri data di inizio log, data di fine log e ID compartimento. Per verificare l'uso esatto dello script, eseguire lo script con l'opzione '-h' come mostrato di seguito.
python3 main.py -hVerrà visualizzata la sintassi corretta dello script.

-
Dopo aver eseguito lo script, la data per la quale lo script è in esecuzione verrà visualizzata sullo schermo con un messaggio di operazione riuscita, seguito dal messaggio che indica la posizione del file .csv di output.

Nota:
È necessario immettere la data di inizio e la data di fine per i log di audit in formato AAAA-MM-GG insieme all'ID compartimento del compartimento per il quale si desidera esportare i log di audit.
Per ambienti più grandi o per periodi di tempo più lunghi, la quantità di log di audit da raccogliere e convertire in formato .csv sarà espressa in milioni per i quali l'esecuzione dello script potrebbe richiedere alcune ore. È consigliabile eseguire lo script per tali ambienti in background con l'opzione '&'.
È possibile utilizzare il comando linux
nohupdurante l'esecuzione dello script in background in modo che tutti i log di output vengano indirizzati al filenohup.outche è possibile rivedere in seguito. È possibile eseguire lo script con la utilitynohuputilizzando il comando seguente e successivamente controllare i log nel filenohup.out.nohup python3 main.py -s <log_start_date in YYYY-MM-DD Format> -e <log_end_date in YYYY-MM-DD Format> -c ><Compartment_ID> &
Il file CSV viene generato e memorizzato nella seguente cartella: /tmp/out.csv.
Task 3: pianificare la raccolta dei log di audit (facoltativo)
Se si desidera pianificare una raccolta mensile/settimanale di log di audit, è possibile farlo impostando i job cronjobs in modo che il file .csv precedente venga copiato in un altro file e che i nuovi log vengano salvati nel file out.csv.
-
Digitare il comando seguente per modificare il crontab.
crontab -e -
Aggiungere i seguenti cronjob da pianificare. Assicurarsi di sostituire il parametro **
** con l'ID compartimento del compartimento/tenancy. 0 1 1 * * export DATE=$(date +'%Y-%m-%d-%T') && cp /tmp/out.csv out-$DATE.csv 15 1 1 * * export DATE1=$(date +'%Y-%m-%d') && export DATE2=$(date -d "$DATE1 -1 month" +%Y-%m-%d) && python3 main.py -s DATE1 -e DATE2 -c <Compartment_ID>I job di cui sopra verranno eseguiti il 1° di ogni mese rispettivamente alle ore 1 A.M. e 1.15 A.M. È possibile modificare l'ora in base alle esigenze.
Nota: è possibile pianificare l'esecuzione del job il 30 o il 31 del mese in modo che lo script non perda un giorno o restituisca un errore.
-
Salvare il file e rivedere i cronjob attivi utilizzando il comando seguente.
crontab -l
Collegamenti correlati
Approvazioni
- Autore - Maninder Singh Flora (Cloud Architect)
Altre risorse di apprendimento
Esplora altri laboratori su docs.oracle.com/learn o accedi a contenuti di formazione gratuiti sul canale YouTube di Oracle Learning. Inoltre, visitare education.oracle.com/learning-explorer per diventare Explorer di Oracle Learning.
Per la documentazione sul prodotto, visitare il sito Oracle Help Center.
Export OCI Audit Logs in CSV format for a custom time range
F57892-02
December 2022
Copyright © 2022, Oracle and/or its affiliates.