Defender For Cloud Hardening
vinayaklatthe/microsoft-security-skills
Guidance for Microsoft Defender for Cloud — cloud security posture management (CSPM) and cloud workload protection (CWPP) across Azure, AWS, and GCP.
Investigate security incidents in Microsoft Azure (resource and subscription control plane) -- reconstruct attacker activity from the Azure Activity Log and resource/data-plane diagnostic logs…
$ npx skills add trilwu/secskills --skill investigating-azure-incidents -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install trilwu/secskills investigating-azure-incidents --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/trilwu/secskills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/secskills-defense/skills/investigating-azure-incidents .claude/skills/investigating-azure-incidents && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "investigating-azure-incidents" agent skill from https://github.com/trilwu/secskills/tree/main/secskills-defense/skills/investigating-azure-incidents into .claude/skills/investigating-azure-incidents/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "investigating-azure-incidents", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/trilwu/secskills/tree/main/secskills-defense/skills/investigating-azure-incidentsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add trilwu/secskills --skill investigating-azure-incidents -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install trilwu/secskills investigating-azure-incidents --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/trilwu/secskills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/secskills-defense/skills/investigating-azure-incidents .agents/skills/investigating-azure-incidents && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "investigating-azure-incidents" agent skill from https://github.com/trilwu/secskills/tree/main/secskills-defense/skills/investigating-azure-incidents into .agents/skills/investigating-azure-incidents/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "investigating-azure-incidents", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add trilwu/secskills --skill investigating-azure-incidents -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install trilwu/secskills investigating-azure-incidents --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/trilwu/secskills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/secskills-defense/skills/investigating-azure-incidents .cursor/skills/investigating-azure-incidents && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "investigating-azure-incidents" agent skill from https://github.com/trilwu/secskills/tree/main/secskills-defense/skills/investigating-azure-incidents into .cursor/skills/investigating-azure-incidents/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "investigating-azure-incidents", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/trilwu/secskills.git --path secskills-defense/skills/investigating-azure-incidents--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add trilwu/secskills --skill investigating-azure-incidents -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install trilwu/secskills investigating-azure-incidents --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/trilwu/secskills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/secskills-defense/skills/investigating-azure-incidents .gemini/skills/investigating-azure-incidents && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "investigating-azure-incidents" agent skill from https://github.com/trilwu/secskills/tree/main/secskills-defense/skills/investigating-azure-incidents into .gemini/skills/investigating-azure-incidents/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "investigating-azure-incidents", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install trilwu/secskills investigating-azure-incidentsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add trilwu/secskills --skill investigating-azure-incidents -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/trilwu/secskills.git skills-src && mkdir -p .github/skills && cp -r skills-src/secskills-defense/skills/investigating-azure-incidents .github/skills/investigating-azure-incidents && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "investigating-azure-incidents" agent skill from https://github.com/trilwu/secskills/tree/main/secskills-defense/skills/investigating-azure-incidents into .github/skills/investigating-azure-incidents/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "investigating-azure-incidents", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add trilwu/secskills --skill investigating-azure-incidents -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install trilwu/secskills investigating-azure-incidents --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/trilwu/secskills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/secskills-defense/skills/investigating-azure-incidents .opencode/skills/investigating-azure-incidents && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "investigating-azure-incidents" agent skill from https://github.com/trilwu/secskills/tree/main/secskills-defense/skills/investigating-azure-incidents into .opencode/skills/investigating-azure-incidents/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "investigating-azure-incidents", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
investigating-azure-incidentsInvestigate security incidents in Microsoft Azure (resource and subscription control plane) -- reconstruct attacker activity from the Azure Activity Log and resource/data-plane diagnostic logs…
Investigating Azure Incidents is an agent skill from trilwu/secskills. Investigate security incidents in Microsoft Azure (resource and subscription control plane) -- reconstruct attacker activity from the Azure Activity Log and resource/data-plane diagnostic logs, anchor the investigation on the identity that made the calls (a user, service principal, or managed identity), trace privilege escalation through role assignments, hunt managed-identity token abuse and VM run-command code execution, and detect storage or Key Vault data theft while correlating back to Entra sign-in logs…
Its SKILL.md is about 5.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in DevOps & Cloud, covering Secrets management, Red teaming and adversary simulation and Security operations. It works with Microsoft Azure and Microsoft Defender. The repository describes itself as: Transform Claude Code into your personal security engineer. The licence is MIT.
Read from SKILL.md and the folder at commit ca53957. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
azFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use az, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Investigating Azure Incidents loads about 5.3k tokens when it runs. Until then it costs about 195 tokens; SKILL.md has 2,166 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from trilwu/secskills at commit ca53957, republished under its MIT licence (© trilwu). 2,166 words, ~5,349 tokens.
.claude/skills/investigating-azure-incidents/SKILL.md (or your agent's skills folder).In Azure the control plane logs almost everything through Azure Resource Manager, so an incident is reconstructed from the Activity Log and the resource/data-plane logs, anchored on the identity that made the calls -- a user, a service principal, or a managed identity. The recurring trap is that identity lives in Entra while the damage lives in the subscription: you must correlate across both planes, because the Activity Log tells you what was done to a resource but the Entra sign-in log tells you who held the token and from where.
AccessDenied storm that looks like enumerationinvestigating-m365-entrainvestigating-aws-incidentsinvestigating-gcp-incidentsattacking-entra-idattacking-eks-gke-aks; for defending the cluster, defending-kubernetesresponding-to-incidentsEstablish what you have before you query. Missing logs are a finding, not a reason to skip the question.
| Source | Scope | Retention (default) | What it holds |
|---|---|---|---|
| Azure Activity Log | Subscription control plane | 90 days unless exported | Every ARM write/action/delete: roleAssignments, runCommand, listKeys, deployments |
| Resource / diagnostic logs | Per-resource data plane | None until enabled | Blob reads, Key Vault SecretGet, NSG flow -- only if a diagnostic setting ships them to a workspace |
| Log Analytics workspace | Wherever logs are shipped | Workspace-configured | AzureActivity, AzureDiagnostics, StorageBlobLogs, AZKVAuditLogs tables |
| Entra sign-in / audit logs | Tenant identity plane | 30 days (export for more) | Who authenticated the SP/MI, from where, CA/MFA context, credential adds |
| Microsoft Sentinel | Whatever it ingests | Per-table | Correlated hunting across all of the above, incidents, watchlists |
The trap: the Activity Log is a control-plane record. Data-plane operations -- reading a blob, fetching a Key Vault secret, querying a Cosmos DB -- are not in the Activity Log at all. They exist only if a diagnostic setting was configured on that resource before the incident. Absence in the Activity Log is never evidence that data was untouched (see Rationalizations).
Confirm what is actually being logged before you trust a gap: az monitor diagnostic-settings subscription list (is the Activity Log exported beyond 90
days?) and az monitor diagnostic-settings list --resource <id> (does this
storage account / vault ship data-plane logs anywhere?).
Three moves, in order: scope the caller identity, pull its recent activity, preserve before you contain.
Scope the caller identity. Resolve the report -- a Defender alert, a
billing spike, a suspicious deployment -- to the identity in the caller /
identity fields of the Activity Log. That principal (a UPN, or a service
principal / managed identity object ID) is the anchor for everything else.
# Everything a specific caller did across the subscription control plane
az monitor activity-log list --caller attacker@contoso.com \
--start-time 2026-07-01T00:00:00Z -o json
# Who holds what right now -- role assignments are the escalation surface
az role assignment list --all --include-inherited \
--query "[?roleDefinitionName=='Owner' || roleDefinitionName=='User Access Administrator']" -o tablePull recent activity from KQL if a Log Analytics workspace exists -- it is faster and richer than the CLI once you are past the first look:
AzureActivity
| where TimeGenerated > ago(7d)
| where Caller == "attacker@contoso.com"
| project TimeGenerated, OperationNameValue, ActivityStatusValue,
CallerIpAddress, ResourceProviderValue, ResourceId, CorrelationId
| order by TimeGenerated ascPreserve, then contain. An attacker who sees a role assignment revoked mid-operation will burn persistence you have not found. For anything but active, ongoing damage: snapshot disks, export the relevant logs, map persistence, then contain everything at once. Live mining or active exfil is the exception -- stop the damage and accept the trade.
The AzureActivity table is the authoritative control-plane record. Learn its
fields:
OperationNameValue -- the ARM operation, e.g.
Microsoft.Authorization/roleAssignments/write. This is what you hunt on.Caller -- the UPN or object ID that made the call.CallerIpAddress -- external IPs on a managed identity that should only
call from inside Azure are the IMDS-theft signature (below).ResourceProviderValue -- Microsoft.Compute, Microsoft.Storage,
Microsoft.KeyVault, Microsoft.Authorization.ActivityStatusValue -- a run of Failure (often AuthorizationFailed)
is enumeration: the attacker mapping what the stolen principal can reach.CorrelationId -- ties the sub-operations of one logical action together;
pivot on it to expand a single suspicious event into its full sequence.// Enumeration storm -- authorization failures by operation
AzureActivity
| where TimeGenerated > ago(7d)
| where ActivityStatusValue == "Failure"
| summarize n = count() by Caller, OperationNameValue, CallerIpAddress
| order by n desc
// Expand one event's full correlated sequence
AzureActivity
| where CorrelationId == "<correlation-id>"
| project TimeGenerated, OperationNameValue, ActivityStatusValue, ResourceId
| order by TimeGenerated ascGrep the timeline for these OperationNameValue patterns -- they are the shape
of nearly every Azure intrusion.
Microsoft.Authorization/roleAssignments/write granting Owner,
Contributor, or User Access Administrator (UAA can grant itself
anything). Watch for custom-role creation
(Microsoft.Authorization/roleDefinitions/write) that hides * actions
behind an innocuous name.Caller from an unexpected CallerIpAddress.Microsoft.Compute/virtualMachines/runCommand/action and Custom Script
Extension (Microsoft.Compute/virtualMachines/extensions/write installing
CustomScript) run attacker code as SYSTEM/root without any RDP/SSH.Microsoft.Web/sites (App Service /
Functions), Automation Runbooks, and Logic Apps as scheduled backdoors
that re-mint credentials or re-grant roles.AzureActivity
| where TimeGenerated > ago(14d)
| where OperationNameValue has_any (
"roleAssignments/write", "roleDefinitions/write",
"runCommand/action", "virtualMachines/extensions/write")
| project TimeGenerated, Caller, CallerIpAddress, OperationNameValue, ResourceId
| order by TimeGenerated ascThe CLI equivalent filters the same operations:
az monitor activity-log list --start-time <t> --query "[?contains(operationName.value,'roleAssignments/write')]".
The Activity Log names the principal but not the human behind it. Map the
service principal or managed identity object ID back to Entra to see the
authentication context -- this is the cross-plane step, and it usually means
opening investigating-m365-entra.
// Where did this service principal / managed identity actually sign in from?
AADServicePrincipalSignInLogs
| where ServicePrincipalId == "<sp-or-mi-object-id>"
| where TimeGenerated > ago(30d)
| project TimeGenerated, AppId, ServicePrincipalName, IPAddress,
ResourceDisplayName, ResultType
| order by TimeGenerated asc
// For an interactive user: sign-ins around the abusive Activity Log calls
SigninLogs
| where UserPrincipalName == "attacker@contoso.com"
| project TimeGenerated, IPAddress, Location, AppDisplayName,
ConditionalAccessStatus, AuthenticationRequirement, ResultTypeCheck conditional-access status and whether MFA was actually satisfied -- a service principal bypasses interactive CA entirely, which is exactly why attackers pivot to SP/MI credentials.
The Azure analogue of AWS IMDS theft: an SSRF or foothold on a VM / App Service reads the Instance Metadata Service to lift the managed identity's token, then uses it elsewhere.
http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/The signature is unmistakable: the managed identity's calls appear in
AzureActivity from a CallerIpAddress that is not the resource's own
outbound IP. The token is minted for that resource, so any call from an
unrelated or external IP means the token left the box.
AzureActivity
| where TimeGenerated > ago(7d)
| where Caller == "<managed-identity-object-id>"
| summarize ops = count() by CallerIpAddress, OperationNameValue
| order by ops desc // flag IPs that are not the VM's egressCorrelate the theft window with NSG flow logs (if enabled) for the outbound
SSRF and the reuse source. On App Service the token endpoint uses
IDENTITY_ENDPOINT with a header secret rather than 169.254.169.254 -- the same
off-resource-use logic applies.
Defender for Cloud is a starting pistol, not the investigation. Each alert maps to a hypothesis you confirm in the Activity Log and diagnostic logs.
| Alert (representative) | Implication |
|---|---|
Crypto-mining / Digital currency mining behavior | A VM is talking to a mining pool -- a principal with deploy rights was compromised. |
Anomalous resource deployment / unusual RunInstances-equivalent | Attacker spinning up compute, often in an unused region. |
| Suspicious sign-in / access from a Tor or known-malicious IP | The stolen principal called from attacker infrastructure. |
| Managed identity / metadata credential exfiltration | The IMDS theft above -- confirm off-resource token use. |
| Access from anomalous location on a storage account / Key Vault | Data-plane access from an unexpected geography. |
az security alert list -o table
az security alert show --location <loc> -n <alert-name> -g <rg>An alert older than the 90-day Activity Log window still carries the principal and IPs -- pivot on those even after the raw events have aged out.
Microsoft.Storage/storageAccounts/listKeys/action and regenerateKey
hand the attacker a full-access key that works outside RBAC and outside the
Activity Log thereafter.listAccountSas / listServiceSas produces a
time-boxed exfil URL that leaves no per-object control-plane trail.StorageBlobLogs shows GetBlob volume by caller.Microsoft.Compute/snapshots/write then /beginGetAccess/action mints a SAS
download URL for a full disk image.Microsoft.KeyVault/vaults/read (VaultGet)
to enumerate, then data-plane SecretGet reads (in AzureDiagnostics /
AZKVAuditLogs, only if logging was enabled).// Control-plane data-theft indicators
AzureActivity
| where TimeGenerated > ago(14d)
| where OperationNameValue has_any (
"storageAccounts/listKeys", "storageAccounts/regenerateKey",
"listAccountSas", "listServiceSas",
"snapshots/write", "snapshots/beginGetAccess")
| project TimeGenerated, Caller, CallerIpAddress, OperationNameValue, ResourceId
// Key Vault data-plane reads -- only present if diagnostics were on beforehand
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.KEYVAULT"
| where OperationName in ("SecretGet", "KeyGet", "VaultGet")
| project TimeGenerated, CallerIPAddress, identity_claim_upn_s, OperationName, id_sA capable attacker tries to blind you. The key operations to hunt -- and their defeat:
Microsoft.Insights/diagnosticSettings/delete stops data-plane logs from
reaching the workspace.The defeat is the same shape as an AWS org trail: a tenant-level export to a
central, locked destination the compromised principal cannot reach --
immutable-storage (WORM/legal-hold) blob export, or Sentinel ingestion in a
segregated workspace with delete protection and resource locks. When export is
immutable, the attacker's own diagnosticSettings/delete call is logged there
before it takes effect, so cleanup becomes evidence rather than a gap. If you
lack it, record the blind window as a scoping limitation.
AzureActivity
| where TimeGenerated > ago(14d)
| where OperationNameValue has_any (
"diagnosticSettings/delete", "Microsoft.Insights/diagnosticSettings/write")
| project TimeGenerated, Caller, CallerIpAddress, OperationNameValue, ResourceIdSnapshot the involved VMs' disks before touching them, and lock the snapshots so they cannot be deleted.
az snapshot create -g <rg> -n IR-2026-042-osdisk \
--source <os-disk-id> --tags case=IR-2026-042 legal-hold=true
az lock create --name IR-2026-042-hold --lock-type CanNotDelete \
--resource-group <rg> --resource-name IR-2026-042-osdisk \
--resource-type Microsoft.Compute/snapshotsExport the relevant Activity Log window before it ages out of 90-day retention -- run the CLI/KQL and save the JSON to a preserved, locked store.
Apply resource locks / legal hold to evidence artifacts, and involve legal before collection if the incident may become a regulatory or litigation matter.
Do it all at once, after scoping. Partial containment alerts the attacker.
Disable or rotate the compromised principal. For a service principal / app, disable it and roll its credentials:
az ad sp update --id <app-id> --set accountEnabled=false
# remove attacker-added secrets/certs
az ad app credential reset --id <app-id>For a user, disable the account and force a reset in Entra, then revoke sessions (below).
Revoke role assignments the attacker granted:
az role assignment delete --assignee <object-id> \
--role Owner --scope /subscriptions/<sub-id>Revoke sessions / refresh tokens so existing tokens die (an Entra action
-- Revoke-MgUserSignInSession / az ad user ...), because disabling alone
leaves issued tokens valid up to an hour.
Isolate the VM by swapping its NSG to a deny-all outbound rule rather than
deleting it, so disk and memory survive for analysis (az network nsg rule create ... --access Deny --direction Outbound --protocol '*').
Rotate storage keys and regenerate SAS -- renewing both keys invalidates every outstanding SAS and access key at once:
az storage account keys renew --account-name <acct> -g <rg> --key primary
az storage account keys renew --account-name <acct> -g <rg> --key secondaryRemove attacker persistence -- delete backdoor Functions/App Service, Automation runbooks, custom roles, and resource-scoped role assignments -- only after they are documented.
Reach for Azure CLI and KQL in Log Analytics / Sentinel for the investigation itself; MicroBurst and ROADtools for understanding the TTPs an attacker would run (and what each leaves behind); and Microsoft's Unified Audit correlation when the Azure story crosses into M365.
CallerIpAddress is precisely the signature to hunt.runCommand on VMs, read storage keys, and mint SAS tokens -- code execution
and data theft without ever touching role assignments. Trace what the role can
reach; do not assume.roleAssignments/write. Mining is the visible symptom, not
the scope.investigating-m365-entra -- the sibling identity-plane skill; open it to correlate the SP/MI back to Entra sign-ins and auditinvestigating-aws-incidents -- the sibling cloud-IR skill when the incident is in AWSattacking-entra-id -- the offensive side; how these tenant/subscription TTPs are executedattacking-eks-gke-aks -- when the pivot is specifically into AKS / Kubernetesresponding-to-incidents -- the general IR process, evidence handling, and host-level responsereporting-security-findings -- structuring the incident narrative and deliverableaz) -- drive the control plane and pull the Activity LogAzureActivity, AzureDiagnostics, and sign-in tables© trilwu, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in secskills-defense/skills/investigating-azure-incidents of trilwu/secskills.
Open the folder on GitHubat commit ca53957
Investigating Azure Incidents next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Investigating Azure Incidents this skilltrilwu/secskills | 157 | — | ~5.3k | Automated safety check: Pass | MIT | |
| Defender For Cloud Hardeningvinayaklatthe/microsoft-security-skills | 175 | — | ~1.9k | Automated safety check: Pass | MIT | |
| Deploying Cloud Deception With Decoy Resourcesmukul975/Anthropic-Cybersecurity-Skills | 34k | — | ~2.8k | Automated safety check: Pass | Apache-2.0 | |
| Detecting Compromised Cloud Credentialsmukul975/Anthropic-Cybersecurity-Skills | 34k | — | ~3.9k | Automated safety check: Pass | Apache-2.0 | |
| Implementing Azure Defender For Cloudmukul975/Anthropic-Cybersecurity-Skills | 34k | — | ~3.1k | Automated safety check: Pass | Apache-2.0 | |
| Azure Kusto Irqlmicrosoft/GitHub-Copilot-for-Azure | 255 | — | ~2.6k | Automated safety check: Pass | MIT |
vinayaklatthe/microsoft-security-skills
Guidance for Microsoft Defender for Cloud — cloud security posture management (CSPM) and cloud workload protection (CWPP) across Azure, AWS, and GCP.
mukul975/Anthropic-Cybersecurity-Skills
Deploy cloud-native deception across AWS, Azure, and GCP using decoy (honey) resources whose only purpose is to generate a high-fidelity alert the instant an attacker touches them: canary IAM access…
mukul975/Anthropic-Cybersecurity-Skills
Detect compromised cloud credentials across AWS, Azure, and GCP by analyzing anomalous API activity, impossible-travel patterns, and credential-stuffing indicators using GuardDuty, Microsoft…
mukul975/Anthropic-Cybersecurity-Skills
Enable Microsoft Defender for Cloud (CSPM + CWPP) across VMs, containers, SQL, storage, and Key Vault, using Azure Policy for evaluation, Log Analytics for telemetry, Azure Arc for hybrid coverage…
microsoft/GitHub-Copilot-for-Azure
Compose IRQL (Incident Response Query Language) queries for Kusto cybersecurity investigations.
vinayaklatthe/microsoft-security-skills
Guidance for designing and operating Microsoft Sentinel, the cloud-native SIEM and SOAR delivered through the Defender portal.
trilwu/secskills
Audit source code for exploitable vulnerabilities using threat-model-driven review, taint tracing, invariant checking, and variant analysis.
trilwu/secskills
Perform OSINT, subdomain enumeration, port scanning, web reconnaissance, email harvesting, and cloud asset discovery for initial access.
trilwu/secskills
Assess and harden LLM applications and agentic systems against prompt injection, tool misuse, excessive agency, memory poisoning, RAG data leakage, and model supply-chain risk, mapped to the OWASP…
trilwu/secskills
Reverse engineer compiled binaries, firmware, and mobile app packages using triage, static disassembly, decompilation, and dynamic instrumentation.
trilwu/secskills
Reverse engineer Go binaries by recovering function names and types from pclntab and moduledata using GoReSym, redress, and IDA/Ghidra Go plugins, and by reading Go's non-standard calling…
trilwu/secskills
Analyze iOS applications at the binary level — decrypting FairPlay-protected IPAs with frida-ios-dump or bagbak, inspecting Mach-O load commands, recovering Objective-C headers with class-dump, and…
Works with
Categories
Investigate security incidents in Microsoft Azure (resource and subscription control plane) -- reconstruct attacker activity from the Azure Activity Log and resource/data-plane diagnostic logs…. Investigating Azure Incidents is an agent skill from trilwu/secskills.
Investigating Azure Incidents fits situations like: responding to a suspected Azure resource compromise; anomalous Azure Activity Log entries; A Microsoft Defender for Cloud alert; managed-identity.
Run `npx skills add trilwu/secskills --skill investigating-azure-incidents -a claude-code`. Or copy the skill folder (secskills-defense/skills/investigating-azure-incidents in trilwu/secskills) into .claude/skills/investigating-azure-incidents in your project. Claude Code loads it when a task matches its description.
Run `npx skills add trilwu/secskills --skill investigating-azure-incidents -a codex`. Or copy the skill folder (secskills-defense/skills/investigating-azure-incidents in trilwu/secskills) into .agents/skills/investigating-azure-incidents in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add trilwu/secskills --skill investigating-azure-incidents -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/investigating-azure-incidents, .gemini/skills/investigating-azure-incidents, .github/skills/investigating-azure-incidents and .opencode/skills/investigating-azure-incidents in your project.
Going by SKILL.md and its folder, Investigating Azure Incidents needs the command-line tools its instructions call (az).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Investigating Azure Incidents is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.3k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Investigating Azure Incidents: Defender For Cloud Hardening (vinayaklatthe/microsoft-security-skills, 175 stars), Deploying Cloud Deception With Decoy Resources (mukul975/Anthropic-Cybersecurity-Skills, 34k stars), Detecting Compromised Cloud Credentials (mukul975/Anthropic-Cybersecurity-Skills, 34k stars) and Implementing Azure Defender For Cloud (mukul975/Anthropic-Cybersecurity-Skills, 34k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
trilwu (a GitHub user) maintains it in trilwu/secskills, which has 157 GitHub stars. The repository holds 50 skills in this directory. The repository was last updated on September 4, 2026.
Source: trilwu/secskills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.