What AWS CloudTrail Actually Captures

CloudTrail is AWS's primary API audit log service. Every call made to an AWS API — whether from the console, the CLI, an SDK, or an automated service — generates a CloudTrail event. That event records who made the call (the principal), what they called (the API action), when it happened, what parameters were passed, and whether it succeeded.

There are three types of CloudTrail events you need to understand before building any detection on top of them:

  • Management Events (Control Plane): Operations that create, modify, or delete AWS resources — things like creating an EC2 instance, modifying an IAM policy, or changing a security group. These are logged by default. This is where most security-relevant events live.
  • Data Events (Data Plane): Object-level operations like S3 GetObject, PutObject, or Lambda invocations. These are not enabled by default because of volume and cost. For data exfiltration detection, you need them turned on for specific buckets.
  • Insights Events: CloudTrail's built-in anomaly detection for unusual API call volumes. Limited in scope, but useful as a supplementary signal for rate-based detection.

The geographic and service coverage matters too. CloudTrail trails can be configured to capture events from a single region or across all regions. Multi-region trails are essential for security monitoring — attackers regularly operate in regions that organizations don't use, specifically because they know monitoring is weaker there.

The Signal-to-Noise Problem in CloudTrail

Here is the operational reality: a mid-sized AWS environment running a dozen microservices might generate 80–120 million CloudTrail events per day. The vast majority of these events are completely benign: Auto Scaling checking instance health, CloudFormation describing stack resources, ECS registering task definitions, CodePipeline executing stages.

Naively alerting on every unusual event creates a queue that no human team can process. The effective approach is to define a strict set of event categories that represent either high-risk actions or known attacker behaviors — and ignore everything else unless it correlates with one of those signals.

50M+
avg CloudTrail events per AWS account per day
7/10
cloud breaches involve IAM misconfiguration
14min
avg to detect CloudTrail-visible attacks with automated alerting

The goal is not comprehensive coverage of every event type. The goal is high-confidence detection of the actions that attackers actually take in a compromised AWS environment — and the ability to correlate multiple low-signal events into a high-confidence incident.

Critical Event Category 1: Authentication and Access

Authentication events are the most commonly monitored CloudTrail category — and the most commonly over-alerting one. Raw ConsoleLogin failures are high volume and mostly benign (users forgetting passwords, automated scripts using stale credentials). The signal emerges from patterns, not individual events.

ConsoleLogin Failures at Scale

A single failed ConsoleLogin is meaningless. Five failed logins from the same source IP in two minutes is a brute-force indicator. Ten failed logins across five different IAM users from the same IP in ten minutes is a credential stuffing attempt. The detection logic needs to operate on windowed aggregations, not raw events.

AssumeRole Event Chains

AssumeRole is one of the most powerful and most abused operations in AWS. Legitimate use involves services assuming roles to access resources they're authorized for. Attacker use involves chaining role assumptions across accounts to move laterally — assume a role in Account A to gain credentials, then use those credentials to assume a role in Account B, bypassing the detection that exists in Account A's alerting.

Detection patterns to watch: AssumeRole calls where the assumed role grants permissions significantly broader than the calling principal's baseline, cross-account AssumeRole from IAM users (which is unusual — most legitimate cross-account access uses roles attached to services), and AssumeRole followed immediately by high-risk API calls.

MFA Device Removal

The DeleteVirtualMFADevice and DeactivateMFADevice API calls should generate immediate alerts for any root account or privileged IAM user. Removing MFA from an account is almost never a legitimate operational action — it is almost always either an attacker removing a control or an insider creating a backdoor.

Critical Event Category 2: Privilege Escalation

IAM privilege escalation is the most common post-compromise action in AWS. An attacker who gains access with limited permissions will almost always attempt to escalate to AdministratorAccess or at minimum gain access to the resources they want. CloudTrail captures every IAM API call, making this category highly detectable.

