Hinweis:
- Dieses Tutorial erfordert Zugriff auf Oracle Cloud. Informationen zum Anmelden für einen kostenlosen Account finden Sie unter Erste Schritte mit Oracle Cloud Infrastructure Free Tier.
- Es verwendet Beispielwerte für Oracle Cloud Infrastructure-Zugangsdaten, -Mandanten und -Compartments. Wenn Sie Ihre Übung abgeschlossen haben, ersetzen Sie diese Werte durch die Werte, die für Ihre Cloud-Umgebung spezifisch sind.
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
- Die VM, auf der das Skript bereitgestellt wird, muss eine Linux-Instanz sein.
- Installieren Sie die OCI-CLI auf der VM, oder führen Sie das Skript aus der Cloud Shell aus.
- Installieren Sie Python3 auf der VM.
Aufgabe 1: Benutzerdefiniertes Python-Skript bereitstellen
-
Prüfen Sie mit dem Befehl, ob Python auf der VM installiert ist.
python3 –-version
-
Installieren Sie die Pandas-Bibliothek mit dem Befehl.
pip3 install pandas
-
Erstellen Sie ein neues Verzeichnis, und wechseln Sie zum Verzeichnis für das Deployment des Skripts.
mkdir <directory-name> cd <directory-name>
-
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
-
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
-
Geben Sie mit dem Befehl Ausführungsberechtigungen für die Datei main.py an.
chmod +x main.py
-
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.
-
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.
Hinweis:
Sie müssen das Start- und Enddatum für die Auditlogs im Format JJJJ-MM-TT zusammen mit der Compartment-ID des Compartments eingeben, für das Sie die Auditlogs exportieren möchten.
Bei größeren Umgebungen oder größeren Zeiträumen beträgt die Anzahl der Auditlogs, die gesammelt und in das CSV-Format konvertiert werden sollen, Millionen, für die die Ausführung des Skripts einige Stunden dauern kann. Es ist besser, das Skript für solche Umgebungen im Hintergrund mit der Option '& auszuführen.
Sie können den Befehl
nohup
linux verwenden, während Sie das Skript im Hintergrund ausführen, sodass alle Ausgabelogs an die Dateinohup.out
weitergeleitet werden, die Sie später prüfen können. Sie können das Skript mit dem Utilitynohup
mit dem folgenden Befehl ausführen und später die Logs in der Dateinohup.out
prüfen.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.
-
Geben Sie zur Bearbeitung von crontab folgenden Befehl ein.
crontab -e
-
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.
-
Speichern Sie die Datei, und prüfen Sie die aktiven cronjobs mit dem folgenden Befehl.
crontab -l
Verwandte Links
Danksagungen
- Autor - Maninder Singh Flora (Cloud Architect)
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.
Export OCI Audit Logs in CSV format for a custom time range
F57892-02
December 2022
Copyright © 2022, Oracle and/or its affiliates.