Nota:

Ingestión de logs de Oracle Cloud Infrastructure en Microsoft Azure Sentinel con funciones de OCI

Introducción

Oracle Cloud Infrastructure (OCI) Functions es una plataforma de funciones como servicio totalmente gestionada, multiinquilino, altamente escalable y bajo demanda. Se basa en Oracle Cloud Infrastructure para empresas y cuenta con la tecnología del motor de código abierto Fn Project.

Service Connector Hub es una plataforma de bus de mensajes en la nube que ofrece un único panel para describir, ejecutar y supervisar interacciones al mover datos entre servicios de Oracle Cloud Infrastructure. Utilice el servicio Service Connector Hub para transferir datos entre servicios en Oracle Cloud Infrastructure.

Mediante los servicios de conector de servicio y funciones, puede conectar la generación de logs desde su entorno en la nube de OCI con el envío automático y escalable de todos los registros de seguridad de la información desde su entorno a su instancia de Microsoft Azure Sentinel de información de seguridad y gestión de eventos (SIEM).

Objetivo

Ingiera los logs de OCI en Microsoft Azure Sentinel con OCI Functions.

Requisitos

Tarea 1: Inicio de la instancia de OCI

  1. Cree una nueva instancia de OCI a través de la consola web y active cualquiera de sus plugins por defecto. Vaya a la página Instancias y haga clic en Crear instancia.

    Crear instancia de OCI

  2. Rellene toda la información necesaria para la creación de instancias.

    Complete la información necesaria para la configuración de instancias

  3. Vaya al final de la página y haga clic en Mostrar opciones avanzadas.

    Mostrar opciones avanzadas de instancia

  4. Aparecerán algunos separadores en la pantalla. Haga clic en Oracle Cloud Agent y seleccione los plugins que desea que estén activos una vez finalizada la creación de la instancia.

    Opción de Oracle Cloud Agent

  5. Todos los plugins seleccionados en este separador se activarán automáticamente una vez que la instancia esté lista para su uso.

    Configuración de plugins de Oracle Cloud Agent

  6. Después de seleccionar los plugins, haga clic en Crear al final de la página.

    Crear la instancia de OCI

Tarea 2: Configurar los valores de registro de OCI

Tarea 2.1: Configurar logs personalizados de instancia de Windows

Después de crear la instancia de Windows, debe configurar el entorno de OCI para capturar los logs del visor de eventos mediante Oracle Agent instalado en el servidor.

  1. Antes de empezar, asegúrese de que el plugin "Logs personalizados" esté activo en el servidor del que desea recopilar logs. En la consola de OCI, vaya a Recursos informáticos, Instancias.

    Asegúrese de que el plugin Logs personalizados está activo

  2. Seleccione la instancia que se va a supervisar.

    Seleccione la instancia recién creada

  3. Haga clic en el separador Oracle Cloud Agent y asegúrese de que el plugin denominado Supervisión de logs personalizados está activado.

    Activar el plugin de supervisión de logs personalizados

    • Si el plugin no está activado en la instancia, actívelo. Después de eso, configuremos el registro de OCI para que este agente pueda capturar los eventos del visor de eventos de Windows.

Tarea 2.2: Configuración del grupo dinámico de servidores

Para capturar los logs del visor de eventos de uno o más servidores Windows, se debe crear un grupo dinámico. Este grupo contendrá todas las instancias de Windows que deben tener sus logs capturados.

  1. Para crear el grupo dinámico, haga clic en el menú principal de la consola de OCI y vaya a Identidad y seguridad, Identidad.

    Acceder al menú Identity

  2. Desde el menú Identidad, acceda al submenú *Dominios".

    Acceder al menú Dominio

  3. Haga clic en su dominio de identidad (en este ejemplo de tutorial, utilizamos Valor por defecto).

    Acceder a la configuración de dominio por defecto

  4. Ahora, dentro del dominio de identidad, haga clic en el menú Grupos dinámicos para crear el grupo dinámico que contendrá todos los servidores de Windows que se van a supervisar. Una vez hecho esto, haga clic en Crear grupo dinámico.

    Crear un grupo dinámico de servidores

  5. Se abrirá una nueva página. Rellene la información relativa a la creación del grupo dinámico (nombre y descripción) y, en Reglas de coincidencia, haga clic en el enlace Creador de reglas para poder crear la regla para seleccionar instancias que se agruparán en este grupo dinámico.

    Crear la regla de grupo dinámico

  6. La regla de ejemplo que crearemos agrupará todos los servidores existentes en nuestro compartimento. Para ello, solo tiene que capturar el ID de compartimento e insertarlo en el campo Valor, como se muestra en la imagen siguiente.

    Rellene los valores necesarios

