Nota:

Exportar logs de auditoría de OCI en formato CSV para un rango de tiempo personalizado

Introducción

Los logs de auditoría de OCI están relacionados con los eventos emitidos por el servicio Oracle Cloud Infrastructure Audit. Estos logs están disponibles en la página Auditoría de registro de la consola de OCI o se pueden buscar en la página Buscar junto con el resto de los logs. Puede exportar los logs de auditoría de Oracle Cloud Infrastructure (OCI) en formato JSON para un rango de tiempo personalizado de 14 días como máximo desde la consola de Oracle Cloud.

En este tutorial, aprenderá a desplegar un script personalizado para exportar logs de auditoría con una duración superior a 14 días en formato CSV.

Nota: El período máximo de retención de logs de auditoría solo es de 365 días.

Objetivos

Despliegue un script de Python personalizado para exportar logs de auditoría de OCI en formato CSV para cualquier rango temporal personalizado (menos de 365 días).

Requisitos

Tarea 1: Despliegue del script de Python personalizado

  1. Verifique si Python está instalado en la VM mediante el comando.

    python3 –-version
    
  2. Instale la biblioteca de Pandas con el comando.

    pip3 install pandas
    
  3. Cree un nuevo directorio y cambie al directorio para desplegar el script.

    mkdir <directory-name>
    cd <directory-name>
    
  4. Cree un archivo con el nombre main.py y edite el archivo mediante cualquier editor (aquí se ha utilizado el editor de dimensiones virtuales).

    touch main.py
    vim main.py
    
  5. Copie y pegue el contenido de la secuencia de comandos como se muestra a continuación en el archivo main.py y guarde el contenido del archivo escribiendo :x y haciendo clic en Intro.

    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)
    
    

Tarea 2: Ejecución del script de Python personalizado

  1. Proporcione permisos de ejecución para el archivo main.py mediante el comando.

    chmod +x main.py
    
  2. El script se debe ejecutar con los parámetros de fecha de inicio de log, fecha de finalización de log e ID de compartimento. Para comprobar el uso exacto del script, ejecute el script con la opción '-h' como se muestra a continuación.

    python3 main.py -h
    

    De esta forma, se mostrará la sintaxis correcta del script.

    ayuda de script

  3. Después de ejecutar el script, la fecha para la que se está ejecutando el script se mostrará en la pantalla con un mensaje que indica que se ha realizado correctamente, seguido del mensaje que indica la ubicación del archivo .csv de salida.

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

El archivo CSV se genera y almacena en la siguiente carpeta: /tmp/out.csv.

Tarea 3: Programar la recopilación de logs de auditoría (opcional)

Si desea programar una recopilación mensual/semanal de logs de auditoría, puede hacerlo definiendo los cronjobs para que el archivo .csv más antiguo se copie en otro archivo y los nuevos logs se guarden en el archivo out.csv.

  1. Escriba el siguiente comando para editar crontab.

    crontab -e
    
  2. Agregue los siguientes cronjobs para programar. Asegúrese de sustituir el parámetro **** por el ID de compartimento del compartimento/arrendamiento.

    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>
    

    Los trabajos anteriores se ejecutarán el 1 de cada mes a las 1 de la mañana y a las 1,15 de la mañana, respectivamente. Puede cambiar el tiempo en función de sus necesidades.

    Nota: Puede programar la ejecución del trabajo el día 30 o el día 31 de un mes para que el script no pierda un día o devuelva un error.

  3. Guarde el archivo y revise los cronjobs activos mediante el siguiente comando.

    crontab -l
    

Agradecimientos

Más recursos de aprendizaje

Explore otros laboratorios en docs.oracle.com/learn o acceda a más contenido de aprendizaje gratuito en el canal YouTube de Oracle Learning. Además, visite education.oracle.com/learning-explorer para convertirse en un explorador de Oracle Learning.

Para obtener documentación sobre los productos, visite Oracle Help Center.