cloud-security-posture
# Cloud Security Posture Assessment
Cross-cloud security posture assessment for evaluating IAM policies,
encryption configuration, and public exposure across [AWS], [Azure],
and [GCP] environments. This skill provides a unified assessment
methodology — diagnostic reasoning is provider-independent, while
specific commands and console paths use inline provider labels.
This is an assessment skill, not a deep-dive into any single provider's
networking layer. For detailed VPC, VNet, or VPC Network analysis, use
the dedicated provider skills: `aws-networking-audit` for VPC/Security
Group/Transit Gateway, `azure-networking-audit` for VNet/NSG/Route Table,
and `gcp-networking-audit` for VPC Network/Firewall Rule/Cloud Router
analysis. Reference `references/cli-reference.md` for multi-provider
CLI commands organized by audit step, and `references/security-controls.md`
for the IAM hierarchy model, encryption matrix, and CIS benchmark
control ID mapping.
## When to Use
- Multi-cloud security review — assessing posture across two or more cloud providers in a single engagement
- Pre-compliance audit — evaluating IAM, encryption, and exposure gaps before formal CIS or SOC 2 assessment
- Cloud migration security gate — verifying security controls are in place before production traffic cutover
- Incident response scoping — quickly determining cross-cloud exposure surface during a security event
- Periodic posture check — scheduled assessment of IAM hygiene, encryption coverage, and public attack surface
- Merger or acquisition due diligence — evaluating cloud security maturity across inherited environments
## Prerequisites
- **[AWS]** AWS CLI v2 configured (`aws sts get-caller-identity` succeeds); IAM permissions for `iam:List*`, `iam:Get*`, `kms:List*`, `kms:DescribeKey`, `s3:GetBucketEncryption`, `s3:GetBucketPolicyStatus`, `ec2:DescribeSecurityGroups`, `ec2:DescribeInstances`, `elasticloadbalancing:DescribeLoadBalancers`, `rds:DescribeDBInstances`, `acm:ListCertificates`
- **[Azure]** Azure CLI (`az account show` succeeds); RBAC Reader role on target subscriptions; permissions for `Microsoft.Authorization/roleAssignments/read`, `Microsoft.KeyVault/vaults/read`, `Microsoft.Compute/disks/read`, `Microsoft.Network/publicIPAddresses/read`, `Microsoft.Network/networkSecurityGroups/read`, `Microsoft.Storage/storageAccounts/read`
- **[GCP]** gcloud CLI configured (`gcloud auth list` shows active account); roles `roles/iam.securityReviewer`, `roles/cloudkms.viewer`, `roles/compute.viewer`, `roles/storage.admin` (for bucket IAM inspection) on target project(s)
- **Target scope identified** — cloud accounts/subscriptions/projects, regions, and environment tier (prod, staging, dev) defined before assessment begins
- **Assessment window** — coordinate with operations to avoid snapshot timing during deployments or maintenance windows
## Procedure
Follow these six steps sequentially. Each step produces findings that
feed the cross-cloud posture summary in Step 6.
### Step 1: IAM Posture Assessment
Evaluate identity and access management configuration for privilege
escalation risks, excessive permissions, and policy hygiene across
all in-scope providers. Focus on three areas: overly permissive
policies, missing authentication controls, and privilege escalation
paths through role chaining or impersonation.
**[AWS]** Enumerate IAM users, roles, and policies. Check for wildcard
actions in customer-managed policies:
```
aws iam get-account-authorization-details --output json
aws iam list-policies --scope Local --query 'Policies[?AttachmentCount>`0`]'
```
Flag policies with `"Action": "*"` or `"Resource": "*"` as Critical.
Review Service Control Policies (SCPs) in Organizations for boundary
gaps that allow privilege escalation paths (e.g., `iam:CreateRole` +
`iam:AttachRolePolicy` without SCP deny). Check for IAM users with
console access but no MFA: `aws iam get-credential-report`.
**[Azure]** Audit RBAC role assignments and Entra ID configuration:
```
az role assignment list --all --output table
az ad user list --query "[?userType=='Member']" --output table
```
Identify Owner/Contributor role sprawl — assignments at subscription
scope with no expiration indicate missing Privileged Identity Management
(PIM) activation policies. Review Conditional Access policies for gaps:
no policy covering all users, missing device compliance requirements,
or legacy authentication protocols not blocked.
**[GCP]** Analyze IAM bindings and Organization Policy constraints:
```
gcloud projects get-iam-policy <project-id> --format=json
gcloud resource-manager org-policies list --project=<project-id>
```
Flag bindings with `roles/owner` or `roles/editor` on service accounts
as Critical. Check for service account key age exceeding 90 days:
`gcloud iam service-accounts keys list --iam-account=<sa-email>`.
Verify Organization Policy constraints enforce `iam.disableServiceAccountKeyCreation`
where applicable.
### Step 2: Encryption Audit
Assess encryption at rest and in transit across storage, compute,
and database services. Evaluate key management practices including
rotation schedules, access policies, and customer-managed vs
provider-managed key usage.
**[AWS]** Verify KMS key policies, storage encryption, and certificate
management:
```
aws kms list-keys --output table
aws s3api get-bucket-encryption --bucket <bucket-name>
aws rds describe-db-instances --query 'DBInstances[*].[DBInstanceIdentifier,StorageEncrypted,KmsKeyId]'
```
Check EBS volume encryption: `aws ec2 describe-volumes --query 'Volumes[?!Encrypted]'`.
Review ACM certificate expiry: `aws acm list-certificates --query 'CertificateSummaryList[?Status==`ISSUED`]'`.
Flag any unencrypted S3 buckets, EBS volumes, or RDS instances as
High severity. Verify KMS key rotation is enabled for customer-managed
keys: `aws kms get-key-rotation-status --key-id <key-id>`.
**[Azure]** Audit Key Vault configuration, disk encryption, and TLS:
```
az keyvault list --output table
az disk list --query "[?encryption.type!='EncryptionAtRestWithPlatformKey']" --output table
```
Verify Key Vault access policies follow least privilege — no vault
with "Get, List, Set, Delete" for all principals. Check managed disk
encryption type (platform-managed vs customer-managed keys). Review
TLS minimum version on App Services: `az webapp list --query "[].{name:name, minTlsVersion:siteConfig.minTlsVersion}"`.
**[GCP]** Assess Cloud KMS configuration and default encryption:
```
gcloud kms keyrings list --location=<location>
gcloud kms keys list --keyring=<keyring> --location=<location>
```
Determine CMEK vs Google-managed encryption per service. Flag any
Cloud Storage buckets or Compute disks without CMEK if the
organization policy requires it. Check KMS key rotation period:
`gcloud kms keys describe <key> --keyring=<keyring> --location=<location>`.
Verify SSL policy compliance on load balancers:
`gcloud compute ssl-policies list`.
### Step 3: Public Exposure Detection
Identify publicly accessible resources and evaluate network-level
exposure across all three providers. Public exposure combined with
weak authentication (Step 1) or missing encryption (Step 2) compounds
severity — cross-reference findings when classifying risk.
**[AWS]** Check for public S3 buckets, permissive Security Groups,
and load balancer configuration:
```
aws s3api list-buckets --query 'Buckets[*].Name' --output text
aws s3api get-bucket-policy-status --bucket <bucket-name>
aws ec2 describe-security-groups --filters "Name=ip-permission.cidr,Values=0.0.0.0/0"
```
Flag Security Groups allowing `0.0.0.0/0` ingress on non-standard
ports as Critical. Check ELB access logging: `aws elbv2 describe-load-balancer-attributes --load-balancer-arn <arn> --query 'Attributes[?Key==`access_logs.s3.enabled`]'`.
**[Azure]** Identify public IPs without network security controls:
```
az network public-ip list --output table
az network nsg list --output table
az storage account list --query "[].{name:name, publicAccess:allowBlobPublicAccess}"
```
Flag public IPs with no associated NSG as High severity. Check
storage account public access settings — `allowBlobPublicAccess: true`
requires justification. Verify Application Gateway WAF mode is
"Prevention" not "Detection" for production workloads.
**[GCP]** Detect public firewall rules and external load balancer
exposure:
```
gcloud compute firewall-rules list --filter="sourceRanges:0.0.0.0/0" --format=table
gcloud compute forwarding-rules list --filter="loadBalancingScheme=EXTERNAL"
```
Flag firewall rules with `0.0.0.0/0` source range on non-443/80
ports as Critical. Check Cloud Storage public access:
`gsutil iam get gs://<bucket>` and look for `allUsers` or
`allAuthenticatedUsers` bindings. Verify external load balancer
backends are intentionally public.
### Step 4: Network Security Cross-Reference
Delegate deep network security analysis to the dedicated provider
networking skills. This step connects posture findings to network
architecture context and ensures that infrastructure-level controls
complement the identity and data protection evaluated in Steps 1–3.
- **[AWS]** Run `aws-networking-audit` for VPC CIDR design, Security Group rule-by-rule analysis, Transit Gateway topology, VPC Flow Log forensics, and Route Table validation
- **[Azure]** Run `azure-networking-audit` for VNet architecture, NSG effective rules, Route Table/UDR analysis, Network Watcher diagnostics, and Service Endpoint/Private Link coverage
- **[GCP]** Run `gcp-networking-audit` for VPC Network design, hierarchical firewall policy analysis, Cloud Router/BGP configuration, VPC Flow Log analysis, and Cloud NAT verification
Correlate findings: IAM misconfigurations (Step 1) combined with
permissive network rules (this step) represent compounded risk.
A service account with `roles/editor` behind a firewall rule
allowing `0.0.0.0/0` is more urgent than either finding alone.
Document cross-references between posture findings and network
architecture gaps in the final report.
### Step 5: Compliance Mapping
Map findings to compliance framework controls. Reference CIS benchmark
control IDs for provider-specific checks and SOC 2 criteria for
organizational controls. This step transforms technical findings into
auditor-consumable evidence.
**CIS Cloud Benchmark References** (control IDs for audit mapping):
- **[AWS]** CIS AWS Foundations Benchmark — Section 1 (IAM), Section 2 (Storage/Logging), Section 3 (Monitoring), Section 4 (Networking), Section 5 (Compute)
- **[Azure]** CIS Azure Foundations Benchmark — Section 1 (IAM), Section 2 (Microsoft Defender), Section 3 (Storage), Section 4 (Database), Section 5 (Logging), Section 6 (Networking), Section 7 (VM), Section 8 (Key Vault)
- **[GCP]** CIS GCP Foundations Benchmark — Section 1 (IAM), Section 2 (Logging/Monitoring), Section 3 (Networking), Section 4 (VM), Section 5 (Storage), Section 6 (Cloud SQL), Section 7 (BigQuery)
Map each finding to the applicable CIS section and control number.
See `references/security-controls.md` for the full control ID index.
**SOC 2 Control Mapping** — Map infrastructure findings to Trust
Services Criteria: CC6 (Logical and Physical Access Controls) for
IAM and network exposure findings, CC7 (System Operations) for
encryption and monitoring gaps.
**Severity Classification** — Critical: exploitable public exposure
or admin-level privilege escalation. High: unencrypted sensitive
data or overly permissive IAM. Medium: missing logging, stale
credentials, or suboptimal encryption key management. Low:
configuration drift from best practice without direct exploit path.
### Step 6: Cross-Cloud Posture Report
Compile findings into a structured cross-cloud posture report with
provider-by-provider comparison and prioritized remediation actions.
**Provider Comparison Matrix** — Tabulate findings by domain (IAM,
encryption, exposure) and provider. Identify which provider has
the strongest/weakest posture per domain. Flag any provider that
lacks coverage for a domain (e.g., no encryption at rest audit
completed for GCP). Note configuration parity gaps — if AWS
enforces MFA but Azure does not require Conditional Access, the
inconsistency itself is a finding.
**Prioritized Remediation** — Rank all findings by severity, then
by blast radius (multi-provider issues first). Group remediation
actions by provider to enable parallel workstreams. Estimate
effort for each remediation (quick fix vs project-level change).
Identify quick wins: enabling encryption defaults, rotating stale
keys, and restricting overly permissive firewall rules typically
resolve 30–50% of findings with minimal change risk.
**Executive Summary** — Overall posture score per provider (Critical/
High/Medium/Low finding counts), cross-cloud consistency assessment,
top 5 priority remediations, and recommended reassessment timeline.
Include trend data if prior assessments exist — improving or
degrading posture per domain.
## Threshold Tables
| Domain | Severity | Condition | Example |
|--------|----------|-----------|---------|
| IAM | Critical | Wildcard admin policy without SCP boundary | `"Action": "*", "Resource": "*"` |
| IAM | High | Service account/user with no MFA and console access | AWS IAM user, Azure member without CA |
| IAM | Medium | Service account key age >90 days | [GCP] key rotation overdue |
| IAM | Low | Unused IAM role with permissions attached | Role with 0 last-used date |
| Encryption | Critical | Unencrypted database with sensitive data | RDS, Azure SQL, Cloud SQL |
| Encryption | High | Unencrypted storage bucket/volume | S3, Blob Storage, Cloud Storage |
| Encryption | Medium | Customer-managed key rotation >365 days | KMS, Key Vault, Cloud KMS |
| Encryption | Low | Platform-managed keys where CMEK policy exists | Org policy violation |
| Exposure | Critical | Public access on 0.0.0.0/0 non-web ports | SSH/RDP open to internet |
| Exposure | High | Storage bucket publicly accessible | S3, Blob, GCS with allUsers |
| Exposure | Medium | Load balancer without access logging | ALB, App Gateway, Cloud LB |
| Exposure | Low | WAF in detection mode (not prevention) | [Azure] App Gateway WAF |
## Decision Trees
```
Cloud Posture Assessment Scoping:
├─ Single provider? → Use dedicated provider skill (aws/azure/gcp-networking-audit)
├─ Multiple providers? → Use this skill for cross-cloud posture assessment
│ ├─ All 3 providers in scope? → Full procedure (Steps 1–6)
│ ├─ 2 providers? → Skip provider-specific checks for absent provider
│ └─ Compliance required? → Include Step 5 mapping
└─ Provider deep-dive needed? → Cross-reference to dedicated skill (Step 4)
Finding Severity Assignment:
├─ Exploitable from internet with no authentication? → Critical
├─ Data exposure or privilege escalation path? → High
├─ Missing logging or stale credentials? → Medium
└─ Configuration drift without exploit path? → Low
IAM Escalation Path Detection:
├─ User/role can create new roles? → Check SCP/org policy boundary
│ ├─ No boundary? → Critical — unbounded privilege escalation
│ └─ Boundary exists? → Verify deny rules cover CreateRole + AttachPolicy
├─ Service account can impersonate other accounts? → High
└─ Cross-account trust allows external principals? → High
```
## Report Template
```markdown
# Cloud Security Posture Assessment Report
## Executive Summary
- **Assessment scope:** [AWS accounts / Azure subscriptions / GCP projects]
- **Assessment date:** [date]
- **Overall posture:** [Critical/High/Medium/Low finding summary]
## Provider Comparison Matrix
| Domain | AWS | Azure | GCP |
|------------|------------|------------|------------|
| IAM | [findings] | [findings] | [findings] |
| Encryption | [findings] | [findings] | [findings] |
| Exposure | [findings] | [findings] | [findings] |
| Network | [ref: provider skill] | [ref: provider skill] | [ref: provider skill] |
## Findings by Severity
### Critical
| # | Provider | Domain | Finding | CIS Control | Remediation |
|---|----------|--------|---------|-------------|-------------|
### High
| # | Provider | Domain | Finding | CIS Control | Remediation |
|---|----------|--------|---------|-------------|-------------|
### Medium / Low
[Grouped table for lower-severity findings]
## Remediation Roadmap
1. [Immediate — Critical findings, estimated effort]
2. [Short-term — High findings within 30 days]
3. [Medium-term — Medium findings within 90 days]
## Appendix
- Provider-specific networking audit references
- Full CIS control mapping table
- Evidence collection inventory
```
## Troubleshooting
**Insufficient permissions on one provider** — If credential checks
fail for a single provider (`aws sts get-caller-identity`, `az account
show`, or `gcloud auth list`), proceed with available providers and
document the gap. Partial assessments are valuable — note "Provider X
not assessed" in the comparison matrix.
**Cross-account or cross-subscription enumeration failures** — Multi-
account AWS environments require assume-role chains; multi-subscription
Azure requires Reader on each subscription. If enumeration returns
empty results, verify role trust policies and subscription RBAC before
assuming clean posture.
**Large-scale environments** — For environments with 50+ accounts or
subscriptions, sample-based assessment is acceptable. Prioritize
production accounts, internet-facing workloads, and accounts with
external trust relationships. Document sampling methodology and
coverage percentage in the report. Consider using cloud-native
aggregation tools ([AWS] Security Hub, [Azure] Defender for Cloud,
[GCP] Security Command Center) to supplement manual CLI checks.
**Conflicting severity across providers** — The same logical risk
(e.g., public storage) may present differently per provider. Use the
Threshold Tables severity definitions consistently. A publicly
accessible S3 bucket, Azure Blob container, and GCS bucket all receive
the same severity regardless of provider-specific defaults or naming.
**Stale credentials not surfaced by default** — [AWS] credential
reports require generation (`aws iam generate-credential-report`)
before download. [Azure] sign-in logs require Azure AD Premium P1.
[GCP] service account key listing shows creation date but not last
usage without additional audit log queries. Document data freshness
limitations in the report appendix.
**CIS benchmark version alignment** — Verify which CIS benchmark
version applies to the deployed cloud service versions. Cite the
benchmark version in findings (e.g., "CIS AWS Foundations v2.0.0 —
1.4"). Reference `references/security-controls.md` for control IDs.
标签
skill
ai