Nota: Puede utilizar filtros avanzados y crear grupos dinámicos para capturar solo instancias con determinadas etiquetas. Para ello, recomendamos leer la documentación oficial de OCI en: Escritura de reglas de coincidencia para definir grupos dinámicos.

Tarea 2.3: Creación de un grupo de registro

También deberá crear un grupo de registro para poder concentrar todos los logs enviados por los agentes instalados en los servidores Windows del entorno.

  1. Haga clic en el menú principal de la consola de OCI y vaya a Observación y gestión, Grupos de logs.

    Crear el grupo de logs

  2. Al acceder a la página de servicio, haga clic en Crear grupo de logs.

    Crear el grupo de logs

  3. Dentro de la página de creación del grupo de logs, rellene la información solicitada y haga clic en Crear.

    Complete la información necesaria

Una vez finalizado este paso, empecemos a crear la captura de log del visor de eventos por parte del agente de Oracle Cloud instalado en la instancia de OCI.

Tarea 2.4: Configurar registro de OCI

  1. Una vez configurada la instancia, el grupo dinámico y el grupo de logs, vaya a Observación y gestión y haga clic en Registro.

    Acceder al servicio de registro

  2. En la página Registro de OCI, haga clic en Configuraciones de agente para crear la configuración que permitirá el envío de logs del visor de eventos de Windows al registro de OCI. Una vez dentro de la página de configuración del agente, haga clic en Crear configuración de agente.

    Crear configuración de agente

  3. Rellene todos los campos necesarios de la página y seleccione el grupo dinámico que ha creado en el paso anterior.

    Rellene la información necesaria

    • Al rellenar estos elementos iniciales, desplácese por la página y rellene los campos Configuración de agente, informando de que desea capturar el "log de eventos de Windows" de cada uno de los canales disponibles (Aplicación, seguridad y sistema). Aquí deberá repetir el proceso de creación de entradas de log para cada uno de los canales.

    • Una vez finalizada la configuración, la página de configuración del agente estará disponible y se parecerá a esta.

      Informaciones detalladas de la configuración del agente

      Nota: La configuración del agente anterior se ha creado para capturar tanto los logs del visor de eventos como los logs generados en el archivo /var/log/messages de los servidores Linux.

    • Una vez que la configuración del agente esté en estado Activo, espere aproximadamente 5 minutos hasta que se pueda realizar la primera recopilación de logs. Para ver los logs de las instancias supervisadas que se están recopilando, haga clic en el menú Explorar log, como se muestra en la imagen siguiente.

      Ver logs

Tarea 3: Observe los detalles del centinela de Microsoft Azure

Importante: no es el ámbito de esta documentación ofrecer orientación sobre la creación y configuración de Microsoft Azure Sentinel en su suscripción a Microsoft Azure. Para ello, acceda a la documentación oficial del producto en el sitio web de Microsoft.

Tarea 4: Creación de OCI Vault

