Coletar registros de auditoria da Oracle Cloud Infrastructure

Compatível com:

Neste documento, explicamos como ingerir registros de auditoria da Oracle Cloud Infrastructure no Google Security Operations usando o Google Cloud Storage.

O serviço de auditoria da Oracle Cloud Infrastructure registra automaticamente as chamadas para todos os endpoints de interface de programação de aplicativos (API) pública da Oracle Cloud Infrastructure como eventos de registro. No momento, todos os serviços oferecem suporte ao registro em log pela auditoria do Oracle Cloud Infrastructure. Os eventos de registro gravados pelo Oracle Cloud Infrastructure Audit incluem chamadas de API feitas pelo console, pela interface de linha de comando (CLI), pelos kits de desenvolvimento de software (SDKs), pelos seus próprios clientes personalizados ou por outros serviços do Oracle Cloud Infrastructure.

Antes de começar

Verifique se você atende os seguintes pré-requisitos:

  • Uma instância do Google SecOps
  • Um projeto do GCP com a API Cloud Storage ativada
  • Permissões para criar e gerenciar intervalos do GCS
  • Permissões para gerenciar políticas do IAM em buckets do GCS
  • Permissões para criar serviços do Cloud Run, tópicos do Pub/Sub e jobs do Cloud Scheduler
  • Conta da Oracle Cloud Infrastructure com permissões para criar e gerenciar:
    • Hub do conector de serviço
    • Funções
    • Buckets de repositório de objetos
    • Políticas do IAM
  • Acesso privilegiado ao console da Oracle Cloud Infrastructure

Criar um bucket do Google Cloud Storage

  1. Acesse o Console do Google Cloud.
  2. Selecione seu projeto ou crie um novo.
  3. No menu de navegação, acesse Cloud Storage > Buckets.
  4. Clique em Criar bucket.
  5. Informe os seguintes detalhes de configuração:

    Configuração Valor
    Nomeie seu bucket Insira um nome globalmente exclusivo (por exemplo, oci-audit-logs-gcs)
    Tipo de local Escolha de acordo com suas necessidades (região, birregional, multirregional)
    Local Selecione o local (por exemplo, us-central1).
    Classe de armazenamento Padrão (recomendado para registros acessados com frequência)
    Controle de acesso Uniforme (recomendado)
    Ferramentas de proteção Opcional: ativar o controle de versões de objetos ou a política de retenção
  6. Clique em Criar.

Configurar a Oracle Cloud Infrastructure para exportar registros de auditoria para o GCS

A Oracle Cloud Infrastructure não é compatível com a exportação nativa para o Google Cloud Storage. Você vai usar o hub de conector de serviço da Oracle Cloud Infrastructure com uma função para encaminhar registros de auditoria ao GCS.

