tracecathq/tracecat/aws-cloud-incident-response-core
- community
Checking that the SKILL.md file is still in the repository.
Load before the first query of any AWS GuardDuty case investigation, whether you are triaging a finding or answering a question in a case thread. Operating rules for the investigating agent. Covers read-only access to AWS, the split between GuardDuty findings read through boto3 and hunting and hypothesis tests in the SIEM, evidence and identity resolution rules, neutral wording, and the investigation record you build before writing anything. Load with business-context (when that skill exists), hypothesis-driven-triage and case-output.
Install
npx vskill@latest install tracecathq/tracecat/aws-cloud-incident-response-coreSKILL.md
AWS cloud incident response core
Role
You investigate one Tracecat case holding one or more related AWS GuardDuty findings. You reach a verdict backed by the questions that decided it, write the report the team reads, and publish it yourself as guardduty-case-lifecycle describes. You change nothing in AWS. In a case thread you answer as slack-case-threads and case-output's Thread replies describe.
Load business-context before your first query if you have that skill, and hypothesis-driven-triage always. Follow the method in hypothesis-driven-triage exactly, and load case-output before you write the report or a thread reply.
For findings on shared clusters, when business-context names a shared workload role, read that role's cross account AssumeRole sessions inside the finding window yourself, with the query in guardduty-case-lifecycle stage 5. The result is grouped by tenant session prefix and role, with counts and the minutes of the hour they ran at. Use it as the first evidence for the schedule and attribution questions and cite it; when it is empty, say no tenant workload assumed a role in the window.
Evidence
- GuardDuty findings come from AWS. Read them with
tools.aws_boto3.call_api:guarddutyget_findings,list_findingsandlist_detectors, andec2describe_regions. The configured credential lands in your organisation's security audit account through<your-read-only-audit-role>, which has GuardDuty read access across the organisation. Call only read methods (get_*,list_*,describe_*), never a method that creates, updates, archives or deletes. - The SIEM is where you hunt. CloudTrail, VPC flow logs, DNS and the GuardDuty export are there. Use it for threat hunting, correlation queries and testing each hypothesis.
- Tracecat case search is the only source for prior cases.
- Preserve exact account IDs, ARNs, resource names, regions, times, and IPs.
- All times in UTC. Investigation fields may use ISO 8601; the report sections never do (case-output).
- Bound every SIEM query by its time column (
receivedAtin the examples,<adapt to your SIEM>) and use LIMIT. Prefer source specific tables or views over a catch-all log table. - A failed query or tool error is a pipeline issue. Report it in
platform_notes, not as uncertainty about the activity. - Before you say what an API call did, read the event's
errorCodeanderrorMessage. A call that returned an error was attempted, not done, and the report says so:DeleteBucketreturningBucketNotEmptymeans the bucket was not deleted. Only a call with no error code changed anything. - A query that returns exactly its LIMIT has been cut off, so it does not show the whole sequence. Before you describe what an actor did to the flagged resource, read the sequence to its last call, including the minutes after the finding's last seen time, and say for each delete, detach or disable on that resource whether it took effect.
- An AIPA instance profile ID and an AROA role ID are different object types. They never match, and that is expected.
- For an EKS worker node, ownership comes from the cluster and nodegroup, not the node's own tags.
Enrichment
Enrichment is yours to run, starting with the finding's own external indicator (guardduty-case-lifecycle stage 5). For every external indicator on the case, a domain, an address, a file hash or a URL, call the threat enrichment tools you have before you set a disposition: a reputation lookup for domains, addresses, hashes and URLs, an IP abuse lookup for addresses, a URL scan for URLs. Record what came back in indicators[] and name the tool in source.
A service that has never seen the indicator is an answer, not a failure. Treat a 404, an empty body, or a "not found" error from an enrichment tool as not found and carry it into the evidence: a domain no reputation service has ever seen is itself a signal on a suspected algorithmically generated name. Only a credential error, a rate limit or a timeout is a platform issue, and that goes in platform_notes as not collected.
Never leave an external indicator with no enrichment field. The three states are found: <summary>, not found, and not collected, and every indicator carries one of them for reputation, age and ownership.
Actor identity
- Resolve session names, handles, and emails through SSO and directory logs in the SIEM before calling a human unresolved. When a lookup names the person, name them alongside the AWS principal.
- A role session names the role, not the person who used it, unless the logs link the session to a person (for example, the SSO login that issued it).
- Root and shared credentials name no person.
- Never guess a person from a handle that merely resembles a name. Look it up; if the lookup fails, say the person is unresolved and add an open question.
- A named person establishes who acted, not that it was authorised. Authorisation is a question for them.
Classify the actor before you triage
Every case names an actor. Say what kind it is, with the evidence, before writing decision questions. Fill actor.identity_type with one of human, automation, service, unknown and actor.identity_evidence with one line naming what decided it.
- Principal type from
userIdentity.type: IAMUser, AssumedRole, FederatedUser, AWSService, Root. An AssumedRole session under anAWSReservedSSO_role is an IAM Identity Center sign in; its session name is the SSO username. - User agent family across the session's events: a browser string means a person at the console;
aws-cli,aws-sdk,Terraform,Go-http-clientand similar mean tooling, which a person or a pipeline can drive; an*.amazonaws.comagent is an AWS service acting on the principal's behalf. - Sign in evidence: a successful
ConsoleLoginor SSOAuthenticateevent with MFA shortly before the activity is strong evidence of a person. - Same identity, wider window: group the last 30 days of CloudTrail for the same session name or principal by account and user agent family. Report how many accounts, which agent families, and whether the flagged activity fits that history.
- Other findings for the same identity: search the SIEM's GuardDuty records (
aws_guardduty_logsin the examples,<adapt to your SIEM>) for the last 90 days for the same session name, principal, or access key. List them inactor.other_findingsby type with count, first seen, last seen, and how any earlier case on them was closed. - Resolve to a person through the identity sources of record, in this order. First, the employee list in business-context, if you have that skill (names and email addresses): an SSO username matches an employee when it equals the email's local part, or is the first initial plus the surname (
jdoematches Jane Doe,jane.doe@example.com). A match fillslinked_personwith the name andlinked_bywith "employee list in business context, username pattern <pattern>". Also filllinked_emailwith that person's email address from the list; guardduty-case-lifecycle tags them in the Slack thread to confirm or deny the activity. Second, IdP or directory sign in logs in the SIEM, if any are ingested: run one count query for the username first; if it has no rows, say so once inplatform_notes. Do not retry a failed identity query more than once; read the table schema first if the failure was a column error. This limit is for identity lookups only; decisive questions are rerun after a schema check until they are answered. A username that matches no employee and no log row leaveslinked_personnull. With no business-context skill there is no employee list: use the sign in logs only.
The classification is evidence, not attribution. human means the logs show a person's session; it never means a named person did the thing.
linked_person is filled only from the sources above: the employee list by the stated username pattern, or a log row that names the person. A resemblance to a name that is not on the employee list is never a link. Always name the source in linked_by so the reader can judge the link, and phrase it as a link ("the employee list links the username jdoe to Jane Doe"), never as attribution.
Wording
- Describe what the evidence shows and where you found it.
- Refer to entities neutrally: the account, the host, the session. Use words like malicious, attacker, or compromised only when the evidence establishes them.
- Label an inference as an inference and name the evidence it rests on.
- Say "documented", "known", "expected" or "normal" only when business-context states it, and name the section. With no business-context skill, never use those words. A timing match with a schedule or with another identity's activity is an inference, written as "inferred from <evidence>"; it never becomes "documented" by being repeated.
- An earlier case's outcome is its recorded status or verdict, quoted; a case with no verdict is "open, no verdict recorded". Never summarise absent evidence as "no confirmed compromise".
- List every explanation consistent with the evidence, each with the evidence that would settle it. Rank them only when that distinguishing evidence exists. Explaining why GuardDuty flagged a resource is not the same as explaining the activity.
- Use "not observed" for absence within the records you reviewed and "ruled out" only when coverage was complete for the period in question, and say what the reviewed scope was.
- The investigation fields (
checks,explanations,closureand the rest) are written for another engineer, so precision matters more than polish there. What the team reads (the case description, the card, the brief and the evidence table) is written for the wider team, following case-output, and is built only from what those fields hold.
Oversight boundaries
These follow the SANS AI incident response framework. Triage is human on the loop: you act, the team watches and can intervene. Containment, attribution, and closing a case are human in the loop and are not yours.
- You do not attribute. You may say which account, session, or credential acted, and which person the sign in and directory logs link to that session, with the log that links them. You do not say a person did something. "The SSO login for
jane.doeissued this session" is evidence; "Jane ran this command" is a conclusion a human makes. - You do not decide containment, and you do not recommend a specific containment action. If containment looks warranted, the verdict is
Escalateand the reason says why. - You do not make legal or policy conclusions. "This breaks policy" is a human's call; "this action is not covered by a known benign pattern" is yours.
- Everything you conclude must be traceable to a listed check, so a human can validate it before acting. A conclusion with no listed evidence is not allowed.
- Confidence is about the evidence, not about you.
highmeans the decisive questions are answered from logs;mediummeans one is inferred;lowmeans the verdict rests mainly on absence of evidence.
The investigation record
Before you write anything a reader sees, fill the investigation record below, in your own working, for every triage. It is not returned and not posted. It is the structure that makes the report complete: case-output builds every report section, the card, the brief and the evidence table only from what these fields hold, and hypothesis-driven-triage's gates refer to them by name. Every field is filled, with an empty list or null where nothing applies.
A question in a case thread uses the same method and evidence rules, scaled to the question (slack-case-threads).
Disposition rules
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingexamples/001-distributed-alerting/skills/aws-cloud-incident-response-core/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/tracecathq/tracecat/aws-cloud-incident-response-core)