Ahora que ya tenemos los datos de Microsoft Azure Log Analytics Workspace pertenecientes a SIEM Sentinel, vamos a crear un OCI Vault para almacenar el valor secreto copiado en la tarea anterior. Este secreto se debe almacenar en OCI Vault para que no sea necesario insertarlo dentro del código de funciones de OCI que crearemos en el siguiente paso.

  1. Para crear OCI Vault, vaya al menú principal de la consola de OCI y vaya a Identidad y seguridad, Almacén.

    Crea tu OCI Vault

  2. Una vez cargada la página Almacén, haga clic en Crear almacén, seleccione el compartimento deseado y asigne un nombre al almacén.

    Complete la información necesaria

  3. Después de crear el almacén, deberá crear la clave de cifrado maestra. Esta clave se utilizará para cifrar todos los secretos de su almacén. Para ello, haga clic en Crear clave como se muestra en la imagen siguiente.

    Crear su clave de cifrado maestra (MEK)

  4. Cuando termine de crear la clave maestra, haga clic en el menú Secretos y cree el secreto de Microsoft Azure que anotó en el paso anterior.

    Crea tu secreto

  5. Rellene los campos necesarios para crear el secreto en el almacén con los datos de clave primaria o secundaria de su espacio de trabajo de Log Analytics Sentinel de Microsoft Azure, como se muestra en la tarea 3.

  6. Los otros elementos (Sentinel Workspace ID y el nombre de la tabla en la que se almacenarán los logs en Sentinel) pueden o no insertarse en el almacén. Aquí, vamos a insertarlos dentro del código de nuestra función.

Importante: Tome nota del OCID del secreto que crea en el almacén.

Tarea 5: Creación y configuración de funciones de OCI

Después de configurar el entorno de registro centralizado en la región de OCI, el almacén y el entorno de Azure están listos, es el momento de crear la función de OCI que enviará los logs personalizados y los logs de auditoría desde la región de OCI a Microsoft Azure Sentinel.

Tarea 5.1: Creación de la función OCI

  1. Vaya al menú principal de la consola de OCI y vaya a Servicios para desarrolladores, Funciones.

    Servicio Acess OCI Functions

  2. Una vez cargada la página Funciones, haga clic en Crear aplicación.

    Cree su aplicación

  3. Complete los campos necesarios y haga clic en Crear.

    Complete la información necesaria

  4. Después de la creación, tenga en cuenta que su función no estará protegida por ningún grupo de seguridad de red. Debe agregarlo a un grupo de seguridad de red.

    Configuración de NSG

    Puntos importantes:

    1. Dado que la función accederá al punto final público de Microsoft Azure para enviar logs al Sentinel de Microsoft Azure, esta función se debe crear en una subred que tenga acceso a Internet.

    2. Valide también sus listas de seguridad de VNET para asegurarse de que ninguna de ellas impida que su función de OCI acceda a Internet.

Tarea 5.2: Configuración de funciones de OCI e inicio

Una vez que se haya creado la función OCI, verá en pantalla los comandos necesarios para configurar la función en el entorno. Aquí, como ejemplo, seguiremos paso a paso a través de Cloud Shell, pero también es posible llevar a cabo esta configuración directamente en su equipo.

  1. Abra Cloud Shell directamente en la consola web de la región de OCI que se va a configurar (en este tutorial, la región es Este de Brasil).

    Región para configuración de función

  2. Siga los pasos indicados en la página Función y ejecute los comandos solicitados en el terminal de Cloud Shell.

    Ejecutar comandos en terminal cloud-shell

  3. Los 3 primeros comandos que se van a ejecutar no requieren cambios; sin embargo, en el cuarto comando deberá proporcionar el nombre del repositorio donde se almacenará la imagen de la aplicación. En nuestro ejemplo, el nombre introducido era repo-ocilog-to-azuresiem.

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

    Ejecución de comandos

  4. Genere un token de autenticación en su perfil de Oracle Cloud Infrastructure Identity and Access Management (OCI IAM). El token de autenticación es la credencial de acceso que le permitirá interactuar con el repositorio de OCI donde se almacenará la imagen de Docker de su función. Haga clic en el icono de usuario en la consola web de OCI y, a continuación, haga clic en Mi perfil.

    Creación de un token de autenticación

  5. Una vez dentro de la página de usuario, desplácese hacia abajo y haga clic en Tokens de autenticación.

    Menú de token de autenticación

  6. En la sección Tokens de autenticación, haga clic en Generar token.

    Generar token

  7. Rellene el nombre del token de autenticación y haga clic en Generar token.

    Complete la información necesaria

    Importante: Anote este token y guárdelo en un lugar seguro. Este token es su contraseña de acceso al registro de OCI donde se almacenarán las imágenes de función.

  8. Vuelva a la página Funciones accediendo al menú principal de la consola web de OCI y accediendo a Servicios para desarrolladores, Funciones.

    Volver a Funciones, página

  9. En la página Functions, acceda a la función creada en los pasos anteriores.

    Acceder a la función

  10. Haga clic en el menú Introducción y continúe paso a paso después del paso de creación del token de autenticación.

    Menú de función Introducción

  11. Ejecute el comando docker login y, como contraseña, utilice la cadena que acaba de copiar de la creación del token de autenticación en el último paso ejecutado.

    Siga las instrucciones de introducción

  12. Ahora, en los siguientes pasos, crearemos, desplegaremos y llamaremos a la función. Para inicializar la función en Cloud Shell, cambie el comando sugerido en el ejemplo que se muestra en la pantalla. Este cambio es necesario porque el entorno de tiempo de ejecución que vamos a utilizar está en Python (y no en Java, como se muestra en el ejemplo hello-world sugerido por la creación de la función).

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

    Llame a la función

