Remarque :

Implémenter la sécurité multicloud à l'aide d'OCI Audit pour capturer les événements à partir d'OCI Identity and Access Management

Introduction

Les domaines d'identité Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) génèrent des données d'audit en réponse aux opérations effectuées par les administrateurs et les utilisateurs finals. Des événements d'audit sont générés pour des opérations telles que la création ou la mise à jour de comptes utilisateur ou d'appartenances à des groupes, ainsi que pour des tentatives de connexion réussies ou infructueuses.

Pour accéder à ces données d'audit, vous pouvez générer des rapports directement dans la console Oracle Cloud Infrastructure (OCI) ou envoyer ces événements à une solution de surveillance de la sécurité externe, qui peut fonctionner sur une plate-forme cloud externe. Il est courant pour les entreprises de tirer parti des solutions tierces de gestion des incidents et des événements de sécurité (SIEM). En général, il est nécessaire d'inclure les données d'audit OCI IAM dans le SIEM pour l'analyse et la conformité des menaces. L'une des façons de répondre à cette exigence est d'exploiter les API AuditEvents du domaine d'identité OCI IAM, mais les domaines d'identité offrent une autre option qui peut être plus facile à implémenter pour certaines organisations et prend en charge le partage des événements d'audit dans les environnements multicloud.

OCI Audit est un service OCI qui enregistre automatiquement les appels à toutes les API OCI prises en charge en tant qu'événements. Vous pouvez choisir d'extraire les événements d'audit OCI IAM à partir du service OCI Audit plutôt que d'utiliser les API de domaine d'identité OCI IAM. OCI Audit offre les avantages suivants :

Objectif

Synchronisez les événements d'audit générés dans un domaine d'identité OCI IAM avec un emplacement de stockage externe.

Prérequis

Tâche 1 : comprendre comment exploiter OCI Audit pour capturer des événements d'audit à partir d'OCI IAM

Pour démontrer l'approche de l'utilisation d'OCI Audit pour capturer les événements d'audit à partir d'OCI IAM, nous utiliserons le scénario suivant :

Vous disposez d'une location avec deux domaines d'identité OCI IAM. Le domaine par défaut de la location, utilisé pour l'administration de la location, a le type de domaine Libre. Nous allons appeler ce domaine administrateur. Il existe un domaine d'identité supplémentaire de type Oracle Apps Premium auquel tous les employés sont provisionnés pour avoir accès à Oracle SaaS et aux applications on-premise. Nous appellerons le domaine de l'employé. Les comptes sont provisionnés dans le domaine des employés à partir de Microsoft Azure AD. Cela peut se produire de plusieurs manières (système de gestion des identités interdomaine [SCIM], provisionnement juste à temps ou import d'utilisateurs en masse). Vous disposez également d'une solution SIEM (par exemple, Microsoft Sentinel) qui ingère les données d'audit de nombreux systèmes de votre environnement, et vous devez publier presque en temps réel tous les événements d'audit des deux domaines d'identité dans le SIEM.

L'approche globale que nous allons adopter pour répondre aux exigences comprend l'utilisation du service OCI Audit, du service OCI Events, du service OCI Functions et de l'espace de travail Azure Log Analytics. Le flux de base est comme suit :

  1. Le domaine d'identité OCI IAM écrit un événement d'audit dans OCI Audit.
  2. Le service OCI Events dispose d'une règle qui surveille OCI Audit pour des types d'événement d'audit spécifiques à partir d'OCI IAM. Lorsque la règle est déclenchée, elle appelle une fonction dans Fonctions OCI.
  3. La fonction reçoit le journal d'audit brut dans ses données traitées et appelle l'API du collecteur de données Azure Log Analytics pour envoyer les données à l'espace de travail Azure Log Analytics.
  4. Azure Log Analytics Workspace sert de magasin de données pour Microsoft Sentinel.

Image de l'architecture de haut niveau