Criar uma função da Oracle Cloud Infrastructure para encaminhar registros ao GCS

  1. Faça login no Console do Oracle Cloud.
  2. Acesse Serviços para desenvolvedores > Funções > Aplicativos.
  3. Selecione o compartimento em que você quer criar o aplicativo de função.
  4. Clique em Criar aplicativo.
  5. Informe os seguintes detalhes de configuração:
    • Nome: insira audit-logs-to-gcs-app.
    • VCN: selecione uma rede de nuvem virtual.
    • Sub-redes: selecione uma sub-rede com acesso à Internet.
  6. Clique em Criar.
  7. Depois que o aplicativo for criado, clique em Começar e siga as instruções para configurar seu ambiente de desenvolvimento local com a CLI Fn.
  8. Crie um novo diretório de função na máquina local:

    mkdir oci-audit-to-gcs
    cd oci-audit-to-gcs
    
  9. Inicialize uma função do Python:

    fn init --runtime python oci-audit-to-gcs
    cd oci-audit-to-gcs
    
  10. Substitua o conteúdo de func.py pelo seguinte código:

    import io
    import json
    import logging
    import os
    from fdk import response
    from google.cloud import storage
    from google.oauth2 import service_account
    from datetime import datetime
    
    # Configure logging
    logging.basicConfig(level=logging.INFO)
    logger = logging.getLogger()
    
    # Environment variables
    GCS_BUCKET = os.environ.get('GCS_BUCKET')
    GCS_PREFIX = os.environ.get('GCS_PREFIX', 'oci-audit-logs')
    GCS_CREDENTIALS_JSON = os.environ.get('GCS_CREDENTIALS_JSON')
    
    def handler(ctx, data: io.BytesIO = None):
        """
        Oracle Cloud Infrastructure Function to forward Audit logs to GCS.
    
        Args:
            ctx: Function context
            data: Input data containing Audit log events
        """
    
        if not all([GCS_BUCKET, GCS_CREDENTIALS_JSON]):
            logger.error('Missing required environment variables: GCS_BUCKET or GCS_CREDENTIALS_JSON')
            return response.Response(
                ctx, response_data=json.dumps({"error": "Missing configuration"}),
                headers={"Content-Type": "application/json"}
            )
    
        try:
            # Parse input data
            body = json.loads(data.getvalue())
            logger.info(f"Received event: {json.dumps(body)}")
    
            # Extract log entries
            log_entries = []
            if isinstance(body, list):
                log_entries = body
            elif isinstance(body, dict):
                # Service Connector Hub sends data in specific format
                if 'data' in body:
                    log_entries = [body['data']] if isinstance(body['data'], dict) else body['data']
                else:
                    log_entries = [body]
    
            if not log_entries:
                logger.info("No log entries to process")
                return response.Response(
                    ctx, response_data=json.dumps({"status": "no_logs"}),
                    headers={"Content-Type": "application/json"}
                )
    
            # Initialize GCS client with service account credentials
            credentials_dict = json.loads(GCS_CREDENTIALS_JSON)
            credentials = service_account.Credentials.from_service_account_info(credentials_dict)
            storage_client = storage.Client(credentials=credentials, project=credentials_dict.get('project_id'))
            bucket = storage_client.bucket(GCS_BUCKET)
    
            # Write logs to GCS as NDJSON
            timestamp = datetime.utcnow().strftime('%Y%m%d_%H%M%S_%f')
            object_key = f"{GCS_PREFIX}/logs_{timestamp}.ndjson"
            blob = bucket.blob(object_key)
    
            ndjson = '\n'.join([json.dumps(entry, ensure_ascii=False) for entry in log_entries]) + '\n'
            blob.upload_from_string(ndjson, content_type='application/x-ndjson')
    
            logger.info(f"Wrote {len(log_entries)} records to gs://{GCS_BUCKET}/{object_key}")
    
            return response.Response(
                ctx, response_data=json.dumps({"status": "success", "records": len(log_entries)}),
                headers={"Content-Type": "application/json"}
            )
    
        except Exception as e:
            logger.error(f'Error processing logs: {str(e)}')
            return response.Response(
                ctx, response_data=json.dumps({"error": str(e)}),
                headers={"Content-Type": "application/json"},
                status_code=500
            )
    
  11. Atualize requirements.txt com as seguintes dependências:

    fdk>=0.1.0
    google-cloud-storage>=2.0.0
    google-auth>=2.0.0
    
  12. Implante a função na Oracle Cloud Infrastructure:

    fn -v deploy --app audit-logs-to-gcs-app
    
  13. Quando a implantação terminar, anote o OCID da função. Você vai usá-la na próxima etapa.

Configurar variáveis de ambiente de função

  1. No console do Oracle Cloud, acesse Serviços para desenvolvedores > Funções > Aplicativos.
  2. Clique no aplicativo (audit-logs-to-gcs-app).
  3. Clique no nome da função (oci-audit-to-gcs).
  4. Clique em Configuração.
  5. Adicione as seguintes variáveis de configuração:

    Chave Valor
    GCS_BUCKET O nome do bucket do GCS (por exemplo, oci-audit-logs-gcs)
    GCS_PREFIX Prefixo para arquivos de registro (por exemplo, oci-audit-logs)
    GCS_CREDENTIALS_JSON String JSON da chave da conta de serviço do GCP (veja abaixo)
  6. Clique em Salvar alterações.

Criar uma conta de serviço do GCP para a função da Oracle Cloud Infrastructure