Tarea 5.2.1: Escritura del código fuente de la función OCI

  1. Una vez ejecutado el comando init, acceda al directorio Function recién creado.

    $ cd func-ocilog-to-azuresiem/

    • Tenga en cuenta que dentro del directorio al que acaba de acceder hay un archivo Python (func.py), un archivo YAML (func.yaml) y un archivo de requisitos (requirements.txt). Tendremos que editar dos de estos archivos.
  2. Edite el archivo func.py, suprima todo el contenido e inserte el contenido siguiente en él.

    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 es el script de Python que se conectará al SIEM de Azure y enviará los logs de OCI al punto final remoto.

    • Además de copiar y pegar este script, deberá cambiar 3 campos en él

      1. _customer_id: ID de espacio de trabajo de Log Analytics en la suscripción a Azure, en el menú Gestión de agentes.

      2. _shared_key: clave primaria o secundaria que también se puede obtener del menú Gestión de agentes.

      3. _log_type: nombre del espacio de trabajo de Log Analytics que SIEM Sentinel utiliza. Todos los logs que llegan a este espacio de trabajo se analizan mediante Sentinel. En nuestro ejemplo, hemos utilizado OCILogging.

    • A continuación se muestra un ejemplo de impresión de la pantalla donde puede obtener la información anterior.

      Valores de Azure de Log Analytics Workspace

    Nota: Está fuera del ámbito de este documento configurar Log Analytics Workspace en su suscripción a Azure. Para ello, busque más información en la documentación oficial de Microsoft.

  3. Después de cambiar el archivo func.py, es hora de editar el archivo requirements.txt. Insertaremos un requisito en el que el gestor de paquetes de OCI Functions instale las dependencias de Python necesarias para que nuestro script funcione correctamente. Para este caso, inserte la palabra requests en la última línea del archivo:

    Módulos de Python necesarios

  4. Una vez hecho esto, ejecute el paso de despliegue de la función.

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

Tras unos minutos, la configuración de la función y la creación de la imagen de Docker se completará correctamente.

Módulos de Python necesarios

Tarea 5.2.2: Proporcione los permisos necesarios para la función OCI

Para que la función OCI se ejecute sin problemas, necesitará permisos para leer el secreto de Azure dentro del almacén. Para ello, necesitaremos crear un grupo dinámico para la función que creamos y, para este grupo dinámico, daremos el permiso necesario (privilegio mínimo) para que nuestro código pueda leer el almacén y capturar la clave compartida de Azure de forma segura.

Por lo tanto, de la misma manera que en el punto 2.2 anterior, donde creamos un grupo dinámico para agregar los servidores que recopilarán los logs, volver a rastrear los pasos y crear un grupo dinámico para incluir nuestra función.

