Observação:

Ingestão de logs do Oracle Cloud Infrastructure no Microsoft Azure Sentinel usando Funções do OCI

Introdução

O Oracle Cloud Infrastructure (OCI) Functions é uma plataforma Functions-as-a-Service totalmente gerenciada, multitenant, altamente escalável e sob demanda. Foi desenvolvido no Oracle Cloud Infrastructure de nível empresarial e desenvolvido com o mecanismo de código-fonte aberto do Fn Project.

O Service Connector Hub é uma plataforma de barramento de mensagens na nuvem que oferece um único painel de controle para descrever, executar e monitorar interações durante a movimentação de dados entre os serviços do Oracle Cloud Infrastructure. Use o serviço Service Connector Hub para transferir dados entre serviços no Oracle Cloud Infrastructure.

Usando os serviços Service Connector and Functions, você pode conectar a geração de logs do seu ambiente de nuvem OCI com o envio automático e escalável de todos os registros de segurança de informações do seu ambiente à instância de gerenciamento de eventos e informações de segurança (SIEM) Microsoft Azure Sentinel.

Objetivo

Ingestão de logs do OCI no Microsoft Azure Sentinel usando Funções do OCI.

Pré-requisitos

Tarefa 1: Iniciar a Instância do OCI

  1. Crie uma nova instância do OCI por meio da Console da Web e ative qualquer um de seus plug-ins por padrão, vá para a página Instâncias e clique em Criar Instância.

    Criar Instância do OCI

  2. Preencha todas as informações necessárias para a criação da instância.

    Preencher as informações necessárias para a configuração da Instância

  3. Vá até o final da página e clique em Mostrar opções avançadas.

    Mostrar opções avançadas da instância

  4. Algumas guias aparecerão na tela. Clique em Oracle Cloud Agent e selecione os plug-ins que deseja ativar após a conclusão da criação da instância.

    Opção do Oracle Cloud Agent

  5. Todos os plug-ins selecionados nessa guia serão ativados automaticamente quando a instância estiver pronta para uso.

    Configuração de Plug-ins do Oracle Cloud Agent

  6. Depois de selecionar os plug-ins, clique em Criar no final da página.

    Criar a instância do OCI

Tarefa 2: Configurar as definições de Log do OCI

Tarefa 2.1: Configurar logs personalizados da Instância do Windows

Após criar a instância do Windows, configure seu ambiente do OCI para capturar logs do Visualizador de Eventos por meio do Oracle Agent instalado no servidor.

  1. Antes de começar, certifique-se de que o plug-in "Logs Personalizados" esteja ativo no servidor do qual você deseja coletar logs. Na console do OCI, vá para Compute, Instâncias.

    Certifique-se de que o plug-in de Logs Personalizados esteja ativo

  2. Selecione a instância a ser monitorada.

    Selecione sua instância recém-criada

  3. Clique na guia Oracle Cloud Agent e certifique-se de que o plug-in chamado Monitoramento de Logs Personalizados esteja ativado.

    Ativar o plug-in Custom Logs Monitoring

    • Se o plug-in não estiver ativado em sua instância, ative-o. Depois disso, vamos configurar o log do OCI para que os eventos do Visualizador de Eventos do Windows possam ser capturados por este agente.

Tarefa 2.2: Configurar o Grupo Dinâmico de servidores

Para capturar logs do Visualizador de Eventos de um ou mais servidores Windows, um Grupo Dinâmico deve ser criado. Este grupo conterá todas as instâncias do Windows que devem ter seus logs capturados.

  1. Para criar o Grupo Dinâmico, clique no menu principal da console do OCI e vá para Identidade e Segurança, Identidade.

    Acessar o menu Identidade

  2. No menu Identidade, acesse o submenu *Domínios".

    Acessar o menu Domínio

  3. Clique em seu Domínio de Identidades (neste exemplo do tutorial, usamos Padrão).

    Acessar a configuração de domínio padrão

  4. Agora, dentro do domínio de identidades, clique no menu Grupos dinâmicos para que possamos criar o Grupo Dinâmico que conterá todos os servidores Windows a serem monitorados. Quando terminar, clique em Criar grupo dinâmico.

    Criar um grupo dinâmico de servidores

  5. Uma nova página será aberta. Preencha as informações referentes à criação do Grupo Dinâmico (nome e descrição) e, em Regras de correspondência, clique no link Criador de regras para poder criar sua regra para selecionar instâncias que serão agrupadas neste Grupo Dinâmico.

    Criar a regra de grupo dinâmico

  6. A regra de exemplo que criaremos agrupará todos os servidores existentes em nosso Compartimento. Para fazer isso, basta capturar o ID do Compartimento e inseri-lo no campo Valor, conforme mostrado na imagem abaixo.

    Preencher com os valores necessários