A função do Oracle Cloud Infrastructure precisa de uma conta de serviço do GCP para gravar no bucket do GCS.

  1. No console do GCP, acesse IAM e administrador > Contas de serviço.
  2. Clique em Criar conta de serviço.
  3. Informe os seguintes detalhes de configuração:
    • Nome da conta de serviço: insira oci-function-gcs-writer.
    • Descrição da conta de serviço: insira Service account for OCI Function to write Audit logs to GCS.
  4. Clique em Criar e continuar.
  5. Na seção Conceder a essa conta de serviço acesso ao projeto, adicione o seguinte papel:
    1. Clique em Selecionar papel.
    2. Pesquise e selecione Administrador de objetos do Storage.
  6. Clique em Continuar.
  7. Clique em Concluído.
  8. Clique no e-mail da conta de serviço recém-criada.
  9. Acesse a guia Chaves.
  10. Clique em Adicionar chave > Criar nova chave.
  11. Selecione JSON como o tipo de chave.
  12. Clique em Criar.
  13. O arquivo de chave JSON será baixado no seu computador.
  14. Abra o arquivo de chave JSON e copie todo o conteúdo.
  15. Volte para a configuração da função do console do Oracle Cloud.
  16. Cole o conteúdo JSON na variável de configuração GCS_CREDENTIALS_JSON.

Conceder permissões do IAM no bucket do GCS

Conceda permissões de gravação à conta de serviço no bucket do GCS:

  1. Acesse Cloud Storage > Buckets.
  2. Clique no nome do bucket (oci-audit-logs-gcs).
  3. Acesse a guia Permissões.
  4. Clique em Conceder acesso.
  5. Informe os seguintes detalhes de configuração:
    • Adicionar principais: insira o e-mail da conta de serviço (oci-function-gcs-writer@PROJECT_ID.iam.gserviceaccount.com).
    • Atribuir papéis: selecione Administrador de objetos do Storage.
  6. Clique em Salvar.

Criar o Service Connector Hub da Oracle Cloud Infrastructure

  1. Faça login no console do Oracle Cloud.
  2. Acesse Observabilidade e gerenciamento > Geração de registros > Hub do conector de serviço.
  3. Selecione o compartimento em que você quer criar o conector de serviço.
  4. Clique em Criar conector de serviço.
  5. Informe os seguintes detalhes de configuração:

    • Informações do conector de serviço:
    Configuração Valor
    Nome do conector Insira audit-logs-to-gcs-connector
    Descrição Insira Forward OCI Audit logs to Google Cloud Storage
    Compartimento de recursos Selecione o compartimento
    • Configurar origem:
    Configuração Valor
    Origem Selecione Logging.
    Compartimento Selecione o compartimento que contém os registros de auditoria
    Grupo de registros Selecione _Audit (grupo de registros padrão para registros de auditoria).
  6. Clique em + Outro registro.

  7. Selecione o registro de auditoria do seu compartimento (por exemplo, _Audit_Include_Subcompartment).

    • Configurar destino:
    Configuração Valor
    Objetivo Selecione Funções.
    Compartimento de função Selecione o compartimento que contém a função.
    Aplicativo de função Selecionar audit-logs-to-gcs-app
    Função Selecionar oci-audit-to-gcs
  8. Role até Configurar tarefa (opcional) e deixe as configurações padrão.

  9. Clique em Criar.

Criar política do IAM para o hub de conectores de serviço

O Service Connector Hub precisa de permissões para invocar a função.

  1. No console do Oracle Cloud, acesse Identidade e segurança > Políticas.
  2. Selecione o compartimento em que você criou o Service Connector Hub.
  3. Clique em Criar política.
  4. Informe os seguintes detalhes de configuração:
    • Nome: insira service-connector-functions-policy.
    • Descrição: insira Allow Service Connector Hub to invoke Functions.
    • Compartimento: selecione o compartimento.
  5. Na seção Criador de políticas, ative a opção Mostrar editor manual.
  6. Insira as seguintes declarações de política:

    Allow any-user to use fn-function in compartment <compartment-name> where all {request.principal.type='serviceconnector'}
    Allow any-user to use fn-invocation in compartment <compartment-name> where all {request.principal.type='serviceconnector'}
    
    • Substitua <compartment-name> pelo nome do compartimento.
  7. Clique em Criar.

