Install any skill in seconds. Free to start, no credit card required.
Get Started Free →This skill instructs security practitioners on deploying Microsoft Defender for Cloud as a cloud-native application protection platform for Azure, multi-cloud, and hybrid environments. It covers enabling Defender plans for servers, containers, storage, and databases, configuring security recommendations, managing Secure Score, and integrating with the unified Defender portal for centralized threat management.
.claude/skills/securing-azure-with-microsoft-defender/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-14 | ✗→✓ | ▲ Improved | — | — |
| case-03 | ✗→✓ | ▲ Improved | — | — |
| case-15 | ✗→✓ | ▲ Improved | — | — |
| case-09 | ✗→✓ | ▲ Improved | — | — |
| case-18 | ✗→✓ | ▲ Improved | — | — |
Do not use for AWS-only environments (see implementing-aws-security-hub), for identity provider configuration (see managing-cloud-identity-with-okta), or for network-level firewall rule management (see implementing-cloud-waf-rules).
Activate Defender plans for each workload type: Servers, Containers, App Service, Storage, Databases, Key Vault, Resource Manager, and DNS. Each plan provides specialized threat detection and vulnerability assessment.
powershell# Enable Defender for Servers Plan 2 az security pricing create --name VirtualMachines --tier Standard --subplan P2 # Enable Defender for Containers az security pricing create --name Containers --tier Standard # Enable Defender for Storage with malware scanning az security pricing create --name StorageAccounts --tier Standard \ --extensions '[{"name":"OnUploadMalwareScanning","isEnabled":"True", "additionalExtensionProperties":{"CapGBPerMonthPerStorageAccount":"5000"}}]' # Enable Defender for Databases az security pricing create --name SqlServers --tier Standard az security pricing create --name CosmosDbs --tier Standard # Enable Defender for Key Vault az security pricing create --name KeyVaults --tier Standard # Verify all enabled plans az security pricing list --query "[?pricingTier=='Standard'].{Plan:name, Tier:pricingTier, SubPlan:subPlan}" -o table
Connect AWS accounts and GCP projects to Defender for Cloud for unified security posture management across cloud providers.
powershell# Create AWS connector for CSPM az security security-connector create \ --name aws-production-connector \ --resource-group security-rg \ --environment-name AWS \ --hierarchy-identifier "123456789012" \ --offerings '[{ "offeringType": "CspmMonitorAws", "nativeCloudConnection": {"cloudRoleArn": "arn:aws:iam::123456789012:role/DefenderForCloudRole"} }]' # Create GCP connector az security security-connector create \ --name gcp-production-connector \ --resource-group security-rg \ --environment-name GCP \ --hierarchy-identifier "my-gcp-project-id" \ --offerings '[{"offeringType": "CspmMonitorGcp"}]'
Analyze the Secure Score across all subscriptions. Each recommendation includes a risk priority based on asset exposure, internet exposure, and threat intelligence context.
powershell# Get current Secure Score az security secure-score list \ --query "[].{Name:displayName, Score:current, Max:max, Percentage:percentage}" -o table # List unhealthy recommendations sorted by severity az security assessment list \ --query "[?properties.status.code=='Unhealthy'].{Name:properties.displayName, Severity:properties.metadata.severity, Resources:properties.resourceDetails.id}" \ --output table # Get specific recommendation details az security assessment show \ --assessment-name "4fb67663-9ab9-475d-b026-8c544cced439" \ --query "{Name:properties.displayName, Description:properties.metadata.description, Remediation:properties.metadata.remediationDescription}"
Enable Just-In-Time VM access to reduce the attack surface by opening management ports only when needed, and deploy adaptive application controls to whitelist approved executables.
powershell# Enable JIT VM access policy az security jit-policy create \ --resource-group production-rg \ --location eastus \ --name default \ --virtual-machines '[{ "id": "/subscriptions/sub-id/resourceGroups/production-rg/providers/Microsoft.Compute/virtualMachines/web-server-01", "ports": [ {"number": 22, "protocol": "TCP", "allowedSourceAddressPrefix": "10.0.0.0/8", "maxRequestAccessDuration": "PT3H"}, {"number": 3389, "protocol": "TCP", "allowedSourceAddressPrefix": "10.0.0.0/8", "maxRequestAccessDuration": "PT1H"} ] }]' # Request JIT access az security jit-policy initiate \ --resource-group production-rg \ --location eastus \ --name default \ --virtual-machines '[{ "id": "/subscriptions/sub-id/resourceGroups/production-rg/providers/Microsoft.Compute/virtualMachines/web-server-01", "ports": [{"number": 22, "duration": "PT1H", "allowedSourceAddressPrefix": "203.0.113.10"}] }]'
Configure workflow automation to trigger Logic Apps or Azure Functions when security alerts are generated. Set up email notifications for Critical and High severity alerts.
powershell# Create workflow automation for high severity alerts az security automation create \ --name high-severity-alert-automation \ --resource-group security-rg \ --scopes '[{"description": "Production subscription", "scopePath": "/subscriptions/<sub-id>"}]' \ --sources '[{ "eventSource": "Alerts", "ruleSets": [{"rules": [{"propertyJPath": "Severity", "propertyType": "String", "expectedValue": "High", "operator": "Equals"}]}] }]' \ --actions '[{ "logicAppResourceId": "/subscriptions/<sub-id>/resourceGroups/security-rg/providers/Microsoft.Logic/workflows/alert-handler", "actionType": "LogicApp" }]' # Configure email notifications az security contact create \ --name default \ --email "soc-team@company.com" \ --alert-notifications "on" \ --alerts-to-admins "on"
Use the cloud security graph to visualize attack paths that adversaries could exploit to reach critical assets. Prioritize remediation based on actual exploitability rather than individual finding severity.
# Query attack paths via Resource Graph
az graph query -q "
securityresources
| where type == 'microsoft.security/attackpaths'
| extend riskLevel = properties.riskLevel
| extend entryPoint = properties.attackPathDisplayName
| where riskLevel == 'Critical'
| project entryPoint, riskLevel, properties.description
| limit 20
"| Term | Definition | |------|------------| | Secure Score | A numerical measure of an organization's security posture based on the percentage of implemented security recommendations, scored per subscription and aggregated at the management group level | | Cloud Security Graph | A graph database mapping relationships between cloud resources, identities, network exposure, and vulnerabilities to identify exploitable attack paths | | Attack Path Analysis | Visualization of multi-step attack chains an adversary could follow from an entry point to a high-value target, prioritized by real-world exploitability | | Just-In-Time Access | Security control that blocks management ports by default and opens them temporarily upon approved request, reducing the VM attack surface | | Adaptive Application Controls | Machine-learning-based allowlisting that recommends which applications should run on VMs and alerts on deviations | | Defender CSPM | Enhanced cloud security posture management plan providing agentless scanning, attack path analysis, and cloud security graph capabilities | | Security Connector | Integration point connecting AWS or GCP environments to Defender for Cloud for multi-cloud posture management |
Context: Defender for Cloud identifies an Azure SQL Server with a public endpoint, an unpatched critical CVE, and a service principal with database owner permissions that also has access to a Key Vault containing production encryption keys.
Approach:
Pitfalls: Focusing on the SQL vulnerability alone misses the lateral movement path to Key Vault. Restricting the endpoint without updating application connection strings causes an outage.
Microsoft Defender for Cloud Security Report
=============================================
Tenant: acme-corp.onmicrosoft.com
Subscriptions Monitored: 12
Report Date: 2025-02-23
SECURE SCORE: 72/100
DEFENDER PLANS STATUS:
Servers (P2): ENABLED - 156 VMs covered
Containers: ENABLED - 8 AKS clusters covered
Storage: ENABLED - 342 storage accounts, malware scanning active
Databases: ENABLED - 23 SQL servers, 5 Cosmos DB accounts
Key Vault: ENABLED - 18 vaults monitored
AWS Connector: ENABLED - 3 accounts connected
GCP Connector: ENABLED - 2 projects connected
CRITICAL ATTACK PATHS:
[AP-001] Internet -> VM (RDP open) -> Managed Identity -> Storage (PII data)
Risk: Critical | Affected Resources: 3 | Remediation: Close RDP, restrict MI scope
[AP-002] Internet -> App Service (SQLi vuln) -> SQL DB -> Service Principal -> Key Vault
Risk: Critical | Affected Resources: 5 | Remediation: Patch app, private endpoint
ALERT SUMMARY (Last 30 Days):
Critical: 5 | High: 23 | Medium: 67 | Low: 134
Top Alert Types:
- Suspicious login activity (18)
- Malware detected in storage (7)
- Anomalous resource deployment (12)| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +23 percentage points is the difference between those two pass rates over the 22 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.