Nota:
- Este tutorial requiere acceso a Oracle Cloud. Para registrarse para obtener una cuenta gratuita, consulte Introducción al nivel gratuito de Oracle Cloud Infrastructure.
- Utiliza valores de ejemplo para las credenciales, el arrendamiento y los compartimentos de Oracle Cloud Infrastructure. Al finalizar el laboratorio, sustituya estos valores por otros específicos de su entorno en la nube.
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
- La máquina virtual en la que se despliega el script debe ser una instancia de Linux.
- Instale la CLI de OCI en la máquina virtual o ejecute el script desde Cloud Shell.
- Instale Python3 en la máquina virtual.
Tarea 1: Despliegue del script de Python personalizado
-
Verifique si Python está instalado en la VM mediante el comando.
python3 –-version
-
Instale la biblioteca de Pandas con el comando.
pip3 install pandas
-
Cree un nuevo directorio y cambie al directorio para desplegar el script.
mkdir <directory-name> cd <directory-name>
-
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
-
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
-
Proporcione permisos de ejecución para el archivo main.py mediante el comando.
chmod +x main.py
-
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.
-
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.
Nota:
Debe introducir las fechas de inicio y finalización para los logs de auditoría en formato AAAA-MM-DD junto con el ID de compartimento del compartimento para el que desea exportar los logs de auditoría.
Para entornos más grandes o para duraciones de tiempo más grandes, la cantidad de logs de auditoría que se recopilarán y convertirán al formato .csv será de millones para los que el script puede tardar unas horas en ejecutarse. Será mejor ejecutar el script para dichos entornos en segundo plano con la opción '&'.
Puede utilizar el comando linux
nohup
mientras ejecuta la secuencia de comandos en segundo plano para que todos los logs de salida se dirijan al archivonohup.out
, que puede revisar más adelante. Puede ejecutar el script con la utilidadnohup
mediante el siguiente comando y, más adelante, comprobar los logs en el archivonohup.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> &
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
.
-
Escriba el siguiente comando para editar crontab.
crontab -e
-
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.
-
Guarde el archivo y revise los cronjobs activos mediante el siguiente comando.
crontab -l
Enlaces relacionados
- Servicio de auditoría de OCI
- Logs de auditoría
- Período de retención de log de auditoría
- CLI de OCI
- OCI Cloud Shell
Agradecimientos
- Autor: Maninder Singh Flora (arquitecto de nube)
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.
Export OCI Audit Logs in CSV format for a custom time range
F57892-02
December 2022
Copyright © 2022, Oracle and/or its affiliates.