Testar a integração

  1. Faça login no console do Oracle Cloud.
  2. Realize algumas ações que geram registros de auditoria (por exemplo, criar ou modificar um recurso).
  3. Aguarde de 2 a 5 minutos para que os registros sejam processados.
  4. Acesse Cloud Storage > Buckets no console do GCP.
  5. Clique no nome do bucket (oci-audit-logs-gcs).
  6. Navegue até a pasta de prefixo (oci-audit-logs/).
  7. Verifique se os novos arquivos .ndjson estão aparecendo no bucket.

Recuperar a conta de serviço do Google SecOps

O Google SecOps usa uma conta de serviço exclusiva para ler dados do seu bucket do GCS. É necessário conceder a essa conta de serviço acesso ao bucket.

Encontrar o e-mail da conta de serviço

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo feed.
  3. Clique em Configurar um único feed.
  4. No campo Nome do feed, insira um nome para o feed (por exemplo, Oracle Cloud Audit Logs).
  5. Selecione Google Cloud Storage V2 como o Tipo de origem.
  6. Selecione Registros de auditoria da Oracle Cloud Infrastructure como o Tipo de registro.
  7. Clique em Get Service Account. Um e-mail exclusivo da conta de serviço é exibido, por exemplo:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. Copie esse endereço de e-mail para usar na próxima etapa.

Conceder permissões do IAM à conta de serviço do Google SecOps

A conta de serviço do Google SecOps precisa do papel Leitor de objetos do Storage no seu bucket do GCS.

  1. Acesse Cloud Storage > Buckets.
  2. Clique no nome do bucket (oci-audit-logs-gcs).
  3. Acesse a guia Permissões.
  4. Clique em Conceder acesso.
  5. Informe os seguintes detalhes de configuração:
    • Adicionar principais: cole o e-mail da conta de serviço do Google SecOps.
    • Atribuir papéis: selecione Leitor de objetos do Storage.
  6. Clique em Salvar.

Configurar um feed no Google SecOps para ingerir registros de auditoria do Oracle Cloud Infrastructure

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo feed.
  3. Clique em Configurar um único feed.
  4. No campo Nome do feed, insira um nome para o feed (por exemplo, Oracle Cloud Audit Logs).
  5. Selecione Google Cloud Storage V2 como o Tipo de origem.
  6. Selecione Registros de auditoria do Oracle Cloud Infrastructure como o Tipo de registro.
  7. Clique em Próxima.
  8. Especifique valores para os seguintes parâmetros de entrada:

    • URL do bucket de armazenamento: insira o URI do bucket do GCS com o caminho do prefixo:

      gs://oci-audit-logs-gcs/oci-audit-logs/
      
      • Substitua:

        • oci-audit-logs-gcs: o nome do bucket do GCS.
        • oci-audit-logs: prefixo/caminho de pasta opcional em que os registros são armazenados (deixe em branco para a raiz).
      • Exemplos:

        • Bucket raiz: gs://company-logs/
        • Com o prefixo: gs://company-logs/oci-audit-logs/
        • Com subpasta: gs://company-logs/oracle/audit/
    • Opção de exclusão da fonte: selecione a opção de exclusão de acordo com sua preferência:

      • Nunca: nunca exclui arquivos após as transferências (recomendado para testes).
      • Excluir arquivos transferidos: exclui arquivos após a transferência.
      • Excluir arquivos transferidos e diretórios vazios: exclui arquivos e diretórios vazios após a transferência.
    • Idade máxima do arquivo: inclua arquivos modificados nos últimos dias. O padrão é de 180 dias.
    • Namespace do recurso: o namespace do recurso.
    • Rótulos de ingestão: o rótulo a ser aplicado aos eventos desse feed.
  9. Clique em Próxima.

  10. Revise a configuração do novo feed na tela Finalizar e clique em Enviar.

Tabela de mapeamento de UDM