Observação: você pode usar filtros avançados e criar Grupos Dinâmicos para capturar somente instâncias com determinadas Tags. Para isso, recomendamos ler a documentação oficial do OCI em: Gravando Regras de Correspondência para Definir Grupos Dinâmicos.

Tarefa 2.3: Criar um Grupo de Logs

Você também precisará criar um grupo de logs para poder concentrar todos os logs enviados pelos agentes instalados nos servidores Windows em seu ambiente.

  1. Clique no menu principal da console do OCI e vá para Observabilidade e Gerenciamento, Grupos de Logs.

    Crie seu grupo de logs

  2. Ao acessar a página de serviço, clique em Criar Grupo de Logs.

    Crie seu grupo de logs

  3. Na página de criação do grupo de logs, preencha as informações solicitadas e clique em Criar.

    Preencher as informações necessárias

Quando esta etapa terminar, vamos começar a criar a captura de log do Visualizador de Eventos pelo Oracle Cloud Agent instalado na instância do OCI.

Tarefa 2.4: Configurar Registro em Log do OCI

  1. Depois que a instância, o Grupo Dinâmico e o Grupo de Logs forem configurados, vá para Observabilidade e Gerenciamento e clique em Registro em Log.

    Acessar o serviço Logging

  2. Na página Log do OCI, clique em Configurações do Agente, para que possamos criar a configuração que permitirá o envio de logs do Visualizador de Eventos do Windows para Log do OCI. Quando estiver dentro da página de configuração do agente, clique em Criar configuração do agente.

    Criar configuração do agente

  3. Preencha todos os campos necessários na página e selecione o Grupo Dinâmico criado na etapa anterior.

    Preencher as informações necessárias

    • Ao preencher esses itens iniciais, role a página para baixo e preencha os campos Configuração do Agente, informando que você deseja capturar o "log de eventos do Windows" de cada um dos canais disponíveis (Aplicativo, Segurança e Sistema). Aqui você precisará repetir o processo de criação de entradas de log para cada um dos canais.

    • Quando a configuração for concluída, a página de configuração do agente ficará disponível e será semelhante a esta.

      Informações detalhadas de configuração do agente

      Observação: A configuração do agente acima foi criada para capturar logs e logs do Visualizador de Eventos gerados no arquivo /var/log/messages nos servidores Linux.

    • Quando a Configuração do Agente estiver no status Ativo, aguarde aproximadamente 5 minutos até que a primeira coleta de log possa ser feita. Para exibir os logs das instâncias monitoradas que estão sendo coletadas, clique no menu Explorar log, conforme mostrado na imagem abaixo.

      Exibir logs

Tarefa 3: Observe os detalhes do Microsoft Azure Sentinel

Importante: Não é escopo desta documentação fornecer orientação sobre como criar e configurar o Microsoft Azure Sentinel na sua assinatura do Microsoft Azure. Para isso, acesse a documentação oficial do produto no site da Microsoft.

Tarefa 4: Criar seu OCI Vault