The events to monitor for privilege escalation:

  • CreateUser / CreateRole: New IAM entities created outside of your IaC pipeline are suspicious. In a well-managed AWS environment, IAM users should only be created via Terraform or CloudFormation — a direct API call to CreateUser from a human principal or from an unexpected service is worth investigating.
  • AttachUserPolicy / AttachRolePolicy: Policy attachments that grant AdministratorAccess, iam:* permissions, or s3:* permissions are high-severity. Pay particular attention to attaching AWS managed policies like AdministratorAccess directly to users.
  • PutUserPolicy / PutRolePolicy: Inline policies are harder to audit and often used by attackers specifically because they're less visible than managed policy attachments. Any PutUserPolicy call that creates or modifies an inline policy should be reviewed.
  • CreateAccessKey: Creating a new access key for an existing IAM user — especially a high-privilege user or the root account — is a classic backdoor creation technique. Alert on CreateAccessKey calls made outside of your standard provisioning workflow.
  • UpdateAssumeRolePolicy: Modifying the trust policy of a role to allow an unexpected principal to assume it is a privilege escalation technique. This is often missed because teams monitor policy attachments but not trust policy modifications.

Critical Event Category 3: Data Access and Exfiltration

Data exfiltration through CloudTrail-visible events requires Data Events to be enabled, but the investment is worth it for your most sensitive S3 buckets and secrets stores. Without Data Event logging, you have a blind spot that attackers exploit.

S3 GetObject at Scale

A single S3 GetObject call is normal. Ten thousand S3 GetObject calls from a single principal in an hour, across a bucket that principal doesn't normally access, is exfiltration in progress. The key is baselining normal access patterns per principal and alerting on deviations — not on absolute thresholds.

Also watch for: GetBucketPolicy and ListBuckets calls from principals that don't normally perform administrative S3 operations. These are reconnaissance actions — an attacker mapping out the S3 landscape before choosing what to steal.

GetSecretValue from Secrets Manager

The GetSecretValue API call against AWS Secrets Manager should be treated with high suspicion when it comes from an unexpected principal or at unexpected times. Many organizations store database credentials, API keys, and certificates in Secrets Manager. Bulk GetSecretValue calls — iterating through secrets by name — is a technique for rapidly exfiltrating credentials.

Build a detection that alerts when: GetSecretValue is called on more than five distinct secrets by the same principal within a short window, or when GetSecretValue is called on secrets that principal has never accessed before.

Critical Event Category 4: Infrastructure Changes

Infrastructure modification events indicate an attacker establishing persistence, creating backdoors, or expanding their footprint within your environment. These events are distinct from the data access category — they change the configuration of your AWS environment rather than just accessing data.

  • AuthorizeSecurityGroupIngress: Opening inbound security group rules — especially rules that allow 0.0.0.0/0 on port 22 (SSH) or 3389 (RDP) — is a persistence mechanism. Attackers create ingress rules to give themselves direct access back into EC2 instances.
  • ModifyVpcAttribute / CreateVpcPeeringConnection: VPC modifications that create network paths to external accounts or change DNS resolution settings warrant investigation. Cross-account VPC peering connections from unexpected source accounts are a data exfiltration channel.
  • CreateFunction / UpdateFunctionCode: Lambda functions are increasingly used as attacker infrastructure. Creating new Lambda functions or updating existing function code outside of your CI/CD pipeline is suspicious, especially if the function is granted broad IAM permissions.
  • RunInstances with unusual instance types: Attackers who compromise AWS accounts often spin up EC2 instances for cryptocurrency mining. Alert on RunInstances calls for GPU-heavy instance types (p3, g4, p4) or for high-core-count instances in regions you don't normally use.

Critical Event Category 5: Audit Trail Tampering

This category deserves special attention because it directly threatens your ability to investigate anything else. An attacker who disables or modifies CloudTrail is not just evading detection — they are destroying the forensic record of everything they've already done.

P1 Alert: The StopLogging Event

Any call to cloudtrail:StopLogging or cloudtrail:DeleteTrail must be treated as a Priority 1 incident requiring immediate response — not a medium-severity alert for next-day review. When an attacker calls StopLogging, they are preparing to conduct high-noise operations (mass data exfiltration, lateral movement, persistence establishment) without generating evidence. The window between StopLogging and an organization discovering the gap in their logs is the time attackers use most effectively. Similarly, PutEventSelectors calls that narrow the scope of what CloudTrail captures — removing S3 Data Events or management events from specific services — are a softer form of the same evasion technique. Alert on all three events with P1 severity and require immediate analyst acknowledgment.

