Collecter les journaux des hôtes AWS EC2
Version de l'analyseur : 1.0
Ce document explique comment intégrer les journaux des hôtes AWS EC2 dans Google Security Operations pour la surveillance et l'analyse. L'intégration implique l'analyse et le mappage des journaux d'hôte EC2 au modèle de données unifié (UDM), la transformation des données et la création de relations entre les hôtes et les instances EC2. Les journaux fournissent des informations précieuses sur les instances, les propriétés d'hôte, les types d'instances et les métriques de performances qui peuvent être utilisées pour la surveillance de la sécurité, l'audit et la conformité.
Avant de commencer
- Assurez-vous de disposer d'une instance Google SecOps.
- Assurez-vous de disposer d'un accès privilégié à AWS.
Configurer AWS IAM et S3
- Créez un bucket Amazon S3 en suivant ce guide de l'utilisateur : Créer un bucket.
- Enregistrez le nom et la région du bucket pour une utilisation ultérieure.
- Créez un utilisateur en suivant ce guide de l'utilisateur : Créer un utilisateur IAM.
- Sélectionnez l'utilisateur créé.
- Sélectionnez l'onglet Security credentials (Identifiants de sécurité).
- Cliquez sur Create Access Key (Créer une clé d'accès) dans la section Access Keys (Clés d'accès).
- Sélectionnez Third-party service (Service tiers) comme Use case (Cas d'utilisation).
- Cliquez sur Suivant.
- Facultatif : ajoutez un tag de description.
- Cliquez sur Create access key (Créer une clé d'accès).
- Cliquez sur Download CSV file (Télécharger le fichier CSV) pour enregistrer la clé d'accès et la clé d'accès secrète pour une utilisation ultérieure.
- Cliquez sur OK.
- Sélectionnez l'onglet Permissions (Autorisations).
- Cliquez sur Add permissions (Ajouter des autorisations) dans la section Permissions policies (Règles d'autorisation).
- Sélectionnez Add permissions (Ajouter des autorisations).
- Sélectionnez Attach policies directly (Joindre directement des règles).
- Recherchez et sélectionnez la règle AmazonS3FullAccess.
- Cliquez sur Suivant.
- Cliquez sur Add permissions (Ajouter des autorisations).
Configurer CloudTrail pour AWS KMS
- Connectez-vous à l'AWS Management Console.
- Dans la barre de recherche, saisissez CloudTrail , puis sélectionnez-le dans la liste des services.
- Cliquez sur Create trail (Créer un journal).
- Indiquez un nom de journal, par exemple
EC2-Activity-Trail. - Cochez la case Enable for all accounts in my organization (Activer pour tous les comptes de mon organisation).
- Saisissez l'URI du bucket S3 créé précédemment (le format doit être
s3://your-log-bucket-name/) ou créez un bucket S3. - Si SSE-KMS est activé, indiquez un nom pour l'alias AWS KMS ou choisissez une clé AWS KMS existante.
- Vous pouvez laisser les autres paramètres par défaut.
- Cliquez sur Suivant.
- Sélectionnez Management events (Événements de gestion) et Data events (Événements de données) sous Event Types (Types d'événements) pour capturer l'activité de l'hôte EC2.
- Cliquez sur Suivant.
- Vérifiez les paramètres dans Review and create (Vérifier et créer).
- Cliquez sur Create trail (Créer un journal).
- Facultatif : si vous avez créé un bucket, procédez comme suit :
- Accédez à S3.
- Identifiez et sélectionnez le bucket de journaux que vous venez de créer.
- Sélectionnez le dossier AWSLogs.
- Cliquez sur Copy S3 URI (Copier l'URI S3) et enregistrez-le.
Configurer un flux dans Google SecOps pour ingérer des hôtes AWS EC2
- Accédez à Paramètres SIEM > Flux.
- Cliquez sur Ajouter.
- Dans le champ Feed name (Nom du flux), saisissez un nom pour le flux, par exemple AWS EC2 Hosts Logs (Journaux des hôtes AWS EC2).
- Sélectionnez Amazon S3 V2 comme Source type (Type de source).
- Sélectionnez AWS EC2 Hosts comme Log type (Type de journal).
- Cliquez sur Suivant.
Spécifiez les valeurs des paramètres d'entrée suivants :
- URI S3 : URI du bucket.
s3://your-log-bucket-name/- Remplacez
your-log-bucket-namepar le nom réel du bucket.
- Remplacez
Source deletion options (Options de suppression de la source) : sélectionnez l'option de suppression de votre choix.
Maximum File Age (Âge maximal des fichiers) : incluez les fichiers modifiés au cours des derniers jours. La valeur par défaut est de 180 jours.
Access Key ID (ID de clé d'accès) : clé d'accès utilisateur avec accès au bucket S3.
Secret Access Key (Clé d'accès secrète) : clé secrète utilisateur avec accès au bucket S3.
Asset namespace (Espace de noms de l'élément) : l'espace de noms de l'élément.
Ingestion labels (Libellés d'ingestion) : libellé à appliquer aux événements de ce flux.
- URI S3 : URI du bucket.
Cliquez sur Suivant.
Vérifiez la configuration de votre nouveau flux dans l'écran Finalize (Finaliser), puis cliquez sur Envoyer.
Formats de journaux d'hôtes AWS EC2 compatibles
L'analyseur d'hôtes AWS EC2 est compatible avec les journaux au format JSON.
Exemples de journaux d'hôtes AWS EC2 compatibles
JSON
{ "AllocationTime": "2018-01-23T12:33:31.692Z", "AllowsMultipleInstanceTypes": "", "AssetID": "", "AutoPlacement": "off", "AvailabilityZone": "us-east-1a", "AvailabilityZoneID": "", "AvailableCapacity": { "VCPUs": 96, "Instance": { "Available": 48, "Total": 48, "Type": "m5.large" } }, "ClientToken": "", "ID": "h-05abcdd12ee9ca123", "Maintenance": "", "Properties": { "Cores": 48, "InstanceFamily": "", "InstanceType": "m5.large", "Sockets": 2, "TotalVCPUs": 96 }, "Recovery": "off", "ReservationID": "", "Instances": null, "MemberOfServiceLinkedResourceGroup": false, "OutpostARN": "", "OwnerID": "", "ReleaseTime": "", "State": "available", "TagSet": null }
Table de mappage UDM
| Champ du journal | Mappage UDM | Logique |
|---|---|---|
AllocationTime |
entity.metadata.creation_timestamp |
Le champ AllocationTime est analysé en tant qu'horodatage et mappé au champ creation_timestamp. L'analyseur tente différents formats (aaaa-MM-jj HH:mm:ss, RFC 3339, UNIX, ISO8601). |
AllowsMultipleInstanceTypes |
entity.entity.asset.attribute.labels.value |
La valeur de AllowsMultipleInstanceTypes du journal brut est utilisée comme valeur d'un libellé. La clé de ce libellé est définie sur allows_multiple_instance_types. |
AutoPlacement |
entity.entity.asset.attribute.labels.value |
La valeur de AutoPlacement du journal brut est utilisée comme valeur d'un libellé. La clé de ce libellé est définie sur auto_placement. |
AvailabilityZone |
entity.entity.asset.attribute.cloud.availability_zone |
Le champ AvailabilityZone est directement mappé au champ availability_zone. |
AvailabilityZoneID |
entity.entity.asset.attribute.labels.value |
La valeur de AvailabilityZoneID du journal brut est utilisée comme valeur d'un libellé. La clé de ce libellé est définie sur availability_zone_id. |
AvailableCapacity.AvailableInstanceCapacity.AvailableCapacity |
entity.entity.asset.attribute.labels.value |
La valeur de AvailableCapacity.AvailableInstanceCapacity.AvailableCapacity (ou AvailableCapacity.Instance.Available après le changement de nom) est convertie en chaîne et utilisée comme valeur d'un libellé. La clé est définie sur available_instance_capacity_available_capacity. |
AvailableCapacity.AvailableInstanceCapacity.InstanceType |
entity.entity.asset.attribute.labels.value |
La valeur de AvailableCapacity.AvailableInstanceCapacity.InstanceType (ou AvailableCapacity.Instance.Type après le changement de nom) est utilisée comme valeur d'un libellé. La clé est définie sur available_instance_capacity_instance_type. |
AvailableCapacity.AvailableInstanceCapacity.TotalCapacity |
entity.entity.asset.attribute.labels.value |
La valeur de AvailableCapacity.AvailableInstanceCapacity.TotalCapacity (ou AvailableCapacity.Instance.Total après le changement de nom) est convertie en chaîne et utilisée comme valeur d'un libellé. La clé est définie sur total_capacity. |
AvailableCapacity.AvailableVCpus |
entity.entity.asset.attribute.labels.value |
La valeur de AvailableCapacity.AvailableVCpus (ou AvailableCapacity.VCPUs après le changement de nom) est convertie en chaîne et utilisée comme valeur d'un libellé. La clé est définie sur available_v_cpus. |
ClientToken |
entity.entity.asset.attribute.labels.value |
La valeur de ClientToken du journal brut est utilisée comme valeur d'un libellé. La clé de ce libellé est définie sur client_token. |
HostID |
entity.metadata.product_entity_id |
Le champ HostID (ou ID après le changement de nom) est directement mappé au champ product_entity_id. |
HostID |
entity.entity.asset.asset_id |
Le champ HostID (ou ID après le changement de nom) est directement mappé au champ asset_id. |
HostMaintenance |
entity.entity.asset.attribute.labels.value |
La valeur de HostMaintenance (ou Maintenance après le changement de nom) du journal brut est utilisée comme valeur d'un libellé. La clé de ce libellé est définie sur host_maintenance. |
HostProperties.Cores |
entity.entity.asset.hardware.cpu_number_cores |
La valeur de HostProperties.Cores est convertie en entier non signé et mappée à cpu_number_cores. |
HostProperties.InstanceFamily |
entity.entity.asset.attribute.labels.value |
La valeur de HostProperties.InstanceFamily du journal brut est utilisée comme valeur d'un libellé. La clé de ce libellé est définie sur host_properties_instance_family. |
HostProperties.InstanceType |
entity.entity.asset.attribute.labels.value |
La valeur de HostProperties.InstanceType du journal brut est utilisée comme valeur d'un libellé. La clé de ce libellé est définie sur host_properties_instance_type. |
HostProperties.Sockets |
entity.entity.asset.attribute.labels.value |
La valeur de HostProperties.Sockets est convertie en chaîne et utilisée comme valeur d'un libellé. La clé est définie sur host_properties_sockets. |
HostProperties.TotalVCpus |
entity.entity.asset.attribute.labels.value |
La valeur de HostProperties.TotalVCpus (ou HostProperties.TotalVCPUs après le changement de nom) est convertie en chaîne et utilisée comme valeur d'un libellé. La clé est définie sur host_properties_total_v_cpus. |
HostRecovery |
entity.entity.asset.attribute.labels.value |
La valeur de HostRecovery (ou Recovery après le changement de nom) du journal brut est utilisée comme valeur d'un libellé. La clé de ce libellé est définie sur host_recovery. |
HostReservationID |
entity.entity.asset.attribute.labels.value |
La valeur de HostReservationID (ou ReservationID après le changement de nom) du journal brut est utilisée comme valeur d'un libellé. La clé de ce libellé est définie sur host_reservation_id. |
MemberOfServiceLinkedResourceGroup |
entity.entity.asset.attribute.labels.value |
La valeur de MemberOfServiceLinkedResourceGroup est convertie en chaîne et utilisée comme valeur d'un libellé. La clé est définie sur member_of_service_linked_resource_group. |
OwnerID |
entity.entity.asset.attribute.labels.value |
La valeur de OwnerID du journal brut est utilisée comme valeur d'un libellé. La clé de ce libellé est définie sur owner_id. |
ReleaseTime |
entity.entity.asset.attribute.labels.value |
La valeur de ReleaseTime du journal brut est utilisée comme valeur d'un libellé. La clé de ce libellé est définie sur release_time. |
State |
entity.entity.asset.attribute.labels.value |
La valeur de State du journal brut est utilisée comme valeur d'un libellé. La clé de ce libellé est définie sur state. |
TagSet |
entity.entity.asset.attribute.labels |
Le tableau TagSet est parcouru, et les éléments Key et Value de chaque tag sont utilisés respectivement comme clé et valeur d'un libellé. La valeur AMAZON_WEB_SERVICES est attribuée à ce champ par l'analyseur. La valeur collection_time du journal brut est mappée au champ collected_timestamp. La valeur ASSET est attribuée à ce champ par l'analyseur. La valeur AWS EC2 HOSTS est attribuée à ce champ par l'analyseur. La valeur AWS est attribuée à ce champ par l'analyseur. Les relations sont dérivées des champs Instances et OutpostArn, mais ces champs eux-mêmes ne sont pas directement mappés à l'objet IDM. La logique de l'analyseur crée des objets de relation basés sur ces champs et les fusionne dans le tableau relations. |
collection_time |
entity.metadata.collected_timestamp |
La valeur collection_time du journal est utilisée comme valeur collected_timestamp de l'événement. |
Journal des modifications
Consulter le journal des modifications de cet analyseur
Vous avez encore besoin d'aide ? Obtenez des réponses auprès des membres de la communauté et des professionnels Google SecOps.