Nota:

Implemente la seguridad multinube mediante OCI Audit para capturar eventos de OCI Identity and Access Management

Introducción

Los dominios de identidad de Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) generan datos de auditoría en respuesta a las operaciones realizadas por administradores y usuarios finales. Los eventos de auditoría se generan para operaciones como la creación o actualización de cuentas de usuario o afiliaciones a grupos, y para intentos de conexión correctos o incorrectos.

Para acceder a estos datos de auditoría, puede generar informes directamente en la consola de Oracle Cloud Infrastructure (OCI) o también puede enviar estos eventos a una solución de control de seguridad externa, que puede estar funcionando en una plataforma en la nube externa. Es habitual que las organizaciones aprovechen las soluciones de gestión de eventos e incidentes de seguridad (SIEM) de terceros, y un requisito típico es la ingestión de datos de auditoría de OCI IAM en SIEM para el análisis de amenazas y el cumplimiento. Una forma de cumplir ese requisito es aprovechar las API AuditEvents del dominio de identidad de OCI IAM, pero los dominios de identidad ofrecen otra opción que puede ser más fácil de implementar para algunas organizaciones y admite el uso compartido de eventos de auditoría en entornos multinube.

OCI Audit es un servicio de OCI que registra automáticamente las llamadas a todas las API de OCI soportadas como eventos. Hay algunos motivos comunes por los que puede elegir extraer eventos de auditoría de OCI IAM del servicio de auditoría de OCI en lugar de utilizar las API del dominio de identidad de OCI IAM. OCI Audit ofrece las siguientes ventajas:

Objetivo

Sincronice los eventos de auditoría generados en un dominio de identidad de OCI IAM con un almacén externo.

Requisitos

Tarea 1: Descripción de cómo aprovechar la auditoría de OCI para capturar eventos de auditoría de OCI IAM

Para demostrar el enfoque de uso de la auditoría de OCI para capturar eventos de auditoría de OCI IAM, utilizaremos el siguiente escenario:

Tiene un arrendamiento con dos dominios de identidad de OCI IAM. El dominio por defecto del arrendamiento, que se utiliza para la administración del arrendamiento, tiene un tipo de dominio Libre. Llamaremos al dominio de administrador. Existe un dominio de identidad adicional con un tipo de dominio de Oracle Apps Premium, al que se aprovisionan todos los empleados para acceder a Oracle SaaS y aplicaciones locales. Llamaremos al dominio del empleado. Las cuentas se suministran en el dominio del empleado desde Microsoft Azure AD. Esto puede ocurrir de varias formas (Sistema para gestión de identidades entre dominios [SCIM], Aprovisionamiento justo a tiempo o importación masiva de usuarios). También dispone de una solución SIEM (por ejemplo, Microsoft Sentinel) que ingiere datos de auditoría de numerosos sistemas del entorno, y es necesario publicar todos los eventos de auditoría de ambos dominios de identidad en el SIEM prácticamente en tiempo real.

El enfoque general que tomaremos para abordar los requisitos incluye el uso del servicio de auditoría de OCI, el servicio de eventos de OCI, el servicio de funciones de OCI y el espacio de trabajo de Azure Log Analytics. El flujo básico es el siguiente:

  1. El dominio de identidad de OCI IAM escribe un evento de auditoría en la auditoría de OCI.
  2. El servicio Eventos de OCI tiene una regla que está observando la auditoría de OCI para tipos de eventos de auditoría específicos de OCI IAM. Cuando se dispara la regla, llama a una función en Funciones de OCI.
  3. La función recibe el log de auditoría raw en su carga útil y llama a la API del recopilador de datos de Azure Log Analytics para enviar los datos a Azure Log Analytics Workspace.
  4. El espacio de trabajo de Azure Log Analytics sirve como almacén de datos para Microsoft Sentinel.

Imagen de la arquitectura de alto nivel

