Collecter les journaux Azure Application Gateway
Ce document explique comment collecter les journaux Azure Application Gateway en configurant un flux Google Security Operations. Ce parseur gère les structures JSON à un ou plusieurs enregistrements, extrait les champs du tableau "records", effectue des conversions de types de données, mappe les champs à l'UDM et enrichit les données avec des métadonnées et des champs dérivés tels que le type de connexion réseau. Il gère également une logique spécifique pour différentes valeurs operationName
, en extrayant les adresses IP, les sous-réseaux et d'autres détails de configuration pertinents.
Avant de commencer
Assurez-vous de remplir les conditions préalables suivantes :
- Instance Google SecOps
- Accès privilégié à un abonnement Azure
- Un environnement (locataire) de passerelle d'application Azure dans 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 du 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 Azure Application Gateway
- Connectez-vous au portail Azure.
- Accédez au groupe de ressources de votre choix.
- Sélectionnez Passerelle d'application (la fenêtre Passerelle d'application s'affiche).
- Dans la section Surveillance, sélectionnez Paramètres de diagnostic > Activer les diagnostics.
- Sélectionnez Ajouter un paramètre de diagnostic (la fenêtre Paramètres de diagnostic affiche les paramètres des journaux de diagnostic).
- Dans la section Journal, procédez comme suit :
- Cochez la case ApplicationGatewayAccessLog.
- Cochez la case ApplicationGatewayFirewallLog.
- Pour stocker les journaux dans le compte de stockage, procédez comme suit :
- Cochez la case Archiver dans un compte de stockage.
- Dans la liste Abonnement, sélectionnez un abonnement existant.
- Dans la liste Compte de stockage, sélectionnez un compte de stockage existant.
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 Azure Application Gateway).
- Sélectionnez Microsoft Azure Blob Storage comme Type de source.
- Sélectionnez "Azure Application Gateway" 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,insights-logs-<logname>
)
- 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,insights-logs-<logname>
)
- 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 |
---|---|---|
Category |
metadata.product_event_type |
Mappé directement à partir du champ Category . |
ClientOperationId |
additional.fields[].key:"ClientOperationId", value.string_value |
Mappé directement à partir du champ ClientOperationId . |
CorrelationRequestId |
additional.fields[].key:"CorrelationRequestId", value.string_value |
Mappé directement à partir du champ CorrelationRequestId . |
GatewayManagerVersion |
additional.fields[].key:"GatewayManagerVersion", value.string_value |
Mappé directement à partir du champ GatewayManagerVersion . |
category |
metadata.product_event_type |
Mappé directement à partir du champ category . |
level |
security_result.severity |
Directement mappé à partir du champ level , converti en majuscules. Si la valeur est "WARNING", le niveau de gravité est défini sur "HIGH" (ÉLEVÉ) et security_result.severity_details est défini sur la valeur d'origine. |
properties.clientIP |
principal.ip , principal.asset.ip |
Mappé directement à partir du champ properties.clientIP . |
properties.clientPort |
principal.port |
Mappé directement à partir du champ properties.clientPort et converti en entier. |
properties.clientResponseTime |
additional.fields[].key:"clientResponseTime", value.string_value |
Mappé directement à partir du champ properties.clientResponseTime . |
properties.configuration.BgpConfiguration.GatewayConfig.Asn |
security_result.detection_fields[].key:"ASN", value |
Mappé directement à partir du champ properties.configuration.BgpConfiguration.GatewayConfig.Asn lorsque operationName est défini sur "SetGatewayConfiguration". |
properties.configuration.BgpConfiguration.GatewayConfig.PeerAddress |
target.ip , target.asset.ip |
Mappé directement à partir du champ properties.configuration.BgpConfiguration.GatewayConfig.PeerAddress lorsque operationName est défini sur "SetGatewayConfiguration". |
properties.configuration.BgpConfiguration.GatewayConfig.PeerType |
security_result.detection_fields[].key:"PeerType", value |
Mappé directement à partir du champ properties.configuration.BgpConfiguration.GatewayConfig.PeerType lorsque operationName est défini sur "SetGatewayConfiguration". |
properties.configuration.IkeVersion |
principal.resource.attribute.labels[].key:"ike_version", value |
Mappé directement à partir du champ properties.configuration.IkeVersion lorsque operationName est défini sur "SetConnectionConfiguration". |
properties.configuration.LocalSubnets |
principal.resource.attribute.labels[].key:"local subnets", value |
Chaîne concaténée d'adresses IP du tableau properties.configuration.LocalSubnets lorsque operationName est défini sur "SetConnectionConfiguration". |
properties.configuration.LocalTunnelEndpoint |
principal.ip , principal.asset.ip |
Mappé directement à partir du champ properties.configuration.LocalTunnelEndpoint lorsque operationName est défini sur "SetConnectionConfiguration". |
properties.configuration.Name |
principal.hostname , principal.asset.hostname |
Mappé directement à partir du champ properties.configuration.Name . Si ce champ est vide, la valeur est extraite de properties.instance . |
properties.configuration.RemoteSite |
target.hostname , target.asset.hostname |
Mappé directement à partir du champ properties.configuration.RemoteSite . |
properties.configuration.RemoteSubnets |
principal.resource.attribute.labels[].key:"remote subnets", value |
Chaîne concaténée d'adresses IP du tableau properties.configuration.RemoteSubnets lorsque operationName est défini sur "SetConnectionConfiguration". |
properties.configuration.RemoteTunnelEndpoint |
target.ip , target.asset.ip |
Mappé directement à partir du champ properties.configuration.RemoteTunnelEndpoint lorsque operationName est défini sur "SetConnectionConfiguration". |
properties.configuration.VIPAddress |
principal.ip , principal.asset.ip |
Mappé directement à partir du champ properties.configuration.VIPAddress lorsque operationName est défini sur "SetGatewayConfiguration". |
properties.configuration.VirtualNetworkRanges |
principal.resource.attribute.labels[].key:"virutal network ranges", value |
Chaîne concaténée d'adresses IP du tableau properties.configuration.VirtualNetworkRanges lorsque operationName est défini sur "SetGatewayConfiguration". |
properties.configuration.VirtualNetworkSubnets |
principal.resource.attribute.labels[].key:"virtual network subnets", value |
Chaîne concaténée d'adresses IP du tableau properties.configuration.VirtualNetworkSubnets lorsque operationName est défini sur "SetGatewayConfiguration". |
properties.error_info |
additional.fields[].key:"error_info", value.string_value |
Mappé directement à partir du champ properties.error_info . |
properties.host |
principal.hostname , principal.asset.hostname |
Mappé directement à partir du champ properties.host si properties.originalHost est vide. |
properties.httpMethod |
network.http.method |
Mappé directement à partir du champ properties.httpMethod . |
properties.httpStatus |
network.http.response_code |
Mappé directement à partir du champ properties.httpStatus et converti en entier. |
properties.httpVersion |
network.application_protocol |
Définissez sur "HTTP" si le champ properties.httpVersion contient "HTTP". |
properties.instance |
principal.hostname , principal.asset.hostname |
Utilisé comme valeur pour principal.hostname si properties.configuration.Name est vide. |
properties.message |
metadata.description |
Mappé directement à partir du champ properties.message . |
properties.operationName |
additional.fields[].key:"operationName", value.string_value |
Mappé directement à partir du champ properties.operationName . |
properties.operationStatus |
security_result.category_details |
Mappé directement à partir du champ properties.operationStatus . Si la valeur est "Success" ou "InProgress", security_result.action est défini sur "ALLOW". |
properties.originalHost |
principal.hostname , principal.asset.hostname |
Mappé directement à partir du champ properties.originalHost . |
properties.originalRequestUriWithArgs |
additional.fields[].key:"originalRequestUriWithArgs", value.string_value |
Mappé directement à partir du champ properties.originalRequestUriWithArgs . |
properties.receivedBytes |
network.received_bytes |
Directement mappé à partir du champ properties.receivedBytes , converti en entier non signé. |
properties.requestQuery |
additional.fields[].key:"requestQuery", value.string_value |
Mappé directement à partir du champ properties.requestQuery . |
properties.requestUri |
target.url |
Mappé directement à partir du champ properties.requestUri . |
properties.sentBytes |
network.sent_bytes |
Directement mappé à partir du champ properties.sentBytes , converti en entier non signé. |
properties.serverResponseLatency |
additional.fields[].key:"Server Response Latency", value.string_value |
Mappé directement à partir du champ properties.serverResponseLatency . |
properties.serverRouted |
target.ip , target.asset.ip , target.port |
L'adresse IP et le port sont extraits du champ properties.serverRouted à l'aide d'une expression régulière. |
properties.sslCipher |
network.tls.cipher |
Mappé directement à partir du champ properties.sslCipher . |
properties.sslClientCertificateIssuerName |
network.tls.server.certificate.issuer |
Mappé directement à partir du champ properties.sslClientCertificateIssuerName . |
properties.sslProtocol |
network.tls.version |
Mappé directement à partir du champ properties.sslProtocol . |
properties.timeTaken |
additional.fields[].key:"timeTaken", value.string_value |
Mappé directement à partir du champ properties.timeTaken . |
properties.transactionId |
network.session_id |
Mappé directement à partir du champ properties.transactionId . |
properties.userAgent |
network.http.user_agent , network.http.parsed_user_agent |
Mappé directement à partir du champ properties.userAgent . De plus, le champ est converti en user-agent analysé et mappé à network.http.parsed_user_agent . |
properties.WAFEvaluationTime |
additional.fields[].key:"WAFEvaluationTime", value.string_value |
Mappé directement à partir du champ properties.WAFEvaluationTime . |
properties.WAFMode |
additional.fields[].key:"WAFMode", value.string_value |
Mappé directement à partir du champ properties.WAFMode . |
resourceId |
target.resource.id |
Mappé directement à partir du champ resourceId . |
resourceid |
target.resource.product_object_id |
Mappé directement à partir du champ resourceid . |
ruleName |
security_result.rule_name |
Mappé directement à partir du champ ruleName . |
time /timeStamp |
metadata.event_timestamp , timestamp |
Analysé comme un code temporel au format RFC 3339 ou ISO8601. Il est préférable d'utiliser timeStamp , mais time est utilisé si timeStamp n'est pas présent. |
(Logique de l'analyseur) | metadata.event_type |
Défini sur "NETWORK_CONNECTION" si le principal et la cible sont présents, sur "STATUS_UPDATE" si seul le principal est présent, et sur "GENERIC_EVENT" dans le cas contraire. |
(Logique de l'analyseur) | metadata.product_name |
Définissez la valeur sur "Passerelle Azure". |
(Logique de l'analyseur) | metadata.vendor_name |
Défini sur "Microsoft". |
(Logique de l'analyseur) | has_principal |
Indicateur booléen défini sur "true" si des informations principales (nom d'hôte, adresse IP ou port) sont extraites, et sur "false" dans le cas contraire. |
(Logique de l'analyseur) | has_target |
Indicateur booléen défini sur "true" si des informations cibles (nom d'hôte, adresse IP, port, ID de ressource ou URL) sont extraites, et sur "false" dans le cas contraire. |
(Logique de l'analyseur) | disambiguation_key |
Ajouté lorsque plusieurs événements sont extraits d'une même entrée de journal. |