Collecter les journaux Azure Application Gateway
Ce document explique comment collecter les journaux de la passerelle d'application Azure en configurant un flux Google Security Operations. Cet analyseur gère les structures JSON à enregistrement unique et multi-enregistrement, extrait des champs du tableau "records", effectue des conversions de type de données, met en correspondance des champs avec 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 informations de configuration pertinents.
Avant de commencer
Assurez-vous d'avoir effectué les opérations suivantes :
- Une instance Google SecOps.
- Accès privilégié à un abonnement Azure.
- Un environnement Application Gateway Azure (locataire) 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.
- Consultez la présentation 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 clé1 ou clé2.
- Cliquez sur Copy to clipboard (Copier dans le presse-papiers) pour copier la clé.
- Enregistrez la clé dans un emplacement sécurisé pour pouvoir l'utiliser ultérieurement.
- Sur la page Aperçu 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écurisé pour une utilisation ultérieure.
Configurer Azure Application Gateway
- Connectez-vous au portail Azure.
- Accédez au groupe de ressources souhaité.
- 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 des 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 un flux dans Google SecOps pour ingérer les journaux de la passerelle d'application Azure
- Accédez à Paramètres du SIEM > Flux.
- Cliquez sur Ajouter.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux de la passerelle d'application Azure).
- 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 de blob.
ENDPOINT_URL/BLOB_NAME
- Remplacez l'élément suivant :
ENDPOINT_URL
: URL du point de terminaison de 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.
- Clé partagée: clé d'accès à Azure Blob Storage.
- Espace de noms des éléments: espace de noms des éléments.
- Libellés d'ingestion: libellé à appliquer aux événements de ce flux.
- URI Azure: URL du point de terminaison de blob.
Cliquez sur Suivant.
Vérifiez la configuration de votre nouveau flux dans l'écran Finaliser, puis cliquez sur Envoyer.
Tableau 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 |
Mappé directement à partir du champ level , converti en majuscules. Si la valeur est "WARNING" (AVERTISSEMENT), la gravité est définie sur "HIGH" (ÉLEVÉE) 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 , 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 "SetGatewayConfiguration". |
properties.configuration.BgpConfiguration.GatewayConfig.PeerAddress |
target.ip , target.asset.ip |
Mappé directement à partir du champ properties.configuration.BgpConfiguration.GatewayConfig.PeerAddress lorsque operationName est "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 "SetGatewayConfiguration". |
properties.configuration.IkeVersion |
principal.resource.attribute.labels[].key:"ike_version", value |
Mappé directement à partir du champ properties.configuration.IkeVersion lorsque operationName est "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 "SetConnectionConfiguration". |
properties.configuration.LocalTunnelEndpoint |
principal.ip , principal.asset.ip |
Mappé directement à partir du champ properties.configuration.LocalTunnelEndpoint lorsque operationName est "SetConnectionConfiguration". |
properties.configuration.Name |
principal.hostname , principal.asset.hostname |
Mappé directement à partir du champ properties.configuration.Name . Si cette valeur 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 "SetConnectionConfiguration". |
properties.configuration.RemoteTunnelEndpoint |
target.ip , target.asset.ip |
Mappé directement à partir du champ properties.configuration.RemoteTunnelEndpoint lorsque operationName est "SetConnectionConfiguration". |
properties.configuration.VIPAddress |
principal.ip , principal.asset.ip |
Mappé directement à partir du champ properties.configuration.VIPAddress lorsque operationName est "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 "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 "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 , converti en entier. |
properties.httpVersion |
network.application_protocol |
Définissez cette valeur 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 |
Mappé directement à 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 |
Mappé directement à 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é sur 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 |
Analyse comme un code temporel au format RFC 3339 ou ISO 8601. timeStamp est préférable, mais time est utilisé si timeStamp n'est pas présent. |
(Logique de l'analyseur) | metadata.event_type |
Définissez-le sur "NETWORK_CONNECTION" si le principal et la cible sont tous deux 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-le sur "Azure Gateway". |
(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 seule entrée de journal. |
Modifications
2024-04-19
- Ajout de la compatibilité avec plusieurs journaux JSON d'événements.
2023-12-22
- "resourceid" a été mappé sur "target.resource.id".
- "properties.operationStatus" a été mappé sur "security_result.category_details".
- "properties.configuration.Name" a été mappé sur "principal.hostname".
- Mappage de "properties.message" sur "metadata.description".
- "properties.configuration.RemoteStie" a été mappé sur "target.hostname".
- Mappage de "level" sur "security_result.severity_details".
- Mappage de "properties.configuration.Ikeversion" sur "principal.resource.attribute.labels".
- "properties.configuration.LocalTunnelEndpoint" a été mappé sur "principal.ip".
- "properties.configuration.RemoteTunnelEndpoint" a été mappé sur "target.ip".
- Mise en correspondance de "properties.configuration.LocalSubnets", "properties.configuration.RemoteSubnets", "properties.configuration.VirtualNetworkRanges" et "properties.configuration.VirtualNetworkSubnets" avec "principal.resource.attribute.labels".
- "properties.configuration.VIPAddress" a été mappé sur "principal.ip".
- Mappage de "properties.configuration.BgpConfiguration.GatewayConfig.PeerAddress" sur "targrt.ip".
- "properties.configuration.BgpConfiguration.GatewayConfig.PeerType" et "properties.configuration.BgpConfiguration.GatewayConfig.Asn" ont été mappés sur "security_result.detection_fields".
2023-11-16
- Analyseur nouvellement créé.