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.
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
- Acesso a uma tenancy do Oracle Cloud
- Uma configuração de Rede Virtual na Nuvem em sua tenancy
- Todas as configurações de política para Logs, Streaming e Funções.
Tarefa 1: Iniciar a Instância do OCI
-
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.
-
Preencha todas as informações necessárias para a criação da instância.
-
Vá até o final da página e clique em Mostrar opções avançadas.
-
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.
-
Todos os plug-ins selecionados nessa guia serão ativados automaticamente quando a instância estiver pronta para uso.
-
Depois de selecionar os plug-ins, clique em Criar no final da página.
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.
-
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.
-
Selecione a instância a ser monitorada.
-
Clique na guia Oracle Cloud Agent e certifique-se de que o plug-in chamado Monitoramento de Logs Personalizados esteja ativado.
- 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.
-
Para criar o Grupo Dinâmico, clique no menu principal da console do OCI e vá para Identidade e Segurança, Identidade.
-
No menu Identidade, acesse o submenu *Domínios".
-
Clique em seu Domínio de Identidades (neste exemplo do tutorial, usamos Padrão).
-
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.
-
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.
-
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.
-
Para obter mais informações sobre como criar Grupos Dinâmicos, consulte a documentação oficial: Criando Grupos Dinâmicos e Políticas para Acessar Outros Recursos do Oracle Cloud Infrastructure em Sessões de Notebook.
-
Quando a criação estiver concluída, uma página contendo as informações do Grupo Dinâmico estará disponível.
-
O Grupo Dinâmico é criado e está pronto para ser usado para centralizar os logs do seu ambiente OCI.
-
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.
-
Clique no menu principal da console do OCI e vá para Observabilidade e Gerenciamento, Grupos de Logs.
-
Ao acessar a página de serviço, clique em Criar Grupo de Logs.
-
Na página de criação do grupo de logs, preencha as informações solicitadas e clique em Criar.
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
-
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.
-
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.
-
Preencha todos os campos necessários na página e selecione o Grupo Dinâmico criado na etapa anterior.
-
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.
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.
-
Tarefa 3: Observe os detalhes do Microsoft Azure Sentinel
-
Depois de configurar o ambiente de log centralizado na região OCI, vá para sua assinatura do Microsoft Azure e colete as seguintes informações:
- ID do Espaço de Trabalho: O ID do Espaço de Trabalho do Log Analytics usado pelo Microsoft Azure Sentinel na sua Assinatura do Microsoft Azure.
- Chave Compartilhada: Sua chave de acesso do Espaço de Trabalho do Log Analytics.
-
Esses valores podem ser encontrados no menu Gerenciamento de Agentes, conforme mostrado na imagem abaixo na Assinatura do Azure:
-
Observe esses valores.
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.
-
Para criar seu OCI Vault, vá para o menu principal da console do OCI e vá para Identidade e Segurança, Vault.
-
Depois que a página Vault for carregada, clique em Criar Vault, selecione o compartimento desejado e nomeie seu Vault.
-
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.
-
Quando terminar de criar sua Chave Mestra, clique no menu Segredos e crie o segredo do Microsoft Azure que você anotou na etapa anterior.
-
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.
-
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
-
Vá para o menu principal da console do OCI e vá para Serviços do Desenvolvedor, Funções.
-
Depois que a página Funções for carregada, clique em Criar aplicativo.
-
Preencha os campos obrigatórios e clique em Criar.
-
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.
Pontos importantes:
-
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.
-
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.
-
Abra o Cloud Shell diretamente na console web da região OCI a ser configurada (neste tutorial, a região é Leste do Brasil).
-
Siga as etapas indicadas na página Função e execute os comandos solicitados no terminal do Cloud Shell.
-
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
-
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.
-
Quando estiver dentro da página do usuário, role para baixo e clique em Tokens de autenticação.
-
Na seção Tokens de Autenticação, clique em Gerar Token.
-
Preencha o nome do Token de Autenticação e clique em Gerar token.
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.
-
Retorne à página Funções acessando o menu principal da console web do OCI e acessando Serviços do Desenvolvedor, Funções.
-
Na página Funções, acesse sua Função criada nas etapas anteriores.
-
Clique no menu Conceitos Básicos e continue passo a passo após a etapa de criação do Token de Autenticação.
-
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. -
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
Tarefa 5.2.1: Gravando o código-fonte da sua Função OCI
-
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.
- Observe que dentro do diretório que você acabou de acessar há um arquivo Python (
-
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
-
_customer_id: ID do Espaço de Trabalho do Log Analytics na assinatura do Azure, no menu Gerenciamento de Agentes.
-
_shared_key: Chave primária ou secundária que também pode ser obtida no menu Gerenciamento de agentes.
-
_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.
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.
-
-
Depois de alterar o arquivo
func.py
, é hora de editar o arquivorequirements.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: -
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.
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'}
-
Capture o OCID do Compartimento e insira-o na Regra de Correspondência e crie seu Grupo Dinâmico.
-
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.
- Depois que o Grupo Dinâmico for criado, crie a política que permitirá que a Função acesse o Vault.
-
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>
Tarefa 5.2.3: Executar sua Função OCI
-
Execute sua função para validar se ela está funcionando corretamente.
$ fn -v deploy --app app-ocilog-to-azuresiem
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.
-
Vá até o menu principal da Console do OCI e vá para Observabilidade e Gerenciamento, **Conectores de Serviço.
-
Quando estiver dentro dos Conectores de Serviço, clique em Criar Conector de Serviço.
-
Preencha os campos obrigatórios de nome e descrição, selecione o compartimento no qual você deseja criar seu Conector de Serviço.
-
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.
-
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.- Se quiser adicionar outro grupo de logs, clique em + Outro log.
-
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.
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".
Tarefa 7: Leia os logs no Microsoft Azure Sentinel
-
Após alguns instantes, os logs de todos os servidores serão enviados para a assinatura do Microsoft Azure, conforme mostrado na imagem abaixo.
-
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.
-
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).
-
Abrir incidente para o servidor da região Us-Phoenix.
-
Links Relacionados
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.
Ingest Oracle Cloud Infrastructure logs into Microsoft Azure Sentinel using OCI Functions
F80858-01
April 2023
Copyright © 2023, Oracle and/or its affiliates.