Nota:

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

Task 1: distribuire lo script Python personalizzato

  1. Verificare se Python è installato nella VM utilizzando il comando.

    python3 –-version
    
  2. Installare la libreria Pandas utilizzando il comando.

    pip3 install pandas
    
  3. Creare una nuova directory e passare alla directory per la distribuzione dello script.

    mkdir <directory-name>
    cd <directory-name>
    
  4. 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
    
  5. 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

  1. Fornire le autorizzazioni di esecuzione per il file main.py utilizzando il comando.

    chmod +x main.py
    
  2. 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 -h
    

    Verrà visualizzata la sintassi corretta dello script.

    Guida sullo script

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

    output script

Nota:

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.

  1. Digitare il comando seguente per modificare il crontab.

    crontab -e
    
  2. 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.

  3. Salvare il file e rivedere i cronjob attivi utilizzando il comando seguente.

    crontab -l
    

Approvazioni

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.