Detection rules › Panther

AWS S3 Unknown Requester

Severity
low
Compliance
Panther Data Access
Log types
AWS.S3ServerAccess
Tags
AWS, Configuration Required, Security Control, Collection:Data From Cloud Storage Object
Reference
https://docs.aws.amazon.com/AmazonS3/latest/userguide/walkthrough1.html
Source
github.com/panther-labs/panther-analysis

Validates that proper IAM entities are accessing sensitive data buckets.

MITRE ATT&CK coverage

TacticTechniques
CollectionT1530 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.

FieldKindValues
errorcodeis_null
  • (no value, null check)
operationeq
  • REST.GET.OBJECT

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