Hinweis:

OCI-Auditlogs im CSV-Format für einen benutzerdefinierten Zeitraum exportieren

Einführung

OCI-Auditlogs beziehen sich auf Ereignisse, die vom Oracle Cloud Infrastructure Audit-Service ausgegeben werden. Diese Logs sind auf der Seite "Loggingaudit" der OCI-Konsole verfügbar oder können auf der Seite "Suchen" zusammen mit den übrigen Logs durchsucht werden. Sie können Oracle Cloud Infrastructure-(OCI-)Auditlogs im JSON-Format für einen benutzerdefinierten Zeitraum von maximal 14 Tagen aus der Oracle Cloud-Konsole exportieren.

In diesem Tutorial erfahren Sie, wie Sie ein benutzerdefiniertes Skript für den Export von Auditlogs für eine Dauer von mehr als 14 Tagen im CSV-Format bereitstellen.

Hinweis: Der maximale Aufbewahrungszeitraum für Auditlogs beträgt nur 365 Tage.

Ziele

Stellen Sie ein benutzerdefiniertes Python-Skript bereit, um OCI-Auditlogs für jeden benutzerdefinierten Zeitraum (weniger als 365 Tage) im CSV-Format zu exportieren.

Voraussetzungen

Aufgabe 1: Benutzerdefiniertes Python-Skript bereitstellen

  1. Prüfen Sie mit dem Befehl, ob Python auf der VM installiert ist.

    python3 –-version
    
  2. Installieren Sie die Pandas-Bibliothek mit dem Befehl.

    pip3 install pandas
    
  3. Erstellen Sie ein neues Verzeichnis, und wechseln Sie zum Verzeichnis für das Deployment des Skripts.

    mkdir <directory-name>
    cd <directory-name>
    
  4. Erstellen Sie eine Datei mit dem Namen main.py, und bearbeiten Sie die Datei mit einem beliebigen Editor (hier wurde der vim-Editor verwendet).

    touch main.py
    vim main.py
    
  5. Kopieren Sie den Inhalt des Skripts, wie unten in der Datei main.py gezeigt, und speichern Sie den Dateiinhalt, indem Sie :x eingeben und auf Eingabetaste klicken.

    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)
    
    

Aufgabe 2: Benutzerdefiniertes Python-Skript ausführen

  1. Geben Sie mit dem Befehl Ausführungsberechtigungen für die Datei main.py an.

    chmod +x main.py
    
  2. Das Skript muss mit Logstartdatum, Logenddatum und Compartment-ID-Parametern ausgeführt werden. Um die genaue Verwendung des Skripts zu überprüfen, führen Sie das Skript mit der Option "-h" aus, wie unten gezeigt.

    python3 main.py -h
    

    Dadurch wird die korrekte Syntax des Skriptes angezeigt.

    Skripthilfe

  3. Nach der Ausführung des Skripts wird das Datum, für das das Skript ausgeführt wird, mit einer Erfolgsmeldung auf dem Bildschirm angezeigt, gefolgt von der Meldung, dass der Speicherort der CSV-Ausgabedatei angegeben wird.

    Skriptausgabe

Hinweis:

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> &

Die CSV-Datei wird generiert und im folgenden Ordner gespeichert: /tmp/out.CSV.

Aufgabe 3: Erfassung von Auditlogs planen (optional)

Wenn Sie eine monatliche/wöchentliche Erfassung von Auditlogs planen möchten, können Sie dies tun, indem Sie die cronjobs so festlegen, dass die ältere CSV-Datei in eine andere Datei kopiert wird und neue Logs in der Datei out.csv gespeichert werden.

  1. Geben Sie zur Bearbeitung von crontab folgenden Befehl ein.

    crontab -e
    
  2. Fügen Sie die folgenden Cronjobs hinzu, die geplant werden sollen. Stellen Sie sicher, dass Sie den Parameter **** durch die Compartment-ID Ihres Compartments/Mandanten ersetzen.

    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>
    

    Die oben genannten Jobs werden jeweils am 1. jedes Monats um 1. und 1.15 Uhr ausgeführt. Sie können die Zeit entsprechend Ihren Anforderungen ändern.

    Hinweis: Sie können die Ausführung des Jobs am 30. oder 31. eines Monats planen, sodass Ihr Skript keinen Tag verpassen oder einen Fehler zurückgibt.

  3. Speichern Sie die Datei, und prüfen Sie die aktiven cronjobs mit dem folgenden Befehl.

    crontab -l
    

Danksagungen

Weitere Lernressourcen

Sehen Sie sich andere Übungen zu docs.oracle.com/learn an, oder greifen Sie auf weitere kostenlose Lerninhalte im Oracle Learning YouTube-Kanal zu. Besuchen Sie außerdem die Website education.oracle.com/learning-explorer, um Oracle Learning Explorer zu werden.

Produktdokumentation finden Sie im Oracle Help Center.