Identification des demandes Amazon S3 à l’aide de CloudTrail
Dans Amazon S3, vous pouvez identifier les demandes à l’aide d’un journal d’événements AWS CloudTrail. AWS CloudTrail est le moyen privilégié d’identifier les demandes Amazon S3, mais si vous utilisez les journaux d’accès au serveur Amazon S3, consultez Utilisation des journaux d’accès au serveur Amazon S3 pour identifier des demandes.
Rubriques
Identification des demandes adressées à Amazon S3 dans un journal CloudTrail
Après avoir configuré CloudTrail pour fournir les événements dans un compartiment, vous devriez commencer à voir des objets arriver dans votre compartiment de destination sur la console Amazon S3. Ils se présentent dans le format suivant :
s3://
amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/Region/yyyy/mm/dd
Les événements journalisés par CloudTrail sont stockés sous la forme d’objets JSON compressés avec gzipped dans votre compartiment S3. Pour trouver efficacement les demandes, vous devez utiliser un service comme Amazon Athena pour indexer et interroger les journaux CloudTrail.
Pour en savoir plus sur CloudTrail et Athena, consultez Création de la table pour les journaux AWS CloudTrail dans Athena à l’aide de la projection de partition dans le Guide de l’utilisateur Amazon Athena.
Identification des requêtes Amazon S3 Signature Version 2 à l’aide de CloudTrail
Vous pouvez utiliser un journal d’événements CloudTrail pour identifier la version de signature d’API utilisée pour signer une demande dans Amazon S3. Cette fonctionnalité est importante étant donné que la prise en charge de Signature Version 2 va être désactivée (obsolète). Après cela, Amazon S3 n’acceptera plus les demandes utilisant Signature Version 2, et toutes les demandes devront utiliser le processus de signature Signature Version 4.
Nous vous conseillons vivement d’utiliser CloudTrail afin de déterminer si certains de vos flux de travail utilisent Signature Version 2 pour la signature. Pour y remédier, mettez à niveau vos bibliothèques et votre code afin qu’ils utilisent plutôt Signature Version 4 afin d’éviter tout impact sur votre entreprise.
Pour plus d’informations, consultez Annonce : AWS CloudTrail pour Amazon S3 ajoute de nouveaux champs pour améliorer l’audit de sécurité
Note
Les événement CloudTrail pour Amazon S3 incluent la version de signature dans les détails de la demande sous le nom de clé additionalEventData. Pour trouver la version de la signature sur les requêtes effectuées pour des objets dans Amazon S3 tels que les requêtes GET, PUT et DELETE, vous devez activer les événements de données CloudTrail. (Cette fonction est désactivée par défaut).
AWS CloudTrail est la méthode privilégiée pour identifier les demandes Signature Version 2. Si vous utilisez les journaux d’accès au serveur Amazon S3, consultez Identification des demandes Signature Version 2 à l’aide des journaux d’accès Amazon S3.
Rubriques
Exemples de requête Athena pour l’identification de demandes Amazon S3 Signature Version 2
Exemple — sélectionnez tous les événements de la version 2 de la signature et imprimez uniquement EventTime, S3_Action, Request_Parameters, Region, SourceIP, et UserAgent
Dans la requête Athena suivante, remplacez par vos coordonnées Athena, et augmentez ou supprimez la limite selon les besoins. s3_cloudtrail_events_db.cloudtrail_table
SELECT EventTime, EventName as S3_Action, requestParameters as Request_Parameters, awsregion as AWS_Region, sourceipaddress as Source_IP, useragent as User_Agent FROMs3_cloudtrail_events_db.cloudtrail_tableWHERE eventsource='s3.amazonaws.com' AND json_extract_scalar(additionalEventData, '$.SignatureVersion')='SigV2' LIMIT 10;
Exemple – Sélectionner tous les demandeurs qui envoient du trafic Signature Version 2
SELECT useridentity.arn, Count(requestid) as RequestCount FROMs3_cloudtrail_events_db.cloudtrail_tableWHERE eventsource='s3.amazonaws.com' and json_extract_scalar(additionalEventData, '$.SignatureVersion')='SigV2' Group by useridentity.arn
Partitionnement des données Signature Version 2
Si vous devez interroger un large volume de données, vous pouvez réduire les coûts et l’exécution d’Athena en créant une table partitionnée.
Pour ce faire, créez une nouvelle table avec des partitions, comme suit.
CREATE EXTERNAL TABLEs3_cloudtrail_events_db.cloudtrail_table_partitioned( eventversion STRING, userIdentity STRUCT< type:STRING, principalid:STRING, arn:STRING, accountid:STRING, invokedby:STRING, accesskeyid:STRING, userName:STRING, sessioncontext:STRUCT< attributes:STRUCT< mfaauthenticated:STRING, creationdate:STRING>, sessionIssuer:STRUCT< type:STRING, principalId:STRING, arn:STRING, accountId:STRING, userName:STRING> > >, eventTime STRING, eventSource STRING, eventName STRING, awsRegion STRING, sourceIpAddress STRING, userAgent STRING, errorCode STRING, errorMessage STRING, requestParameters STRING, responseElements STRING, additionalEventData STRING, requestId STRING, eventId STRING, resources ARRAY<STRUCT<ARN:STRING,accountId: STRING,type:STRING>>, eventType STRING, apiVersion STRING, readOnly STRING, recipientAccountId STRING, serviceEventDetails STRING, sharedEventID STRING, vpcEndpointId STRING ) PARTITIONED BY (region string, year string, month string, day string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/';
Ensuite, créez les partitions individuellement. Vous ne pouvez pas obtenir des résultats à partir de dates que vous n’avez pas créées.
ALTER TABLEs3_cloudtrail_events_db.cloudtrail_table_partitioned ADD PARTITION (region= 'us-east-1', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/us-east-1/2019/02/19/' PARTITION (region= 'us-west-1', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/us-west-1/2019/02/19/' PARTITION (region= 'us-west-2', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/us-west-2/2019/02/19/' PARTITION (region= 'ap-southeast-1', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/ap-southeast-1/2019/02/19/' PARTITION (region= 'ap-southeast-2', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/ap-southeast-2/2019/02/19/' PARTITION (region= 'ap-northeast-1', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/ap-northeast-1/2019/02/19/' PARTITION (region= 'eu-west-1', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/eu-west-1/2019/02/19/' PARTITION (region= 'sa-east-1', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/sa-east-1/2019/02/19/';
Vous pouvez ensuite effectuer la demande en fonction de ces partitions. Vous n’avez pas besoin de charger le compartiment entier.
SELECT useridentity.arn, Count(requestid) AS RequestCount FROMs3_cloudtrail_events_db.cloudtrail_table_partitioned WHERE eventsource='s3.amazonaws.com' AND json_extract_scalar(additionalEventData, '$.SignatureVersion')='SigV2' AND region='us-east-1' AND year='2019' AND month='02' AND day='19' Group by useridentity.arn
Identification de l’accès aux objets S3 à l’aide de CloudTrail
Vous pouvez utiliser vos journaux des événements AWS CloudTrail pour identifier les demandes d’accès aux objets Amazon S3 pour des événements de données tels que GetObject, DeleteObject et PutObject, ainsi que pour découvrir des informations supplémentaires sur ces demandes.
Note
Si vous enregistrez l’activité des données avec AWS CloudTrail, l’enregistrement d’un événement de données Amazon S3 DeleteObjects inclut à la fois l’événement DeleteObjects et un événement DeleteObject pour chaque objet supprimé dans le cadre de cette opération. Vous pouvez exclure les informations des objets supprimés de l’enregistrement de l’événement. Pour plus d’informations, consultez Exemples de filtre des événements de données à l’aide de l’AWS CLI dans le Guide de l’utilisateur AWS CloudTrail.
L’exemple suivant montre comment obtenir toutes les demandes d’objets PUT pour Amazon S3 à partir du journal des événements AWS CloudTrail.
Exemples de requêtes Athena pour identifier les demandes d’accès aux objets Amazon S3
Dans les exemples de requêtes Athena suivants, remplacez par vos coordonnées Athena et modifiez la plage de dates si nécessaire. s3_cloudtrail_events_db.cloudtrail_table
Exemple — sélectionnez tous les événements pour lesquels il existe des demandes d’accès à des objets PUT, et imprimez uniquement EventTime, EventSource, SourceIP, UserAgent, BucketName, object et UserARN
SELECT eventTime, eventName, eventSource, sourceIpAddress, userAgent, json_extract_scalar(requestParameters, '$.bucketName') as bucketName, json_extract_scalar(requestParameters, '$.key') as object, userIdentity.arn as userArn FROMs3_cloudtrail_events_db.cloudtrail_tableWHERE eventName = 'PutObject' AND eventTime BETWEEN '2019-07-05T00:00:00Z' and '2019-07-06T00:00:00Z'
Exemple — sélectionnez tous les événements pour lesquels il existe des demandes d’accès à des objets GET, et imprimez uniquement EventTime, EventSource, SourceIP, UserAgent, BucketName, object et UserARN
SELECT eventTime, eventName, eventSource, sourceIpAddress, userAgent, json_extract_scalar(requestParameters, '$.bucketName') as bucketName, json_extract_scalar(requestParameters, '$.key') as object, userIdentity.arn as userArn FROMs3_cloudtrail_events_db.cloudtrail_tableWHERE eventName = 'GetObject' AND eventTime BETWEEN '2019-07-05T00:00:00Z' and '2019-07-06T00:00:00Z'
Exemple — sélectionnez tous les événements des demandeurs anonymes dans un compartiment pendant une certaine période et imprimez seulement EventTime, EventName, EventSource, SourceIP, UserAgent, BucketName, UserARN et AccountID
SELECT eventTime, eventName, eventSource, sourceIpAddress, userAgent, json_extract_scalar(requestParameters, '$.bucketName') as bucketName, userIdentity.arn as userArn, userIdentity.accountId FROMs3_cloudtrail_events_db.cloudtrail_tableWHERE userIdentity.accountId = 'anonymous' AND eventTime BETWEEN '2019-07-05T00:00:00Z' and '2019-07-06T00:00:00Z'
Exemple — identifiez toutes les demandes qui ont nécessité un ACL pour l’autorisation.
L’exemple de requête Amazon Athena suivant montre comment identifier toutes les requêtes de vos compartiments S3 qui ont nécessité une liste de contrôle d’accès (ACL) pour l’autorisation. Si la requête a nécessité une ACL pour l’autorisation, la valeur aclRequired dans additionalEventData est Yes. Si aucune ACL n’a été requise, la valeur aclRequired est absente. Vous pouvez utiliser ces informations pour migrer ces autorisations ACL vers les stratégies de compartiment appropriées. Après avoir créé ces stratégies de compartiment, vous pouvez désactiver les ACL pour ces compartiments. Pour plus d’informations sur la désactivation des ACL, consultez Conditions préalables à la désactivation des listes ACL.
SELECT eventTime, eventName, eventSource, sourceIpAddress, userAgent, userIdentity.arn as userArn, json_extract_scalar(requestParameters, '$.bucketName') as bucketName, json_extract_scalar(requestParameters, '$.key') as object, json_extract_scalar(additionalEventData, '$.aclRequired') as aclRequired FROMs3_cloudtrail_events_db.cloudtrail_tableWHERE json_extract_scalar(additionalEventData, '$.aclRequired') = 'Yes' AND eventTime BETWEEN '2022-05-10T00:00:00Z' and '2022-08-10T00:00:00Z'
Note
-
Ces exemples de requêtes sont également utiles pour surveiller la sécurité. Vous pouvez vérifier les résultats pour les appels
PutObjectouGetObjectdepuis des adresses IP ou des demandeurs inattendus ou non autorisés et pour identifier les demandes anonymes adressées à vos compartiments. -
Cette requête ne récupère d’informations qu’à partir du moment où l’enregistrement a été activé.
Si vous utilisez les journaux d’accès au serveur Amazon S3, consultez Identification des demandes d’accès aux objets à l’aide des journaux d’accès Amazon S3.