Other audit tampering events to monitor: DeleteLogGroup and DeleteLogStream in CloudWatch Logs (where CloudTrail typically delivers logs), PutBucketLifecycle on the CloudTrail delivery S3 bucket (setting short retention to auto-delete evidence), and any modifications to the CloudTrail S3 bucket policy that could allow evidence deletion.

Cross-Account and Multi-Region Monitoring

Enterprise AWS environments typically use AWS Organizations with dozens or hundreds of accounts. This creates a monitoring challenge: security events in a rarely-used sandbox account, a legacy workload account, or a newly created account for a new product team will fall outside your monitoring if you've only set up CloudTrail in your production accounts.

The recommended architecture is an organization-level CloudTrail trail configured in AWS Organizations, which automatically captures management events from all member accounts and all regions, delivering to a centralized S3 bucket in a dedicated security/logging account. This account should have strict policies preventing anyone except the central security team from modifying or deleting logs.

Key cross-account monitoring patterns: AssumeRole calls from principals in one account into roles in another account (especially if the source account is not your standard production or deployment accounts), and API calls from IAM users in unexpected regions (most organizations have predictable regional footprints — API activity in ap-southeast-2 from a team that only uses us-east-1 is worth investigating).

Building CloudTrail Alerts: Best Practices

Several principles reduce false positives and increase detection fidelity in CloudTrail alerting:

  • Exclude known automation principals explicitly: Your CI/CD pipeline IAM roles, CloudFormation service roles, and auto-scaling service-linked roles will trigger many of the patterns above legitimately. Maintain an allow-list of automation principals and exclude their activity from detection logic — but monitor any changes to that allow-list itself.
  • Use CloudTrail userIdentity fields, not just eventName: The same eventName can be legitimate or suspicious depending on who is calling it. A CreateUser call from your account provisioning Lambda is expected; the same call from an IAM user that has never created IAM entities before is not.
  • Correlate across time windows, not single events: Most meaningful attacks are sequences of events, not single API calls. Build detections that look for event sequences: GetCallerIdentity (reconnaissance) followed by ListBuckets followed by GetObject (data discovery and exfiltration).
  • Alert on errorCode as well as success: AccessDenied events at scale are a signal that someone is trying to do something they're not authorized to do. A pattern of AccessDenied responses on IAM and S3 APIs from a single principal indicates they're probing your permission boundaries.
  • Treat off-hours activity from privileged principals differently: Administrative API calls from your most powerful IAM roles at 3 AM on a Sunday deserve more scrutiny than the same calls during business hours.

How ZonForge Sentinel Processes AWS CloudTrail at Scale

ZonForge Sentinel's AWS CloudTrail monitoring integration handles the ingestion, normalization, and detection pipeline so your team doesn't have to build it from scratch. The platform connects to your organization-level CloudTrail via S3 event notifications or direct CloudWatch Logs integration, normalizes events into the ZonForge schema, and applies the detection rule library immediately.

The pre-built AWS detection rules in ZonForge Sentinel cover all five critical event categories described in this guide — authentication anomalies, privilege escalation sequences, data access patterns, infrastructure changes, and audit trail tampering. Each rule includes tuning parameters that let you adjust sensitivity per environment: what constitutes "unusual" GetObject volume in a data analytics environment is very different from a web application backend.

Crucially, ZonForge Sentinel's behavioral baselining extends to CloudTrail: the platform learns which IAM principals call which APIs in which regions at what times of day, so anomaly detection is calibrated to your actual environment rather than industry-generic thresholds. A spike in S3 API calls that represents normal behavior for your data pipeline does not trigger an alert — but the same spike from an IAM user that typically only performs console logins absolutely does.

5 Highest-Priority CloudTrail Event Types to Alert On