Agora que já temos os dados do Espaço de Trabalho do Microsoft Azure Log Analytics pertencentes ao SIEM Sentinel, vamos criar um OCI Vault para armazenar o valor secreto copiado na tarefa anterior. Esse segredo deve ser armazenado no OCI Vault para que você não precise inseri-lo no código do OCI Functions que criaremos na próxima etapa.

  1. Para criar seu OCI Vault, vá para o menu principal da console do OCI e vá para Identidade e Segurança, Vault.

    Criar seu OCI Vault

  2. Depois que a página Vault for carregada, clique em Criar Vault, selecione o compartimento desejado e nomeie seu Vault.

    Preencher as informações necessárias

  3. Após criar o Vault, você precisará criar sua Chave de Criptografia Principal. Esta chave será usada para criptografar todos os segredos no Vault. Para fazer isso, clique em Criar Chave conforme mostrado na imagem abaixo.

    Crie sua Chave de Criptografia Principal (MEK)

  4. Quando terminar de criar sua Chave Mestra, clique no menu Segredos e crie o segredo do Microsoft Azure que você anotou na etapa anterior.

    Crie seu segredo

  5. Preencha os campos necessários para criar seu Segredo no Vault com os dados de chave primária ou secundária do Espaço de Trabalho do Microsoft Azure Sentinel Log Analytics, conforme mostrado na Tarefa 3.

  6. Os outros itens (ID do Espaço de Trabalho do Sentinel e o nome da tabela em que os logs serão armazenados no Sentinel) podem ou não ser inseridos no Vault. Aqui, vamos inseri-los dentro do código da nossa Função.

Importante: Anote o OCID do Segredo que você cria no Vault.

Tarefa 5: Criar e configurar Funções do OCI

Depois de configurar o ambiente de log centralizado na região do OCI, o Vault e o ambiente do Azure estão prontos, é hora de criar a Função do OCI que enviará os Logs Personalizados e os Logs de Auditoria da região do OCI para o Microsoft Azure Sentinel.

Tarefa 5.1: Criar a Função OCI

  1. Vá para o menu principal da console do OCI e vá para Serviços do Desenvolvedor, Funções.

    Serviço Access OCI Functions

  2. Depois que a página Funções for carregada, clique em Criar aplicativo.

    Crie seu aplicativo

  3. Preencha os campos obrigatórios e clique em Criar.

    Preencher as informações necessárias

  4. Após a criação, observe que sua Função não será protegida por nenhum grupo de segurança de rede. É necessário adicioná-lo a um grupo de segurança de rede.

    Configuração do NSG

    Pontos importantes:

    1. Como sua Função acessará o ponto final público do Microsoft Azure para enviar logs ao Microsoft Azure Sentinel, essa Função deverá ser criada em uma sub-rede que tenha acesso à Internet.

    2. Valide também suas Listas de Segurança VNET para garantir que nenhuma delas impeça sua Função OCI de acessar a Internet.

Tarefa 5.2: Configurar Funções e Inicialização do OCI

Depois que a Função do OCI tiver sido criada, você verá na tela os comandos necessários para configurar a função no ambiente. Aqui, como exemplo, seguiremos o passo a passo pelo Cloud Shell, mas também é possível executar essas configurações diretamente no seu equipamento.

  1. Abra o Cloud Shell diretamente na console web da região OCI a ser configurada (neste tutorial, a região é Leste do Brasil).

    Região para configuração da Função

  2. Siga as etapas indicadas na página Função e execute os comandos solicitados no terminal do Cloud Shell.

    Execute comandos no terminal cloud-shell

  3. Os primeiros 3 comandos a serem executados não requerem alterações. No entanto, no quarto comando, você precisará fornecer o nome do repositório no qual a imagem do aplicativo será armazenada. Em nosso exemplo, o nome inserido era repo-ocilog-to-azuresiem.

    $ fn update context registry gru.ocir.io/xxxxxxxxxa/repo-ocilog-to-azuresiem

    Execução de comandos

  4. Gere um Token de Autenticação no perfil do Oracle Cloud Infrastructure Identity and Access Management (OCI IAM). O Token de Autenticação é a credencial de acesso que permitirá que você interaja com o repositório do OCI no qual a imagem do Docker da sua Função será armazenada. Clique no ícone de usuário na console Web do OCI e, em seguida, clique em Meu perfil.

    Criando um Token de Autenticação

  5. Quando estiver dentro da página do usuário, role para baixo e clique em Tokens de autenticação.

    Menu Token de Autenticação

  6. Na seção Tokens de Autenticação, clique em Gerar Token.

    Gerar Token

  7. Preencha o nome do Token de Autenticação e clique em Gerar token.

    Preencher as informações necessárias

    Importante: Anote esse token e armazene-o em um lugar seguro. Esse token é sua senha de acesso ao Registro do OCI no qual suas imagens de Função serão armazenadas.

  8. Retorne à página Funções acessando o menu principal da console web do OCI e acessando Serviços do Desenvolvedor, Funções.

    Retornar à página Funções

  9. Na página Funções, acesse sua Função criada nas etapas anteriores.

    Acessar sua função

  10. Clique no menu Conceitos Básicos e continue passo a passo após a etapa de criação do Token de Autenticação.

    Menu Função Get Started

  11. Execute o comando docker login e, como senha, use a string que você acabou de copiar da criação do Token de Autenticação na última etapa executada.

    Siga as instruções de Conceitos Básicos

  12. Agora, nas próximas etapas, criaremos, implantaremos e chamaremos a Função. Para inicializar a função no Cloud Shell, altere o comando sugerido no exemplo mostrado na tela. Essa alteração é necessária porque o Ambiente de Runtime que vamos usar está no Python (e não no Java, conforme mostrado no exemplo do hello-world sugerido pela criação da Função).

    $ fn init --runtime python func-ocilog-to-azuresiem

    Invocar sua função