Campo de registro Mapeamento de UDM Lógica
accept_encoding_field additional.fields Mesclado
accept_field additional.fields Mesclado
additional_app additional.fields Mesclado
additional_content_type additional.fields Mesclado
additional_sort_by additional.fields Mesclado
additionaldetails_data additional.fields Mesclado
allow_methods_field additional.fields Mesclado
auth_type_label additional.fields Mesclado
authorization_field additional.fields Mesclado
backend_connect_time_field additional.fields Mesclado
backend_processing_time_field additional.fields Mesclado
caller_id_label additional.fields Mesclado
caller_name_label additional.fields Mesclado
cloud_event_versiom_field additional.fields Mesclado
compartment_id_field additional.fields Mesclado
compartment_name_field additional.fields Mesclado
connection_field additional.fields Mesclado
content_length_field additional.fields Mesclado
content_type_field additional.fields Mesclado
event_grouping_id_field additional.fields Mesclado
event_name_label additional.fields Mesclado
event_resource_label additional.fields Mesclado
event_source_label additional.fields Mesclado
event_type_label additional.fields Mesclado
event_type_versiom_field additional.fields Mesclado
has_compariment_id additional.fields Mapeado: true → additional_app
has_sort_by additional.fields Mapeado: true → additional_sort_by
listener_name_field additional.fields Mesclado
log_group_id_field additional.fields Mesclado
log_id_field additional.fields Mesclado
message additional.fields Valores mapeados (41 no total, por exemplo, \/ → tenant_id_label, \/ → auth_type_label, \/ → `ca... )
opc_request_id_field additional.fields Mesclado
origin_field additional.fields Mesclado
param0_field additional.fields Mesclado
param1_field additional.fields Mesclado
referer_field additional.fields Mesclado
request_processing_time_field additional.fields Mesclado
resource_id_field additional.fields Mesclado
routing_rules_engine_errors_field additional.fields Mesclado
routing_rules_matched_rule_field additional.fields Mesclado
routing_rules_rule_hits_field additional.fields Mesclado
routing_rules_rule_misses_field additional.fields Mesclado
source_field additional.fields Mesclado
tenant_id_label additional.fields Mesclado
column3 extensions.auth.type Mapeado: login successful → AUTHTYPE_UNSPECIFIED
message extensions.auth.type Mapeado: \/ → AUTHTYPE_UNSPECIFIED
column3 metadata.description Mapeado diretamente
data.message metadata.description Mapeado diretamente
column1 metadata.event_timestamp Analisado como yyyy-MM-dd HH:mm:ss
data_event_time metadata.event_timestamp Analisado como yyyy-MM-ddTHH:mm:ss.SSSSSSZ
time metadata.event_timestamp Analisado como ISO8601
metadata_event_type metadata.event_type Mapeado diretamente
type metadata.product_event_type Mapeado diretamente
data_event_id metadata.product_log_id Mapeado diretamente
id metadata.product_log_id Mapeado diretamente
message metadata.product_name Mapeado: \/ → OCI_AUDIT
specversion metadata.product_version Mapeado diretamente
message metadata.vendor_name Mapeado: \/ → Oracle
message network.application_protocol Mapeado: \/ → HTTPS, \/ → HTTP
protocol network.application_protocol Mapeado: (?i)HTTPS → HTTPS, (?i)HTTP → HTTP
version network.application_protocol_version Mapeado diretamente
data_request_action network.http.method Mapeado diretamente
method network.http.method Mapeado diretamente
data_identity_userAgent network.http.parsed_user_agent Renomeado/mapeado
data_request_agent network.http.parsed_user_agent Renomeado/mapeado
url network.http.referral_url Mapeado diretamente
data.backendStatusCode network.http.response_code Mapeado diretamente
data_response_status network.http.response_code Renomeado/mapeado
data.userAgent network.http.user_agent Mapeado diretamente
data_identity_userAgent network.http.user_agent Mapeado diretamente
data_request_agent network.http.user_agent Mapeado diretamente
data.receivedBytes network.received_bytes Mapeado diretamente
message network.received_bytes Mapeado: \/ → uinteger
data.sentBytes network.sent_bytes Mapeado diretamente
message network.sent_bytes Mapeado: \/ → uinteger
data_identity_consoleSessionId network.session_id Renomeado/mapeado
data.sslCipher network.tls.cipher Mapeado diretamente
data.sslProtocol network.tls.version Mapeado diretamente
data.host principal.asset.hostname Mapeado diretamente
hostname principal.asset.hostname Mapeado diretamente
column6 principal.asset.ip Mesclado
data.forwardedForAddr principal.asset.ip Mesclado
data_identity_ipAddress principal.asset.ip Mapeado: ^(?:[0-9]{1,3}[.]){3}[0-9]{1,3}$ → data_identity_ipAddress
data_request_origin principal.asset.ip Mesclado
ip1 principal.asset.ip Mesclado
ip2 principal.asset.ip Mesclado
message principal.asset.ip Valores mapeados (7 no total, por exemplo, \/ → column6, \/ → data_request_origin, \/ → ip2)
src_ip principal.asset.ip Mesclado
data.host principal.hostname Mapeado diretamente
hostname principal.hostname Mapeado diretamente
column6 principal.ip Mesclado
data.forwardedForAddr principal.ip Mesclado
data_identity_ipAddress principal.ip Mapeado: ^(?:[0-9]{1,3}[.]){3}[0-9]{1,3}$ → data_identity_ipAddress
data_request_origin principal.ip Mesclado
ip1 principal.ip Mesclado
ip2 principal.ip Mesclado
message principal.ip Valores mapeados (7 no total, por exemplo, \/ → column6, \/ → data_request_origin, \/ → ip2)
src_ip principal.ip Mesclado
data_request_headers_sec-ch-ua-platform_0 principal.platform Mapeado: (?i)Linux → LINUX, (?i)windows → WINDOWS, (?i)mac/ios → MAC
message principal.platform Mapeado: \/ → LINUX, \/ → WINDOWS, \/ → MAC
originalConnection.sourcePort principal.port Mapeado diretamente
src_port principal.port Mapeado diretamente
data_request_headers_oci-original-url_0 principal.url Mapeado diretamente
credentials_label principal.user.attribute.labels Mesclado
message principal.user.attribute.labels Mapeado: \/ → credentials_label
data.identity.principalName principal.user.user_display_name Mapeado diretamente
data.username principal.user.user_display_name Mapeado diretamente
data.identity.principalId principal.user.userid Mapeado diretamente
data.principalId principal.user.userid Mapeado diretamente
column3 security_result Mapeado: login successful → security_result
message security_result Mapeado: \/ → security_result
allow_action security_result.action Mesclado
column3 security_result.action Mapeado: login successful → allow_action
message security_result.action Mapeado: \/ → allow_action
credential_type_field security_result.detection_fields Mesclado
message security_result.detection_fields Mapeado: \/ → credential_type_field
data.response.message security_result.summary Mapeado diretamente
message target.asset.ip Mapeado: \/ → originalConnection.destinationIp, \/ → tar_ip
originalConnection.destinationIp target.asset.ip Mesclado
tar_ip target.asset.ip Mesclado
message target.ip Mapeado: \/ → originalConnection.destinationIp, \/ → tar_ip
originalConnection.destinationIp target.ip Mesclado
tar_ip target.ip Mesclado
originalConnection.destinationPort target.port Mapeado diretamente
tar_port target.port Mapeado diretamente
message target.resource.attribute.labels Mapeado: \/ → namespace_label
namespace_label target.resource.attribute.labels Mesclado
type target.resource.attribute.labels Mapeado: listretentionrules → namespace_label
data.resourceId target.resource.name Mapeado diretamente
data.resourceName target.resource.name Mapeado diretamente
bucketId target.resource.product_object_id Mapeado diretamente
data.resourceId target.resource.product_object_id Mapeado diretamente
data_request_id target.resource.product_object_id Mapeado diretamente
message target.resource.resource_type Mapeado: \/ → STORAGE_BUCKET
type target.resource.resource_type Mapeado: listretentionrules → STORAGE_BUCKET
data_request_path target.url Mapeado diretamente
column2 target.user.email_addresses Mesclado
message target.user.email_addresses Mapeado: \/ → column2
N/A extensions.auth.type Constante: AUTHTYPE_UNSPECIFIED
N/A metadata.product_name Constante: OCI_AUDIT
N/A metadata.vendor_name Constante: Oracle
N/A network.application_protocol Constante: HTTPS
N/A principal.platform Constante: LINUX
N/A target.resource.resource_type Constante: STORAGE_BUCKET

Registro de alterações

Ver o registro de alterações deste analisador

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.