Interrogation des résultats Amazon GuardDuty - Amazon Athena

Interrogation des résultats Amazon GuardDuty

Amazon GuardDuty est un service de surveillance de sécurité qui aide à identifier les activités inattendues et potentiellement non autorisées ou malveillantes dans votre environnement AWS. Lorsqu'il détecte une activité inattendue et potentiellement malveillante, GuardDuty génère des résultats de sécurité que vous pouvez exporter vers Simple Storage Service (Amazon S3) pour stockage et analyse. Après avoir exporté vos résultats vers Simple Storage Service (Amazon S3), vous pouvez utiliser Athena pour les interroger. Cet article explique comment créer une table dans Athena pour vos résultats GuardDuty et interroger ceux-ci.

Pour plus d'informations sur Amazon GuardDuty, consultez le Guide de l'utilisateur Amazon GuardDuty.

Prérequis

  • Activez la fonction GuardDuty d'exportation des résultats vers Simple Storage Service (Amazon S3). Pour les étapes à suivre, consultez la rubrique Exportation des résultats du Guide de l'utilisateur Amazon GuardDuty.

Création d’une table dans Athena pour les résultats GuardDuty

Pour interroger vos résultats GuardDuty à partir d'Athena, vous devez créer une table pour eux.

Créer une table dans Athena pour les résultats GuardDuty
  1. Ouvrez la console Athena à l’adresse https://console.aws.amazon.com/athena/.

  2. Collez l'instruction DDL suivante dans la console Athena. Modifiez les valeurs dans LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/account-id/GuardDuty/' pour pointer vers vos résultats GuardDuty dans Simple Storage Service (Amazon S3).

    CREATE EXTERNAL TABLE `gd_logs` ( `schemaversion` string, `accountid` string, `region` string, `partition` string, `id` string, `arn` string, `type` string, `resource` string, `service` string, `severity` string, `createdat` string, `updatedat` string, `title` string, `description` string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/account-id/GuardDuty/' TBLPROPERTIES ('has_encrypted_data'='true')
    Note

    Le SerDe s'attend à ce que chaque document JSON soit sur une seule ligne de texte, sans caractères de fin de ligne pour séparer les champs de l'enregistrement. Si le texte JSON est au format d'impression, vous pouvez recevoir un message d'erreur similaire à HIVE_CURSOR_ERROR : Row is not a valid JSON Object (La ligne n'est pas un JSON valide) ou HIVE_CURSOR_ERROR : JSONParseException : Unexpected end-of-input: expected close marker for OBJECT (Fin d'entrée inattendue : marqueur de fermeture attendu pour OBJECT) lorsque vous tentez d'interroger la table après l'avoir créée. Pour de plus amples informations, consultez la section Fichiers de données JSON dans la documentation OpenX SerDe sur GitHub.

  3. Exécutez la requête dans la console Athena pour enregistrer la table gd_logs. Une fois la requête terminée, vous pouvez interroger les résultats à partir d'Athena.

Exemples de requêtes

Les exemples suivants montrent comment interroger les résultats GuardDuty à partir d'Athena.

Exemple – Exfiltration de données DNS

La requête suivante renvoie des informations sur les instances Amazon EC2 qui peuvent exfiltrer des données via des requêtes DNS.

SELECT title, severity, type, id AS FindingID, accountid, region, createdat, updatedat, json_extract_scalar(service, '$.count') AS Count, json_extract_scalar(resource, '$.instancedetails.instanceid') AS InstanceID, json_extract_scalar(service, '$.action.actiontype') AS DNS_ActionType, json_extract_scalar(service, '$.action.dnsrequestaction.domain') AS DomainName, json_extract_scalar(service, '$.action.dnsrequestaction.protocol') AS protocol, json_extract_scalar(service, '$.action.dnsrequestaction.blocked') AS blocked FROM gd_logs WHERE type = 'Trojan:EC2/DNSDataExfiltration' ORDER BY severity DESC
Exemple – Accès utilisateur IAM non autorisé

La requête suivante renvoie tous les types de résultat UnauthorizedAccess:IAMUser pour un principal IAM à partir de toutes les régions.

SELECT title, severity, type, id, accountid, region, createdat, updatedat, json_extract_scalar(service, '$.count') AS Count, json_extract_scalar(resource, '$.accesskeydetails.username') AS IAMPrincipal, json_extract_scalar(service,'$.action.awsapicallaction.api') AS APIActionCalled FROM gd_logs WHERE type LIKE '%UnauthorizedAccess:IAMUser%' ORDER BY severity desc;

Conseils pour interroger les résultats GuardDuty

Lorsque vous créez votre requête, gardez les points suivants à l'esprit.