Observação:

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

Tarefa 1: Implantar o script Python personalizado

  1. Verifique se o Python está instalado na VM usando o comando.

    python3 –-version
    
  2. Instale a biblioteca Pandas usando o comando.

    pip3 install pandas
    
  3. Crie um novo diretório e altere o diretório para implantar o script.

    mkdir <directory-name>
    cd <directory-name>
    
  4. 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
    
  5. 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

  1. Forneça permissões de execução ao arquivo main.py usando o comando.

    chmod +x main.py
    
  2. 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.

    ajuda de script

  3. 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.

    saída do script

Observação:

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.

  1. Digite o seguinte comando para editar o crontab.

    crontab -e
    
  2. 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.

  3. Salve o arquivo e revise os cronjobs ativos usando o comando a seguir.

    crontab -l
    

Aquisições

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.