Detection rules › Panther
AWS S3 Unknown Requester
Validates that proper IAM entities are accessing sensitive data buckets.
MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Collection | T1530 Data from Cloud Storage |
Rule body yaml
AnalysisType: rule
Filename: aws_s3_unknown_requester_get_object.py
RuleID: "AWS.S3.ServerAccess.UnknownRequester"
DisplayName: "AWS S3 Unknown Requester"
DedupPeriodMinutes: 60 # 1 hour
Enabled: false
LogTypes:
- AWS.S3ServerAccess
Tags:
- AWS
- Configuration Required
- Security Control
- Collection:Data From Cloud Storage Object
Reports:
Panther:
- Data Access
MITRE ATT&CK:
- TA0009:T1530
Severity: Low
Description: Validates that proper IAM entities are accessing sensitive data buckets.
Runbook: If the S3 access is not expected for this bucket, investigate the requester's other traffic.
Reference: https://docs.aws.amazon.com/AmazonS3/latest/userguide/walkthrough1.html
SummaryAttributes:
- bucket
- key
- operation
- userAgent
- remoteip
- requester
- p_any_aws_arns
- p_any_aws_account_ids
Tests:
- Name: Expected Access
ExpectedResult: false
Log:
{
"bucketowner": "f16a9e81a6589df1c902c86f7982fd14a88787db",
"bucket": "panther-bootstrap-processeddata-AF1341JAK",
"time": "2020-02-14 00:53:48.000000000",
"remoteip": "127.0.0.1",
"requester": "arn:aws:sts::123456789012:assumed-role/panther-log-analysis-AthenaApiFunctionRole-1KK31J1/panther-athena-api",
"requestid": "101B7403B9828743",
"operation": "REST.GET.OBJECT",
"key": "AWSLogs/o-wwwwwwgggg/234567890123/CloudTrail-Digest/ca-central-1/2020/02/14/234567890123_CloudTrail-Digest_ca-central-1_POrgTrail_us-east-1_20200214T001007Z.json.gz",
"requesturi": "PUT /AWSLogs/o-wwwwwwgggg/234567890123/CloudTrail-Digest/ca-central-1/2020/02/14/234567890123_CloudTrail-Digest_ca-central-1_POrgTrail_us-east-1_20200214T001007Z.json.gz HTTP/1.1",
"httpstatus": 200,
"objectsize": 747,
"totaltime": 110,
"turnaroundtime": 20,
"useragent": "aws-internal/3 aws-sdk-java/1.11.714 Linux/4.9.184-0.1.ac.235.83.329.metal1.x86_64 OpenJDK_64-Bit_Server_VM/25.242-b08 java/1.8.0_242 vendor/Oracle_Corporation",
"hostid": "neRpT/AXRsS3LMBqq/wND59opwPRWWKn7F6evEhdbS99me5fyIXpVI/MMIn6ECgU1YZAqwuF8Bw=",
"signatureversion": "SigV4",
"ciphersuite": "ECDHE-RSA-AES128-SHA",
"authenticationtype": "AuthHeader",
"hostheader": "cloudtrail.s3.us-east-1.amazonaws.com",
"tlsVersion": "TLSv1.2",
}
- Name: Unexpected Access
ExpectedResult: true
Log:
{
"bucketowner": "f16a9e81a6589df1c902c86f7982fd14a88787db",
"bucket": "panther-bootstrap-processeddata-AF1341JAK",
"time": "2020-02-14 00:53:48.000000000",
"remoteip": "127.0.0.1",
"requester": "arn:aws:iam::123456789012:user/jim-bob",
"requestid": "101B7403B9828743",
"operation": "REST.GET.OBJECT",
"key": "AWSLogs/o-wwwwwwgggg/234567890123/CloudTrail-Digest/ca-central-1/2020/02/14/234567890123_CloudTrail-Digest_ca-central-1_POrgTrail_us-east-1_20200214T001007Z.json.gz",
"requesturi": "PUT /AWSLogs/o-wwwwwwgggg/234567890123/CloudTrail-Digest/ca-central-1/2020/02/14/234567890123_CloudTrail-Digest_ca-central-1_POrgTrail_us-east-1_20200214T001007Z.json.gz HTTP/1.1",
"httpstatus": 200,
"objectsize": 747,
"totaltime": 110,
"turnaroundtime": 20,
"useragent": "aws-internal/3 aws-sdk-java/1.11.714 Linux/4.9.184-0.1.ac.235.83.329.metal1.x86_64 OpenJDK_64-Bit_Server_VM/25.242-b08 java/1.8.0_242 vendor/Oracle_Corporation",
"hostid": "neRpT/AXRsS3LMBqq/wND59opwPRWWKn7F6evEhdbS99me5fyIXpVI/MMIn6ECgU1YZAqwuF8Bw=",
"signatureversion": "SigV4",
"ciphersuite": "ECDHE-RSA-AES128-SHA",
"authenticationtype": "AuthHeader",
"hostheader": "cloudtrail.s3.us-east-1.amazonaws.com",
"tlsVersion": "TLSv1.2",
}
- Name: Failed Request
ExpectedResult: false
Log:
{
"bucketowner": "f16a9e81a6589df1c902c86f7982fd14a88787db",
"bucket": "panther-bootstrap-processeddata-AF1341JAK",
"time": "2020-02-14 00:53:48.000000000",
"errorcode": "AuthorizationHeaderMalformed",
"remoteip": "127.0.0.1",
"requestid": "101B7403B9828743",
"operation": "REST.GET.OBJECT",
"key": "AWSLogs/o-wwwwwwgggg/234567890123/CloudTrail-Digest/ca-central-1/2020/02/14/234567890123_CloudTrail-Digest_ca-central-1_POrgTrail_us-east-1_20200214T001007Z.json.gz",
"requesturi": "PUT /AWSLogs/o-wwwwwwgggg/234567890123/CloudTrail-Digest/ca-central-1/2020/02/14/234567890123_CloudTrail-Digest_ca-central-1_POrgTrail_us-east-1_20200214T001007Z.json.gz HTTP/1.1",
"httpstatus": 400,
"objectsize": 747,
"totaltime": 110,
"turnaroundtime": 20,
"useragent": "aws-internal/3 aws-sdk-java/1.11.714 Linux/4.9.184-0.1.ac.235.83.329.metal1.x86_64 OpenJDK_64-Bit_Server_VM/25.242-b08 java/1.8.0_242 vendor/Oracle_Corporation",
"hostid": "neRpT/AXRsS3LMBqq/wND59opwPRWWKn7F6evEhdbS99me5fyIXpVI/MMIn6ECgU1YZAqwuF8Bw=",
"signatureversion": "SigV4",
"ciphersuite": "ECDHE-RSA-AES128-SHA",
"authenticationtype": "AuthHeader",
"hostheader": "cloudtrail.s3.us-east-1.amazonaws.com",
"tlsVersion": "TLSv1.2",
}
- Name: Snowflake Request
ExpectedResult: false
Log:
{
"authenticationtype": "AuthHeader",
"bucket": "panther-bootstrap-processeddata-AF1341JAK",
"bucketowner": "f16a9e81a6589df1c902c86f7982fd14a88787db",
"ciphersuite": "ECDHE-RSA-AES128-GCM-SHA256",
"httpstatus": 200,
"key": "logs/logdir/year%253D2020/month%253D09/day%253D30/hour%253D19/file.json.gz",
"requesturi": "GET /logs/logdir/year%3D2020/month%3D09/day%3D30/hour%3D19/file.json.gz HTTP/1.1",
"objectsize": 4063,
"operation": "REST.GET.OBJECT",
"remoteip": "127.0.0.1",
"requester": "arn:aws:sts::123456789012:assumed-role/panther-snowflake-logprocessing-role-us-west-2/snowflake",
"requestid": "101B7403B9828743",
"signatureversion": "SigV4",
"time": "2020-09-30 20:49:19.000000000",
"tlsVersion": "TLSv1.2",
"totaltime": 10,
"turnaroundtime": 9,
"useragent": "snowflake/1.0",
}
Detection logic
Condition
errorcode is_null
operation eq "REST.GET.OBJECT"
This rule also runs imperative logic the parser cannot express as a filter; the conditions above are the structured part it could extract.
Indicators
Each row is a field, operator, and value that the rule matches. The corpus column counts how many other rules in the catalog look for the same combination: high numbers point to widely-used, community-vetted indicators. Blank or 1 shows that the indicator is specific to this rule.
Output fields
Fields the rule emits when it matches. Chronicle authors list these in the outcome block; they appear on the detection and $risk_score drives alerting. Sentinel / Defender XDR rules build them up through project / summarize / extend stages. Sentinel maps these into alert fields via entityMappings and customDetails; Defender XDR custom detections surface them as alert fields directly.
| Field |
|---|
eventName |
eventSource |
awsRegion |
recipientAccountId |
sourceIPAddress |
userAgent |
userIdentity |
bucket |