Tâche 2 : capture des événements d'audit à partir d'OCI IAM à l'aide d'OCI Audit

  1. Cet exemple suppose que vous avez configuré un espace de travail Azure Log Analytics sur le portail Azure. Une fois que vous l'avez configuré, copiez l'ID d'espace de travail et la clé primaire (ou secondaire) sous le nom d'espace de travail, les paramètres, les agents, les instructions d'agent Log Analytics. Vous aurez besoin de ces valeurs lors de l'écriture de votre fonction personnalisée avec OCI Functions.

    Image de l'agent d'espace de travail Azure Log Analytics

  2. Connectez-vous à la console OCI en tant qu'administrateur de location.

  3. Ecrivez votre fonction personnalisée qui sera déployée avec OCI Functions. L'exemple de code suivant utilise Python, mais vous pouvez facilement implémenter la fonction dans le langage de votre choix. Ajoutons le code de fonction en trois étapes simples.

    • Créez un fichier Python nommé func.py et ajoutez les déclarations de paramètre et les instructions d'import requises suivantes. Les valeurs de paramètre doivent correspondre à l'environnement d'espace de travail Log Analytics. Vous pouvez trouver l'ID client (ID d'espace de travail dans le portail) et les valeurs de clé partagée dans le portail Azure sous l'espace de travail Log Analytics, le nom de votre espace de travail et la page de gestion des agents. Le paramètre de type de journal est un nom convivial utilisé pour définir un nouveau journal personnalisé (ou sélectionner un journal existant) dans votre espace de travail Azure Log Analytics et l'emplacement cible pour les téléchargements de données.

      Au lieu de coder en dur l'ID client de l'espace de travail Log Analytics et les valeurs de clé partagée, vous pouvez utiliser le service de clés secrètes OCI pour fournir un accès sécurisé aux valeurs de la fonction OCI. Pour une procédure détaillée d'utilisation des clés secrètes OCI dans votre code, reportez-vous aux articles suivants :

      Dans le cadre de ce tutoriel, nous supposons que vous disposez des clés secrètes stockées dans un coffre et que vous configurez des stratégies IAM pour accorder l'accès au principal d'instance de fonction 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'
      
    • Ajoutez les lignes de code suivantes pour définir les tâches permettant d'effectuer des appels REST sécurisés vers l'adresse de téléchargement de données Azure. Vous devrez peut-être valider ce code pour vérifier la syntaxe par rapport à la dernière syntaxe de version ou d'adresse de Microsoft.

      Remarque : des parties de ce code sont copiées à partir de la documentation Microsoft suivante.

      {.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)
      
    • Ajoutez le bloc de code suivant à votre fichier de code func.py pour définir le point d'entrée d'exécution et les détails de structure. Vous n'avez pas besoin d'apporter de modifications sauf si vous souhaitez ajouter des fonctionnalités facultatives, telles que l'analyse avancée des données, le formatage ou la gestion personnalisée des exceptions.

      {.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. Suivez ce guide pour déployer votre fonction à l'aide de CloudShell : Démarrage rapide des fonctions sur CloudShell.

  5. Créez une règle dans le service OCI Events qui recherche les journaux d'audit correspondant à vos critères et appelle la fonction que vous avez créée et déployée aux étapes 3 et 4.

    • Accédez au service Events en recherchant "événements" dans la barre de recherche de la console ou dans la barre de recherche du menu Services à gauche. Cliquez sur Règles dans les résultats de la recherche.

      Recherche de règles dans la console OCI 1

      Recherche de règles dans la console OCI 2

    • Créez une règle avec des conditions qui recherchent des événements de création, de mise à jour ou de suppression par l'utilisateur dans les domaines administrateur et employé.

      1. Les types d'événement de création, de mise à jour et de suppression d'utilisateurs seront disponibles sous le service Identity.

      2. Ajoutez une condition d'attribut supplémentaire avec les GUID des deux domaines d'identité.

        Remarque (facultatif). Par défaut, les événements d'audit de tous les domaines d'identité du compte cloud sont mis en correspondance. Mais si vous êtes uniquement intéressé par un sous-ensemble de domaines d'identité, vous pouvez spécifier explicitement les domaines inclus dans le périmètre.) Vous pouvez trouver le GUID du domaine d'identité sur la page de présentation du domaine d'identité.

      3. Dans le panneau Actions, sélectionnez le type d'action Fonctions et sélectionnez la fonction que vous avez créée et déployée aux étapes 3 et 4 ci-dessus.

        Créer une règle dans la console OCI

  6. Maintenant, lorsque vous créez, mettez à jour ou supprimez un utilisateur dans l'un des domaines d'identité, la fonction OCI est appelée avec le journal d'audit brut comme charge utile. A son tour, la fonction OCI publie les données dans Azure Log Analytics Workspace. Les données apparaissent dans une table personnalisée nommée OCILogging_CL.

    Rechercher les données OCI Logging dans Azure Log Analytics Workspace

Remerciements

Ressources de formation supplémentaires

Explorez d'autres ateliers sur docs.oracle.com/learn ou accédez à davantage de contenu de formation gratuit sur le canal Oracle Learning YouTube. En outre, accédez à education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

Pour consulter la documentation produit, consultez Oracle Help Center.