🛑
cloudtrail:StopLogging / DeleteTrail
Any call to disable or delete CloudTrail logging must be a P1 alert. This is an attacker covering their tracks before a high-noise operation. There is no legitimate reason to stop logging in a production environment outside of an approved change window.
⚠️
iam:AttachUserPolicy with AdministratorAccess
Attaching the AWS-managed AdministratorAccess policy directly to an IAM user grants unrestricted access to every service. This is the fastest privilege escalation path in AWS and should trigger immediate investigation whenever it occurs outside your IaC pipeline.
🔗
sts:AssumeRole — Cross-Account Chain
Multi-hop AssumeRole sequences that traverse more than two accounts, or AssumeRole calls from IAM users (rather than roles) into cross-account roles, indicate lateral movement. Track the full assumption chain, not just individual events.
🔑
secretsmanager:GetSecretValue — Bulk Access
A principal accessing more than five distinct secrets within a short time window is systematically harvesting credentials. This is a high-confidence exfiltration indicator, especially when the principal doesn't normally access those secrets.
👤
iam:CreateAccessKey — Outside Provisioning
Creating a new access key for an existing IAM user outside of your standard provisioning workflow creates a persistent backdoor that survives password resets. Alert on any CreateAccessKey call for privileged users or the root account.

Conclusion: AWS CloudTrail Monitoring That Scales

AWS CloudTrail monitoring is not a checkbox exercise. Enabled CloudTrail without effective detection logic is just storage costs without security value. The organizations that catch cloud breaches early are the ones that have made deliberate choices about which events to alert on, built correlation logic that surfaces attacker behavior patterns rather than individual API calls, and connected their CloudTrail data to a platform that can apply behavioral context at scale.

Start with the five highest-priority event categories: authentication and access anomalies, privilege escalation, data access at scale, infrastructure changes, and — with highest urgency — audit trail tampering. Build detection on event sequences and behavioral baselines, not raw event volume. And make certain that your CloudTrail coverage is multi-region and organization-wide, so attackers can't simply operate in a region or account you're not watching.

ZonForge Sentinel's pre-built AWS detection rule library gives security teams a production-ready starting point — so the question isn't how to build the detection logic, but how to tune it to your specific environment.

Frequently Asked Questions

What is AWS CloudTrail and what does it log? ▼

AWS CloudTrail is a service that logs every API call made to your AWS account, recording the caller identity, the API action, timestamp, request parameters, and response. It captures Management Events (control plane operations like creating or modifying resources), Data Events (object-level operations like S3 GetObject, enabled separately), and Insights Events (anomalous API volume patterns). CloudTrail is the foundational audit log for AWS security monitoring.

Which CloudTrail events should I alert on first? ▼

Start with the highest-confidence, lowest-noise events: cloudtrail:StopLogging and DeleteTrail (P1 — always alert), iam:AttachUserPolicy with AdministratorAccess (privilege escalation), iam:CreateAccessKey for privileged users (backdoor creation), and any AssumeRole activity that crosses more than two accounts. These events have very few legitimate triggers in a well-managed environment and very high attacker relevance.

How do I detect privilege escalation in AWS? ▼

Monitor IAM management events including AttachUserPolicy, AttachRolePolicy, PutUserPolicy, PutRolePolicy, CreateUser, CreateRole, and UpdateAssumeRolePolicy. Build detection logic that flags policy attachments granting administrative permissions (iam:*, AdministratorAccess, or s3:*), new IAM entities created outside your IaC pipeline, and trust policy modifications that expand who can assume a role. Correlate these events with the calling principal's behavioral baseline — an IAM user who has never previously called IAM APIs suddenly doing so is significant.

Can CloudTrail detect data exfiltration? ▼

Yes, but only if you enable Data Events for the relevant S3 buckets and Secrets Manager. Without Data Events, CloudTrail only captures management-plane operations, not actual data access. With Data Events enabled, you can detect bulk S3 GetObject calls (a pattern of mass downloads), GetBucketPolicy reconnaissance, and bulk GetSecretValue calls against Secrets Manager. The key is baselining normal access patterns per principal and alerting on deviations rather than absolute thresholds.

What is the difference between CloudTrail and AWS GuardDuty? ▼

CloudTrail is a raw audit log service — it records every API call and delivers the data to S3 or CloudWatch Logs. GuardDuty is a managed threat detection service that analyzes CloudTrail logs (plus VPC Flow Logs and DNS logs) using AWS's own machine learning models to identify suspicious patterns. GuardDuty provides a useful baseline of automated detection, but it uses fixed models that AWS controls, covers a limited set of threat patterns, and doesn't allow you to build custom detections or correlate with your non-AWS data sources. CloudTrail data fed into a SIEM or platform like ZonForge Sentinel gives you full control over your detection logic.