Collecter les journaux d'audit Azure Storage
Ce document explique comment exporter les journaux d'audit Azure Storage vers Google Security Operations à l'aide d'un compte Azure Storage. L'analyseur traite les journaux au format JSON et les transforme en Unified Data Model (UDM). Il extrait les champs du journal brut, effectue des conversions de type de données, enrichit les données avec un contexte supplémentaire (comme l'analyse de l'agent utilisateur et la répartition des adresses IP), et mappe les champs extraits aux champs UDM correspondants.
Avant de commencer
Assurez-vous de remplir les conditions préalables suivantes :
- Instance Google SecOps
- Un locataire Azure actif
- Accès privilégié à Azure
Configurer un compte de stockage Azure
- Dans la console Azure, recherchez Comptes de stockage.
- Cliquez sur Créer.
- Spécifiez les valeurs des paramètres d'entrée suivants :
- Abonnement : sélectionnez l'abonnement.
- Groupe de ressources : sélectionnez le groupe de ressources.
- Région : sélectionnez la région.
- Performances : sélectionnez les performances (standard recommandé).
- Redondance : sélectionnez la redondance (GRS ou LRS recommandé).
- Nom du compte de stockage : saisissez un nom pour le nouveau compte de stockage.
- Cliquez sur Examiner et créer.
- Examinez l'aperçu du compte, puis cliquez sur Créer.
- Sur la page Présentation du compte de stockage, sélectionnez le sous-menu Clés d'accès dans Sécurité et mise en réseau.
- Cliquez sur Afficher à côté de key1 ou key2.
- Cliquez sur Copier dans le presse-papiers pour copier la clé.
- Enregistrez la clé dans un endroit sûr pour pouvoir l'utiliser ultérieurement.
- Sur la page Présentation du compte de stockage, sélectionnez le sous-menu Points de terminaison dans Paramètres.
- Cliquez sur Copier dans le presse-papiers pour copier l'URL du point de terminaison Blob service (Service Blob). Par exemple,
https://<storageaccountname>.blob.core.windows.net
. - Enregistrez l'URL du point de terminaison dans un endroit sûr pour une utilisation ultérieure.
Configurer l'exportation des journaux d'audit Azure Storage
- Connectez-vous au portail Azure à l'aide de votre compte privilégié.
- Accédez à Comptes de stockage > Paramètres de diagnostic.
- Cliquez sur + Ajouter un paramètre de diagnostic.
- Sélectionnez les paramètres de diagnostic pour
blob
,queue
,table
etfile
.- Sélectionnez l'option allLogs dans Groupes de catégories pour chaque paramètre de diagnostic.
- Attribuez un nom descriptif à chaque paramètre de diagnostic.
- Cochez la case Archiver dans un compte de stockage comme destination.
- Spécifiez l'abonnement et le compte de stockage.
- Cliquez sur Enregistrer.
Configurer des flux
Il existe deux points d'entrée différents pour configurer les flux dans la plate-forme Google SecOps :
- Paramètres SIEM> Flux
- Plate-forme de contenu > Packs de contenu
Configurer des flux à partir de Paramètres SIEM > Flux
Pour configurer plusieurs flux pour différents types de journaux dans cette famille de produits, consultez Configurer des flux par produit.
Pour configurer un seul flux :
- Accédez à Paramètres SIEM> Flux.
- Cliquez sur Add New Feed (Ajouter un flux).
- Sur la page suivante, cliquez sur Configurer un seul flux.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux d'audit Azure Storage).
- Sélectionnez Microsoft Azure Blob Storage comme Type de source.
- Sélectionnez Audit Azure Storage comme Type de journal.
- Cliquez sur Suivant.
Spécifiez les valeurs des paramètres d'entrée suivants :
- URI Azure : URL du point de terminaison du blob.
ENDPOINT_URL/BLOB_NAME
- Remplacez l'élément suivant :
ENDPOINT_URL
: URL du point de terminaison du blob (https://<storageaccountname>.blob.core.windows.net
)BLOB_NAME
: nom du blob (par exemple,<logname>-logs
)
- Remplacez l'élément suivant :
- L'URI est : sélectionnez le TYPE d'URI en fonction de la configuration du flux de journaux (Fichier unique | Répertoire | Répertoire incluant des sous-répertoires).
Options de suppression de la source : sélectionnez l'option de suppression en fonction de vos préférences d'ingestion.
Clé partagée : clé d'accès à Azure Blob Storage.
Espace de noms de l'élément : espace de noms de l'élément.
Libellés d'ingestion : libellé à appliquer aux événements de ce flux.
- URI Azure : URL du point de terminaison du blob.
Cliquez sur Suivant.
Vérifiez la configuration de votre nouveau flux sur l'écran Finaliser, puis cliquez sur Envoyer.
Configurer des flux depuis le Hub de contenu
Indiquez les valeurs des champs suivants :
- URI Azure : URL du point de terminaison du blob.
ENDPOINT_URL/BLOB_NAME
- Remplacez l'élément suivant :
ENDPOINT_URL
: URL du point de terminaison du blob (https://<storageaccountname>.blob.core.windows.net
)BLOB_NAME
: nom du blob (par exemple,<logname>-logs
)
- Remplacez l'élément suivant :
- L'URI est : sélectionnez le TYPE d'URI en fonction de la configuration du flux de journaux (Fichier unique | Répertoire | Répertoire incluant des sous-répertoires).
- Options de suppression de la source : sélectionnez l'option de suppression en fonction de vos préférences d'ingestion.
- Clé partagée : clé d'accès à Azure Blob Storage.
Options avancées
- Nom du flux : valeur préremplie qui identifie le flux.
- Type de source : méthode utilisée pour collecter les journaux dans Google SecOps.
- Espace de noms de l'élément : espace de noms associé au flux.
- Libellés d'ingestion : libellés appliqués à tous les événements de ce flux.
Table de mappage UDM
Champ de journal | Mappage UDM | Logique |
---|---|---|
callerIpAddress |
principal.asset.ip |
L'adresse IP est extraite du champ callerIpAddress à l'aide d'un modèle Grok et attribuée à principal.asset.ip . |
callerIpAddress |
principal.ip |
L'adresse IP est extraite du champ callerIpAddress à l'aide d'un modèle Grok et attribuée à principal.ip . |
callerIpAddress |
principal.port |
Le numéro de port est extrait du champ callerIpAddress à l'aide d'un modèle Grok et attribué à principal.port . |
category |
security_result.category_details |
La valeur du champ category est attribuée à security_result.category_details . |
correlationId |
security_result.detection_fields[0].key |
La chaîne littérale correlationId est attribuée au champ clé. |
correlationId |
security_result.detection_fields[0].value |
La valeur du champ correlationId est attribuée à security_result.detection_fields[0].value . La valeur du champ time est analysée en tant qu'horodatage et attribuée à event.idm.read_only_udm.metadata.event_timestamp . Si category est défini sur StorageWrite et que principal.user.userid existe (dérivé de properties.accountName ), la valeur est définie sur USER_RESOURCE_UPDATE_CONTENT . Si category est défini sur StorageDelete et que principal.user.userid existe, la valeur est définie sur USER_RESOURCE_DELETION . Sinon, la valeur est définie sur USER_RESOURCE_ACCESS . La chaîne littérale AZURE_STORAGE_AUDIT est attribuée à event.idm.read_only_udm.metadata.log_type . La chaîne littérale AZURE_STORAGE_AUDIT est attribuée à event.idm.read_only_udm.metadata.product_name . La valeur du champ schemaVersion est attribuée à event.idm.read_only_udm.metadata.product_version . La chaîne littérale AZURE_STORAGE_AUDIT est attribuée à event.idm.read_only_udm.metadata.vendor_name . |
location |
target.location.name |
La valeur du champ location est attribuée à target.location.name . |
operationName |
additional.fields[x].key |
La chaîne littérale operationName est attribuée au champ clé. |
operationName |
additional.fields[x].value.string_value |
La valeur du champ operationName est attribuée à additional.fields[x].value.string_value . |
operationVersion |
additional.fields[x].key |
La chaîne littérale operationVersion est attribuée au champ clé. |
operationVersion |
additional.fields[x].value.string_value |
La valeur du champ operationVersion est attribuée à additional.fields[x].value.string_value . |
properties.accountName |
principal.user.userid |
La valeur du champ properties.accountName est attribuée à principal.user.userid . |
properties.clientRequestId |
additional.fields[x].key |
La chaîne littérale clientRequestId est attribuée au champ clé. |
properties.clientRequestId |
additional.fields[x].value.string_value |
La valeur du champ properties.clientRequestId est attribuée à additional.fields[x].value.string_value . |
properties.etag |
additional.fields[x].key |
La chaîne littérale etag est attribuée au champ clé. |
properties.etag |
additional.fields[x].value.string_value |
La valeur du champ properties.etag est attribuée à additional.fields[x].value.string_value . |
properties.objectKey |
additional.fields[x].key |
La chaîne littérale objectKey est attribuée au champ clé. |
properties.objectKey |
additional.fields[x].value.string_value |
La valeur du champ properties.objectKey est attribuée à additional.fields[x].value.string_value . |
properties.requestMd5 |
additional.fields[x].key |
La chaîne littérale requestMd5 est attribuée au champ clé. |
properties.requestMd5 |
additional.fields[x].value.string_value |
La valeur du champ properties.requestMd5 est attribuée à additional.fields[x].value.string_value . |
properties.responseMd5 |
additional.fields[x].key |
La chaîne littérale responseMd5 est attribuée au champ clé. |
properties.responseMd5 |
additional.fields[x].value.string_value |
La valeur du champ properties.responseMd5 est attribuée à additional.fields[x].value.string_value . |
properties.serviceType |
additional.fields[x].key |
La chaîne littérale serviceType est attribuée au champ clé. |
properties.serviceType |
additional.fields[x].value.string_value |
La valeur du champ properties.serviceType est attribuée à additional.fields[x].value.string_value . |
properties.tlsVersion |
network.tls.version |
La valeur du champ properties.tlsVersion est attribuée à network.tls.version . |
properties.userAgentHeader |
network.http.parsed_user_agent |
La valeur du champ properties.userAgentHeader est analysée en tant que chaîne user-agent et attribuée à network.http.parsed_user_agent . |
properties.userAgentHeader |
network.http.user_agent |
La valeur du champ properties.userAgentHeader est attribuée à network.http.user_agent . |
protocol |
network.application_protocol |
La valeur du champ protocol est attribuée à network.application_protocol . |
resourceId |
target.resource.id |
La valeur du champ resourceId est attribuée à target.resource.id . |
resourceId |
target.resource.product_object_id |
La valeur du champ resourceId est attribuée à target.resource.product_object_id . La chaîne littérale DATABASE est attribuée à target.resource.resource_type . |
resourceType |
additional.fields[x].key |
La chaîne littérale resourceType est attribuée au champ clé. |
resourceType |
additional.fields[x].value.string_value |
La valeur du champ resourceType est attribuée à additional.fields[x].value.string_value . Si statusText est défini sur Success , la valeur est définie sur ALLOW . |
statusCode |
network.http.response_code |
La valeur du champ statusCode est convertie en entier et attribuée à network.http.response_code . La chaîne littérale MICROSOFT_AZURE est attribuée à target.cloud.environment . |
time |
timestamp |
La valeur du champ time est analysée en tant qu'horodatage et attribuée à timestamp . |
uri |
network.http.referral_url |
La valeur du champ uri est attribuée à network.http.referral_url . |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.