Tarea 2: Captura de eventos de auditoría de OCI IAM mediante la auditoría de OCI

  1. En este ejemplo, se asume que ha configurado un espacio de trabajo de Azure Log Analytics en el portal de Azure. Una vez que lo haya configurado, copie el ID de espacio de trabajo y la clave primaria (o secundaria) en su nombre de espacio de trabajo, Configuración, Agentes e Instrucciones de agente de Log Analytics. Necesitará estos valores mientras escribe su función personalizada con OCI Functions.

    Imagen del agente del espacio de trabajo de Azure Log Analytics

  2. Inicie sesión en la consola de OCI como administrador del arrendamiento.

  3. Escriba su función personalizada que se desplegará con OCI Functions. En el siguiente ejemplo de código se utiliza Python, pero puede implantar fácilmente la función en el lenguaje que elija. Vamos a agregar el código de función en tres sencillos pasos.

    • Cree un archivo Python denominado func.py y agregue las siguientes sentencias de importación y declaraciones de parámetros necesarias. Los valores de parámetros deben coincidir con el entorno del espacio de trabajo de Log Analytics. Puede encontrar el ID de cliente (ID de espacio de trabajo en el portal) y los valores de clave compartida en el portal de Azure en el espacio de trabajo de Log Analytics, su nombre de espacio de trabajo y la página de gestión de agentes. El parámetro de tipo de log es un nombre fácil de recordar utilizado para definir un nuevo log personalizado (o seleccionar uno existente) en el espacio de trabajo de Azure Log Analytics y la ubicación de destino para las cargas de datos.

      En lugar de codificar el ID de cliente del espacio de trabajo de Log Analytics y los valores de clave compartida, puede utilizar el servicio Secretos de OCI para proporcionar acceso seguro a los valores de la función de OCI. Para obtener un repaso detallado de los pasos para utilizar los secretos de OCI en el código, consulte los siguientes artículos:

      Para este tutorial, asumiremos que tiene los secretos almacenados en un almacén y configurará políticas de IAM para otorgar acceso al principal de instancia de función de OCI.

      {.python .numberLines .lineAnchors}
      import oci
      import io
      import json
      import requests
      import datetime
      import hashlib
      import hmac
      import base64
      import logging
      from fdk import response
      
      # Get instance principal context, and initialize secrets client
      signer = oci.auth.signers.InstancePrincipalsSecurityTokenSigner()
      secret_client = oci.secrets.SecretsClient(config={}, signer=signer)
      
      # Replace values below with the ocids of your secrets
      customer_id_ocid = "ocid1.vaultsecret.oc1.<customer_id_ocid>"
      shared_key_ocid = "ocid1.vaultsecret.oc1.<shared_key_ocid>"
      
      # Retrieve secret
      def read_secret_value(secret_client, secret_id):
          response = secret_client.get_secret_bundle(secret_id)
          base64_Secret_content = response.data.secret_bundle_content.content
          base64_secret_bytes = base64_Secret_content.encode('ascii')
          base64_message_bytes = base64.b64decode(base64_secret_bytes)
          secret_content = base64_message_bytes.decode('ascii')
          return secret_content
      
      # Retrieve the customer ID using the secret client.
      customer_id =  read_secret_value(secret_client, customer_id_ocid)
      
      # For the shared key, use either the primary or the secondary Connected Sources client authentication key    
      _shared_key =  read_secret_value(secret_client, shared_key_ocid)
      
      # The log type is the name of the event that is being submitted
      log_type = 'OCILogging'
      
    • Agregue las siguientes líneas de código para definir las tareas para realizar llamadas REST seguras al punto final de carga de datos de Azure. Puede que necesite validar este código para verificar la sintaxis con respecto a la última sintaxis de punto final o versión de Microsoft.

      Nota: Las partes de este código se copian de la siguiente documentación de Microsoft.

      {.python .numberLines .lineAnchors}
      # 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
      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.info( 'Upload accepted' )
      else :
      logger.info( "Error during upload.  Response code: {}" .format(response.status_code))
      print(response.text)
      
    • Agregue el siguiente bloque de código al archivo de código func.py para definir el punto de entrada de ejecución y los detalles del marco. No es necesario realizar cambios a menos que desee agregar funciones opcionales, como análisis avanzado de datos, formato o manejo personalizado de excepciones.

      {.python .numberLines .lineAnchors}
      """
      Entrypoint and initialization
      """
      def  handler(ctx, data: io.BytesIO= None ):
      logger = logging.getLogger()
      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" }
      )
      
  4. Siga esta guía para desplegar la función con CloudShell: Inicio rápido de funciones en CloudShell.

  5. Cree una regla en el servicio OCI Events que busque logs de auditoría que coincidan con sus criterios y llame a la función que ha creado y desplegado en los pasos 3 y 4.

    • Vaya al servicio de eventos buscando "eventos" en la barra de búsqueda de la consola o en la barra de búsqueda dentro del menú de servicios de la izquierda. Haga clic en Reglas en los resultados de búsqueda.

      Busca reglas en la consola de OCI 1

      Busca reglas en la consola de OCI 2

    • Cree una regla con condiciones que busquen eventos de creación, actualización o supresión de usuarios en los dominios de administrador y empleado.

      1. Los tipos de eventos de creación, actualización y supresión de usuarios estarán disponibles en el servicio Identidad.

      2. Agregue una condición de "atributo" adicional con los GUID de los dos dominios de identidad.

        Nota: es opcional. Por defecto, los eventos de auditoría de todos los dominios de identidad de la cuenta en la nube coinciden. Sin embargo, si solo está interesado en un subjuego de dominios de identidad, puede especificar explícitamente los dominios dentro del ámbito). Puede encontrar el GUID del dominio de identidad en la página de visión general del dominio de identidad.

      3. En el panel Acciones, seleccione el tipo de acción Funciones y seleccione la función que ha creado y desplegado en los pasos 3 y 4 anteriores.

        Crear regla en la consola de OCI

  6. Ahora, al crear, actualizar o suprimir un usuario en cualquiera de los dominios de identidad, se llama a la función de OCI con el log de auditoría raw como carga útil. La función OCI, a su vez, publica los datos en el espacio de trabajo de Azure Log Analytics. Verá los datos en una tabla personalizada denominada OCILogging_CL.

    Buscar datos de registro de OCI en Azure Log Analytics Workspace

Acuses de recibo

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.