Tarefa 5.2.1: Gravando o código-fonte da sua Função OCI

  1. Depois que o comando init for executado, acesse o diretório Função recém-criado.

    $ cd func-ocilog-to-azuresiem/

    • Observe que dentro do diretório que você acabou de acessar há um arquivo Python (func.py), um arquivo YAML (func.yaml) e um arquivo de requisitos (requirements.txt). Precisaremos editar dois desses arquivos.
  2. Edite o arquivo func.py, exclua todo o conteúdo e insira o conteúdo abaixo nele.

    import io
    import json
    import requests
    import datetime
    import hashlib
    import hmac
    import base64
    import logging
    import oci
    import base64
    import sys
    from fdk import response
    
    # Global variable
    logger = logging.getLogger()
    
    # Get Resource Principal Credentials
    # OCI Functions get permission to read vault from OCI IAM
    signer = oci.auth.signers.get_resource_principals_signer()
    
    # Retrieve secret from OCI Vault
    def get_binary_secret(secret_ocid):
        try:
            client = oci.secrets.SecretsClient({}, signer=signer)
            secret_content = client.get_secret_bundle(secret_ocid).data.secret_bundle_content.content.encode('utf-8')
            secret_content_decoded = base64.b64decode(secret_content).decode('UTF-8')
        except Exception as ex:
            logger.critical("ERROR: failed to retrieve the secret content from OCI Vault. ", ex)
            raise
        return secret_content_decoded
    
    # Build the API signature
    def  build_signature(customer_id, shared_key, date, content_length, method, content_type, resource):
        x_headers =  'x-ms-date:'  + date
        string_to_hash = method +  "\n"  + str(content_length) +  "\n"  + content_type +  "\n"  + x_headers +  "\n"  + resource
        bytes_to_hash = bytes(string_to_hash, encoding= "utf-8" )
        decoded_key = base64.b64decode(shared_key)
        encoded_hash = base64.b64encode(hmac.new(decoded_key, bytes_to_hash, digestmod=hashlib.sha256).digest()).decode()
        authorization =  "SharedKey {}:{}" .format(customer_id,encoded_hash)
        return  authorization
    
    # Build and send a request to the POST API (Microsoft Azure Sentinel public endpoint)
    def  post_data(customer_id, shared_key, body, log_type, logger):
        method =  'POST'
        content_type =  'application/json'
        resource =  '/api/logs'
        rfc1123date = datetime.datetime.utcnow().strftime( '%a, %d %b %Y %H:%M:%S GMT' )
        content_length = len(body)
        signature = build_signature(customer_id, shared_key, rfc1123date, content_length, method, content_type, resource)
        uri =  'https://'  + customer_id +  '.ods.opinsights.azure.com'  + resource +  '?api-version=2016-04-01'
    
        headers = {
            'content-type' : content_type,
            'Authorization' : signature,
            'Log-Type' : log_type,
            'x-ms-date' : rfc1123date
        }
    
        response = requests.post(uri,data=body, headers=headers)
        if (response.status_code >= 200 and  response.status_code <=  299 ):
            logger.critical( '===> Upload to Microsoft Azure Sentinel was accepted %s', content_length )
        else:
            logger.critical( "Error during upload.  Response code: {}" .format(response.status_code))
    
    ####
    ## PART 3
    ####
    
    #
    # Entrypoint and initialization
    #
    def handler(ctx, data: io.BytesIO=None):
        logger.info("OCI Function - Handler function init fired.")
    
        # Update the customer ID to your Log Analytics workspace ID
        customer_id =  ‘<PUT_HERE_YOUR_AZURE_LOG_ANALYTICS_WORKSPACE_ID>'
    
        # For the shared key, use either the primary or the secondary Connected Sources client authentication key
        shared_key_OCID = "<PUT_HERE_THE_OCID_OF_YOUR_OCI_VAULT_SHARED_KEY_SECRET>"
        shared_key = get_binary_secret(shared_key_OCID)
    
        # The log type is the name of the event that is being submitted
        log_type =  '<SENTINEL_TABLE_NAME>'
    
        try:
            log_body = data.getvalue()
            post_data(customer_id, shared_key, log_body, log_type, logger)
        except  Exception  as  err:
            logger.error( "Error in main process: {}" .format(str(err)))
        return  response.Response(
            ctx,
            response_data=json.dumps({ "status" :  "Success" }),
            headers={ "Content-Type" :  "application/json" }
        )
    
    
    • Este é o script Python que estabelecerá conexão com o Azure SIEM e enviará os logs do OCI para o ponto final remoto.

    • Além de copiar e colar esse script, você precisará alterar 3 campos dentro dele

      1. _customer_id: ID do Espaço de Trabalho do Log Analytics na assinatura do Azure, no menu Gerenciamento de Agentes.

      2. _shared_key: Chave primária ou secundária que também pode ser obtida no menu Gerenciamento de agentes.

      3. _log_type: Nome do Espaço de Trabalho do Log Analytics que o SIEM Sentinel usa. Todos os logs que entram neste Espaço de Trabalho são analisados pelo Sentinel. Aqui, em nosso exemplo, usamos OCILogging.

    • Veja abaixo um exemplo de impressão da tela em que é possível obter as informações acima.

      Valores do Azure no Espaço de Trabalho do Log Analytics

    Observação: Não há escopo deste documento para configurar o Espaço de Trabalho do Log Analytics na sua Assinatura do Azure. Para isso, procure mais informações na documentação oficial da Microsoft.

  3. Depois de alterar o arquivo func.py, é hora de editar o arquivo requirements.txt. Vamos inserir um requisito no qual o gerenciador de pacotes do OCI Functions instalará as dependências Python necessárias para que nosso script funcione corretamente. Para esse caso, insira a palavra requests na última linha do arquivo:

    Módulos Python necessários

  4. Quando terminar, execute a etapa de implantação da sua Função.

    $ fn -v deploy --app app-ocilog-to-azuresiem