Durante la creación del grupo dinámico, necesitará una regla de coincidencia que se utilizará para capturar la función. Aquí, en nuestro ejemplo, crearemos una regla de coincidencia que mostrará todas las funciones del compartimento que estamos utilizando exclusivamente para este tutorial.

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

  1. Capture el OCID del compartimento, insértelo en la regla de coincidencia y cree el grupo dinámico.

    Configurar el grupo dinámico para funciones

  2. Después de crear el grupo dinámico, vaya a Identidad y seguridad, Políticas para crear la política que permitirá a la función acceder al almacén en modo de lectura.

    Crear la política para permitir que Functions acceda al almacén

    • Una vez creado el grupo dinámico, cree la política que permitirá a la función acceder al almacén.
  3. Utilice la siguiente política para otorgar el acceso mínimo necesario a la función para ejecutar la actividad de lectura de credenciales de almacén.

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

    Detalles de política de OCI

Tarea 5.2.3: Ejecución de la función OCI

  1. Ejecute la función para validar que funciona correctamente.

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

    Ejecución de la función

Para finalizar, debemos configurar los conectores de servicio de OCI para capturar todos los logs de OCI de su región y enviarlos a Azure SIEM mediante la función que acabamos de crear.

Tarea 6: Configuración de los conectores de servicio

Para poder enviar los logs de las regiones de su inquilino de OCI para el análisis del centinela de Microsoft Azure, es necesario configurar los conectores de servicio.

Básicamente, este servicio capturará los logs de OCI que ya hemos configurado y los enviará a nuestra función que, a su vez, reenviará todos los logs a la suscripción de Azure.

  1. Vaya al menú principal de la consola de OCI y, a continuación, vaya a Observación y gestión, **Conectores de servicio.

    Menú de Service Connectors

  2. Una vez dentro de los conectores de servicio, haga clic en Crear conector de servicio.

    Creación del conector de servicio

  3. Rellene los campos de nombre y descripción necesarios y seleccione el compartimento en el que desea crear el conector de servicio.

    Complete la información necesaria

  4. Ahora, seleccione el origen de los datos que se transmitirán mediante el conector de servicio. Aquí, utilice Registro. Y, como destino, es decir, donde se realizarán la transición de los datos, utilice Funciones.

    Definir origen y destino para el conector de servicio

  5. Para finalizar la configuración, seleccione en Configurar origen, qué logs se enviarán a OCI Functions. En este paso, debemos seleccionar el log \_Audit y, al agregar un log más, seleccionaremos el grupo de logs que hemos creado en los pasos iniciales de este procedimiento.

    Finalizar la configuración

    • Si desea agregar otro grupo de logs, haga clic en + Otro log.
  6. Una vez finalizado este paso, ahora debemos definir los parámetros de destino, es decir, nuestra función de OCI que enviará los datos a la suscripción de Azure. Para ello, seleccione el compartimento donde se encuentra la función, seleccione la aplicación y, después, el nombre de la función. A continuación, haga clic en Crear como se muestra en la imagen siguiente.

    Haga clic en el botón Crear.

El proceso ha terminado. En este punto, espere hasta que los logs comiencen a enviarse automáticamente a Microsoft Azure.

Puede supervisar el funcionamiento del conector de servicio creado por el menú "Métricas".

Supervisar las métricas del conector de servicio

Tarea 7: Leer los registros en Microsoft Azure Sentinel

  1. Tras unos instantes, los logs de todos los servidores se enviarán a la suscripción de Microsoft Azure como se muestra en la imagen siguiente.

    Logs en Microsoft Azure Sentinel

  2. Según la configuración de Microsoft Azure Sentinel, los incidentes comenzarán a aparecer en la interfaz a medida que se disparen las reglas de SIEM.

    Incidentes de SIEM creados

    • Incidente abierto para el servidor de región este de Brasil (creamos alguna regla personalizada denominada "[Lab] Regex Incident" para generar nuestros incidentes de ejemplo).

      Incidentes de SIEM creados

    • Abra el incidente para el servidor de región Us-Phoenix.

      Incidentes abiertos

Agradecimientos

Autor: Rodrigo Pace de Barros (ingenier de soluciones de seguridad en la nube de Oracle LAD A-Team)

Más recursos de aprendizaje

Explore otros laboratorios en docs.oracle.com/learn o acceda a más contenido de aprendizaje gratuito en el canal YouTube de Oracle Learning. Además, visite education.oracle.com/learning-explorer para convertirse en un explorador de Oracle Learning.

Para obtener documentación sobre los productos, visite Oracle Help Center.