Observação:
- Este tutorial requer acesso ao Oracle Cloud. Para se inscrever e obter uma conta gratuita, consulte Conceitos Básicos do Oracle Cloud Infrastructure Free Tier.
- Ele usa valores de exemplo para credenciais, tenancy e compartimentos do Oracle Cloud Infrastructure. Ao concluir seu laboratório, substitua esses valores por valores específicos do seu ambiente de nuvem.
Exportar Logs de Auditoria do OCI no formato CSV para um intervalo de tempo personalizado
Introdução
Os Logs de Auditoria do OCI estão relacionados a eventos emitidos pelo serviço Oracle Cloud Infrastructure Audit. Esses logs estão disponíveis na página Auditoria de Log da Console do OCI ou podem ser pesquisados na página Pesquisar, juntamente com o restante dos logs. Você pode exportar Logs de Auditoria do Oracle Cloud Infrastructure (OCI) no formato JSON para um intervalo de tempo personalizado de no máximo 14 dias na Console do Oracle Cloud.
Neste tutorial, você aprenderá a implantar um script personalizado para exportar Logs de Auditoria por um período superior a 14 dias no formato CSV.
Observação: O período máximo de retenção dos Logs de Auditoria é de 365 dias apenas.
Objetivos
Implante um script Python personalizado para exportar Logs de auditoria do OCI em formato CSV para qualquer intervalo de tempo personalizado (menos de 365 dias).
Pré-requisitos
- A VM na qual o script é implantado deve ser uma instância do Linux.
- Instale a CLI do OCI na VM ou execute o script no Cloud Shell.
- Instale Python3 na VM.
Tarefa 1: Implantar o script Python personalizado
-
Verifique se o Python está instalado na VM usando o comando.
python3 –-version
-
Instale a biblioteca Pandas usando o comando.
pip3 install pandas
-
Crie um novo diretório e altere o diretório para implantar o script.
mkdir <directory-name> cd <directory-name>
-
Crie um arquivo com o nome main.py e edite o arquivo usando qualquer editor (aqui, o editor vim foi usado).
touch main.py vim main.py
-
Copie-coloque o conteúdo do script conforme mostrado abaixo no arquivo main.py e salve o conteúdo do arquivo digitando :x e clicando em 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)
Tarefa 2: Executar o script Python personalizado
-
Forneça permissões de execução ao arquivo main.py usando o comando.
chmod +x main.py
-
O script precisa ser executado com a data inicial do log, a data final do log e os parâmetros de id do compartimento. Para verificar o uso exato do script, execute o script com a opção '-h', conforme mostrado abaixo.
python3 main.py -h
Isso exibirá a sintaxe correta do script.
-
Após a execução do script, a data para a qual o script está sendo executado será exibida na tela com uma mensagem de êxito, seguida da mensagem informando o local do arquivo .csv de saída.
Observação:
Informe as datas inicial e final dos Logs de Auditoria no formato AAAA-MM-DD juntamente com o ID do Compartimento do compartimento para o qual você deseja exportar os Logs de Auditoria.
Para ambientes maiores ou durações de tempo maiores, a quantidade de Logs de Auditoria a serem coletados e convertidos para o formato .csv estará em milhões para os quais o script pode levar algumas horas para ser executado. Será melhor executar o script para tais ambientes em segundo plano com a opção '&'.
Você pode usar o comando linux
nohup
ao executar o script em segundo plano para que todos os logs de saída sejam direcionados ao arquivonohup.out
que você pode revisar posteriormente. Você pode executar o script com o utilitárionohup
usando o comando a seguir e, posteriormente, verificar os logs no arquivonohup.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> &
O arquivo CSV é gerado e armazenado na seguinte pasta: /tmp/out.csv.
Tarefa 3: Programar a coleta de Logs de Auditoria (opcional)
Se você quiser programar uma coleção mensal/semanal de Logs de Auditoria, poderá fazer isso definindo os cronjobs de forma que o arquivo .csv mais antigo seja copiado para outro arquivo e que novos logs sejam salvos no arquivo out.csv
.
-
Digite o seguinte comando para editar o crontab.
crontab -e
-
Adicione os cronjobs a seguir a serem programados. Certifique-se de substituir o parâmetro **
** pelo id do compartimento de seu 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>
Os jobs acima serão executados no 1o dia de cada mês em 1 A.M. e 1.15 A.M. respectivamente. Você pode alterar o tempo de acordo com seus requisitos.
Observação: você pode programar a execução do job no dia 30 ou 31 de um mês para que seu script não perca um dia nem retorne um erro.
-
Salve o arquivo e revise os cronjobs ativos usando o comando a seguir.
crontab -l
Links Relacionados
- Serviço de Auditoria do OCI
- Logs de Auditoria
- Período de Retenção do Log de Auditoria
- CLI do OCI
- OCI Cloud Shell
Aquisições
- Autor - Maninder Singh Flora (Arquiteto de Nuvem)
Mais Recursos de Aprendizagem
Explore outros laboratórios no site docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal YouTube do Oracle Learning. Além disso, visite education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.
Para obter a documentação do produto, visite o 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.