Após alguns minutos, a configuração da Função e a criação da imagem do Docker serão concluídas com sucesso.

Módulos Python necessários

Tarefa 5.2.2: Forneça as permissões necessárias para a Função do OCI

Para que a Função do OCI seja executada sem problemas, ela precisará de permissões para ler o segredo do Azure dentro do Vault. Para isso, precisaremos criar um Grupo Dinâmico para a Função que criamos e, para esse Grupo Dinâmico, daremos a permissão necessária (menos privilégio) para que nosso código possa ler o Vault e capturar a chave compartilhada do Azure de forma segura.

Assim, da mesma forma que fizemos no item 2.2 acima, onde criamos um Grupo Dinâmico para agregar os servidores que coletarão os logs, retrairá-los e criar um Grupo Dinâmico para incluir nossa Função.

Durante a criação do Grupo Dinâmico, você precisará de uma Regra de Correspondência que será usada para capturar sua Função. Aqui, em nosso exemplo, criaremos uma Regra de Correspondência que listará todas as Funções do Compartimento que estamos usando exclusivamente para este tutorial.

ALL {resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaxxxxgjxxxxglxxxxiqxxxxjdxxxxnxxxxmxxxxm3xxxxmoxxxxsxxx'}

  1. Capture o OCID do Compartimento e insira-o na Regra de Correspondência e crie seu Grupo Dinâmico.

    Configurar seu grupo dinâmico para Funções

  2. Depois de criar seu Grupo Dinâmico, vá para Identidade e Segurança, Políticas para criar a política que permitirá que a Função acesse o Vault no modo de leitura.

    Criar a política para permitir que o serviço Functions acesse o Vault

    • Depois que o Grupo Dinâmico for criado, crie a política que permitirá que a Função acesse o Vault.
  3. Use a política abaixo para conceder o acesso mínimo necessário à Função para executar sua atividade de leitura de credenciais do Vault.

    Allow dynamic-group <FUNCTION\_DYNAMIC\_GROUP\_NAME> to read secret-bundles in compartment <COMPARTMENT\_NAME>

    Detalhes da Política do OCI

Tarefa 5.2.3: Executar sua Função OCI

  1. Execute sua função para validar se ela está funcionando corretamente.

    $ fn -v deploy --app app-ocilog-to-azuresiem

    Executando sua função

Agora, para finalizar, precisamos configurar os Conectores de Serviço do OCI para capturar todos os logs do OCI de sua região e enviá-los ao Azure SIEM usando a Função que acabamos de criar.

Tarefa 6: Configurar os Conectores de Serviço

Para poder enviar os logs das regiões do tenant do OCI para a análise do Microsoft Azure Sentinel, é necessário configurar os Conectores de Serviço.

Basicamente, esse serviço capturará os logs do OCI que já configuramos e os enviará para nossa Função que, por sua vez, encaminhará todos os logs para a assinatura do Azure.

  1. Vá até o menu principal da Console do OCI e vá para Observabilidade e Gerenciamento, **Conectores de Serviço.

    Menu Conectores de Serviço

  2. Quando estiver dentro dos Conectores de Serviço, clique em Criar Conector de Serviço.

    Criar o Conector de Serviço

  3. Preencha os campos obrigatórios de nome e descrição, selecione o compartimento no qual você deseja criar seu Conector de Serviço.

    Preencher as informações necessárias

  4. Agora, selecione a origem dos dados que serão transmitidos por meio do Conector de Serviço. Aqui, use Log. E, como destino, ou seja, onde os dados serão transicionados, use Funções.

    Defina a origem e o destino do conector de serviço

  5. Para finalizar a configuração, selecione em Configurar origem, quais logs serão enviados para o OCI Functions. Nesta etapa, devemos selecionar o log \_Audit e, adicionando mais um log, selecionaremos o grupo de logs que criamos nas etapas iniciais deste procedimento.

    Finalize sua configuração

    • Se quiser adicionar outro grupo de logs, clique em + Outro log.
  6. Após concluir esta etapa, agora precisamos definir os parâmetros de Destino, ou seja, nossa Função do OCI que enviará os dados para a assinatura do Azure. Para fazer isso, selecione seu compartimento no qual a função está, selecione o Aplicativo e, depois disso, o nome da sua função. Em seguida, clique em Criar conforme mostrado na imagem abaixo.

    Clique no botão Criar

O processo está concluído. Neste ponto, aguarde até que os logs comecem a ser enviados ao Microsoft Azure automaticamente.

Você pode monitorar a operação do Conector de serviço criado pelo menu "Métricas".

Monitore suas métricas do Conector de Serviço

Tarefa 7: Leia os logs no Microsoft Azure Sentinel

  1. Após alguns instantes, os logs de todos os servidores serão enviados para a assinatura do Microsoft Azure, conforme mostrado na imagem abaixo.

    Logs no Microsoft Azure Sentinel

  2. De acordo com a configuração do Microsoft Azure Sentinel, os incidentes começarão a aparecer na interface à medida que as regras SIEM são acionadas.

    Incidentes SIEM sendo criados

    • Incidente aberto para o servidor da região Leste do Brasil (criamos alguma regra personalizada chamada "[Lab] Regex Incident" para gerar nossos exemplos de incidentes).

      Incidentes SIEM sendo criados

    • Abrir incidente para o servidor da região Us-Phoenix.

      Incidentes abertos

Aquisições

Autor - Rodrigo Pace de Barros (Engenheiro de Soluções de Segurança do Oracle LAD A-Team Cloud)

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.