Collecter les journaux JAMF Security Cloud
Ce document explique comment ingérer les journaux JAMF Security Cloud dans Google Security Operations à l'aide de Google Cloud Storage V2.
JAMF Security Cloud est une plate-forme de défense contre les menaces mobiles et de sécurité des points de terminaison pour les appareils Apple. Il génère des journaux d'événements de détection des menaces, de conformité et de sécurité des appareils couvrant la protection de la couche DNS, la prévention de l'hameçonnage, le filtrage du contenu et l'évaluation des risques liés aux appareils.
Avant de commencer
Assurez-vous de remplir les conditions suivantes :
- Une instance Google SecOps
- Un projet GCP avec l'API Cloud Storage activée
- Autorisations permettant de créer et de gérer des buckets GCS et des stratégies IAM
- Accès privilégié au portail JAMF Security Cloud (console Jamf Threat Defense ou Jamf Protect)
Créer un bucket Cloud Storage
- Accédez à la console Google Cloud.
- Sélectionnez votre projet ou créez-en un.
- Dans le menu de navigation, accédez à Cloud Storage> Buckets.
- Cliquez sur Créer un bucket.
Fournissez les informations de configuration suivantes :
Paramètre Valeur Nommer votre bucket Saisissez un nom unique (par exemple, jamf-security-cloud-logs).Type d'emplacement Choisissez en fonction de vos besoins (région, birégion ou multirégion). Emplacement Sélectionnez l'emplacement (par exemple, us-central1).Classe de stockage Standard (recommandé pour les journaux auxquels vous accédez fréquemment) Access control (Contrôle des accès) Uniforme (recommandé) Outils de protection Facultatif : Activez la gestion des versions des objets ou la règle de conservation. Cliquez sur Créer.
Exporter les journaux JAMF Security Cloud vers Google Cloud Storage
JAMF Security Cloud permet de diffuser des données d'événements vers des destinations de stockage cloud. Configurez l'exportation de données dans le portail JAMF Security Cloud.
- Connectez-vous au portail JAMF Security Cloud.
- Accédez à Intégrations > Flux de données.
- Cliquez sur Ajouter un flux.
- Sélectionnez un type de destination compatible. JAMF Data Streams est compatible de manière native avec les points de terminaison AWS S3 et HTTP génériques. Pour envoyer des journaux à Google Cloud Storage, vous pouvez utiliser un point de terminaison HTTP générique avec une fonction Cloud Run qui écrit dans GCS, ou configurer une destination intermédiaire compatible avec S3.
- Fournissez les informations de configuration suivantes :
- Nom du flux : saisissez un nom descriptif (par exemple,
Chronicle GCS Export). - Nom du bucket GCS : saisissez le nom du bucket (par exemple,
jamf-security-cloud-logs). - Préfixe de chemin d'accès : saisissez un préfixe de dossier (par exemple,
jamf-security-cloud/). - Format de sortie : sélectionnez JSON (recommandé pour l'ingestion Chronicle).
- Nom du flux : saisissez un nom descriptif (par exemple,
- Importez ou collez la clé JSON des identifiants du compte de service GCP qui dispose d'un accès en écriture au bucket GCS.
- Sélectionnez les types d'événements à exporter :
- Événements liés aux menaces (menaces réseau, hameçonnage, logiciels malveillants)
- Événements de conformité des appareils
- Événements de sécurité DNS
- Événements de risque liés aux applications
- Cliquez sur Enregistrer (ou Créer).
- Vérifiez que les fichiers journaux commencent à apparaître dans le bucket GCS sous le préfixe spécifié.
- Assurez-vous que le compte de service GCP utilisé pour l'exportation dispose du rôle Créateur d'objets Storage sur le bucket cible.
- Les fichiers journaux sont écrits au format JSON. Chaque fichier contient un ou plusieurs enregistrements d'événements.
Récupérer le compte de service Google SecOps
- Connectez-vous à la console Google SecOps.
- Accédez à Paramètres SIEM> Flux.
- Cliquez sur Add New Feed (Ajouter un flux).
- Cliquez sur Configurer un flux unique.
- Sélectionnez Google Cloud Storage V2 comme Type de source.
- Sélectionnez JAMF Security Cloud comme Type de journal.
Cliquez sur Obtenir un compte de service. Une adresse e-mail unique pour le compte de service s'affiche, par exemple :
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comCopiez cette adresse e-mail. Vous en aurez besoin lors de la tâche suivante.
- Chaque instance Google SecOps possède un compte de service unique. N'utilisez pas de comptes de service provenant d'autres documents ou exemples.
Accorder des autorisations IAM au compte de service Google SecOps
- Accédez à Cloud Storage > Buckets.
- Cliquez sur le nom de votre bucket.
- Accédez à l'onglet Autorisations.
- Cliquez sur Accorder l'accès.
- Fournissez les informations de configuration suivantes :
- Ajouter des comptes principaux : collez l'adresse e-mail du compte de service Google SecOps.
- Attribuer des rôles : sélectionnez Lecteur des objets de l'espace de stockage.
- Cliquez sur Enregistrer.
- Si vous prévoyez d'utiliser l'option de suppression (supprimer les fichiers transférés), accordez le rôle Administrateur des objets Storage au lieu de celui de lecteur des objets Storage.
Configurer un flux dans Google SecOps pour ingérer les journaux JAMF Security Cloud
- Accédez à Paramètres SIEM> Flux.
- Cliquez sur Add New Feed (Ajouter un flux).
- Cliquez sur Configurer un flux unique.
- Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple,
JAMF Security Cloud logs). - Sélectionnez Google Cloud Storage V2 comme Type de source.
- Sélectionnez JAMF Security Cloud comme Type de journal.
- Cliquez sur Suivant.
Spécifiez les valeurs des paramètres d'entrée suivants :
Champ Valeur URI du bucket de stockage gs://jamf-security-cloud-logs/jamf-security-cloud/Option de suppression de la source Sélectionnez l'option de suppression de votre choix. Âge maximal des fichiers (en jours) La valeur par défaut est de 180 jours. Espace de noms de l'élément L'espace de noms de l'élément Étiquettes d'ingestion Libellé à appliquer aux événements de ce flux - Remplacez
jamf-security-cloud-logspar le nom réel de votre bucket GCS. - Incluez toujours la barre oblique finale (
/) à la fin de l'URI.
- Remplacez
Cliquez sur Suivant.
Vérifiez la configuration de votre nouveau flux sur l'écran Finaliser, puis cliquez sur Envoyer.
Table de mappage UDM
| Champ de journal | Mappage UDM | Logique |
|---|---|---|
| event_data.account.parentId, event_data.action, event_data.device.os, event_data.dns.recordType, event_data.riskDetails.appRiskIndexThreshold, event_data.riskDetails.deviceRiskIndex, event_data.routeName, event_data.signatureId.id, event_data.signatureId.name, event_data.threat.result, event_data.tld, customer.parentId, customer.resellerId, device.deviceId, device.deviceName, device.carrier.carrierName, device.carrier.isoCountryCode, device.carrier.mcc, device.carrier.mnc, device.hw.deviceModel, device.hw.hwPlatform, device.hw.imei, device.hw.platform, device.lastNetworkTrafficUtcMs, device.lastUpdatedUtcMs, device.location.isoCountryCode, device.mdm.lastMdmCheckInUtcMs, device.mdm.mdmId, device.network.ssid, device.os.osVersion, device.state.activated, device.state.deploymentState, device.state.vpnActive, device.state.wifiActive, device.user.id, device.user.name, device.wanderaApp.version, trigger.triggerTimeUtcMs, trigger.triggerType, app.appId.packageName, app.appId.appName, app.appId.appVersion, app.category.label, app.category.system, app.installation.installationTimeUtcMs, app.installation.installedBy, app.developer, app.threats, app.permissions, event_data.accessPoint, event_data.alertId, event_data.event_dataType, event_data.software.softwareId, event_data.software.softwareVersion, event_data.software.softwareName, event_data.cve.id, event_data.cve.baseScore, event_data.cve.exploitAvailable, event_data.cve.attribution, event_data.threat.types, event_data.app.id, event_data.app.name, event_data.app.version | additional.fields | Fusionnées en tant qu'étiquettes avec des clés et des valeurs spécifiques provenant des sources |
| event_data.dns.ttl | dns_answers.ttl | Converti en uinteger |
| event_data.dns.category | dns_questions.name | Valeur copiée directement |
| event_data.receiptTime | metadata.collected_timestamp | Valeur copiée directement |
| event_data_event_dataType_description, event_data.cve.description | metadata.description | Valeur de event_data_event_dataType_description si elle n'est pas vide, sinon event_data.cve.description |
| has_principal, has_user | metadata.event_type | Défini sur STATUS_UPDATE si has_principal est défini sur "true", USER_UNCATEGORIZED si has_user est défini sur "true", ou GENERIC_EVENT dans le cas contraire. |
| event_data.md1.product, md1.product | metadata.product_event_type | Valeur de event_data.md1.product si elle n'est pas vide, sinon md1.product |
| event_data.device.externalId, event_data.externalId | metadata.product_log_id | Valeur de event_data.device.externalId si elle n'est pas vide, sinon event_data.externalId |
| event_data.md1.schemaVersion, schemaVersion | metadata.product_version | Valeur de event_data.md1.schemaVersion si elle n'est pas vide, sinon schemaVersion |
| dns_answers | network.dns.answers | Fusionné à partir de dns_answers |
| dns_questions | network.dns.questions | Fusionné à partir de dns_questions |
| event_data.dns.responseStatus | network.dns.response | Définissez sur "true" si NOERROR, sinon sur "false". |
| event_data.domain | principal.administrative_domain | Valeur copiée directement |
| event_data.application | principal.application | Valeur copiée directement |
| event_data.hostName, event_data.device.userDeviceName | principal.asset.hostname | Valeur de event_data.hostName si elle n'est pas vide, sinon event_data.device.userDeviceName |
| event_data.source.ip | principal.asset.ip | Valeur copiée directement |
| event_data.hostName, event_data.device.userDeviceName | principal.hostname | Valeur de event_data.hostName si elle n'est pas vide, sinon event_data.device.userDeviceName |
| event_data.source.ip | principal.ip | Valeur copiée directement |
| event_data.source.port | principal.port | Converti en entier |
| event_data_event_dataType_id | principal.process.pid | Valeur copiée directement |
| event_data.event_dataUrl, event_data.cve.consoleUrl | principal.url | Valeur de event_data.event_dataUrl si elle n'est pas vide, sinon event_data.cve.consoleUrl |
| device.user.email | principal.user.email_addresses | Fusionné si l'adresse e-mail correspond à l'expression régulière |
| event_data.account.name, event_data.user.userName | principal.user.user_display_name | Valeur de event_data.account.name si elle n'est pas vide, sinon event_data.user.userName |
| event_data.account.customerId, customer.customerId, event_data.customerId, device.user.email | principal.user.userid | Valeur de event_data.account.customerId si elle n'est pas vide, sinon customer.customerId si elle n'est pas vide, sinon event_data.customerId si elle n'est pas vide, sinon device.user.email si elle n'est pas vide |
| event_data.blocked | security_result.action | Définissez sur BLOCK si la valeur est "true", sur ALLOW si la valeur est "false". |
| event_data_event_dataType_name | security_result.description | Valeur copiée directement |
| app.threats, app.permissions, event_data.cve.id, event_data.cve.baseScore, event_data.cve.exploitAvailable, event_data.cve.attribution | security_result.detection_fields | Fusionnés en tant que libellés provenant de sources |
| event_data.severity | security_result.severity | Défini sur INFORMATIONAL si la valeur est 2, LOW si la valeur est 4, MEDIUM si la valeur est 6, HIGH si la valeur est 8 et CRITICAL si la valeur est 10. |
| event_data.blockReason | security_result.summary | Valeur copiée directement |
| event_data.cve.cveDetailUrl | security_result.url_back_to_product | Valeur copiée directement |
| event_data.device.deviceId | target.asset.asset_id | Concaténé avec le préfixe "CS:" |
| event_data.destination.ips, event_data.destinationIp, event_data.destination.ip, device.carrier.ipAddress, device.network.assignedIp, device.network.publicIp | target.asset.ip | Fusionnée à partir de sources |
| app_id_md5 | target.file.md5 | Valeur copiée directement |
| app_id_sha1 | target.file.sha1 | Valeur copiée directement |
| app_id_sha256 | target.file.sha256 | Valeur copiée directement |
| event_data.destination.name | target.hostname | Valeur copiée directement |
| event_data.destination.ips, event_data.destinationIp, event_data.destination.ip, device.carrier.ipAddress, device.network.assignedIp, device.network.publicIp | target.ip | Fusionnée à partir de sources |
| device.location.countryName | target.location.country_or_region | Valeur copiée directement |
| device.hw.wifiMacAddress, event_data.accessPointBssid, device.network.bssid | target.mac | Fusionnée à partir de sources |
| event_data.device.osType, event_data_device_os_osType, device.os.osType | target.platform | Définissez sur WINDOWS si la valeur correspond à Win, sur MAC si elle correspond à IOS ou MAC_OS, sur LINUX si elle correspond à Lin, ou sur UNKNOWN_PLATFORM dans le cas contraire, en commençant par event_data, puis par device. |
| event_data_device_os_osVersion, device.os.osVersion | target.platform_version | Valeur de event_data_device_os_osVersion si elle n'est pas vide, sinon device.os.osVersion |
| event_data.destination.port | target.port | Converti en entier |
| event_data.device.deviceName | target.resource.name | Valeur copiée directement |
| event_data.user.email | target.user.email_addresses | Fusionné si l'adresse e-mail correspond à l'expression régulière |
| event_data.user.email, event_data.user.name | target.user.userid | Valeur de event_data.user.email si l'adresse e-mail n'est pas définie, sinon event_data.user.name |
| metadata.product_name | Défini sur "JAMF_SECURITY_CLOUD" | |
| metadata.vendor_name | Défini sur "JAMF_SECURITY_CLOUD" |
Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.