AWS Config compliance results proving the network boundary is controlled — no security group exposes SSH to the internet, groups open to 0.0.0.0/0 only allow authorized ports, and every VPC's default security group denies all traffic
The API supplies the facts, but a human judgement against a documented baseline turns them into evidence.
Fetch
$ aws configservice get-compliance-details-by-config-rule --config-rule-name restricted-ssh --compliance-types NON_COMPLIANT$ aws configservice get-compliance-details-by-config-rule --config-rule-name vpc-sg-open-only-to-authorized-ports --compliance-types NON_COMPLIANT$ aws configservice get-compliance-details-by-config-rule --config-rule-name vpc-default-security-group-closed --compliance-types NON_COMPLIANT$ aws configservice describe-configuration-recorder-status$ aws configservice describe-config-rule-evaluation-status --config-rule-names restricted-ssh$ aws configservice describe-config-rule-evaluation-status --config-rule-names vpc-sg-open-only-to-authorized-ports$ aws configservice describe-config-rule-evaluation-status --config-rule-names vpc-default-security-group-closed$ aws ec2 describe-regions --query 'Regions[].RegionName' --output text$ aws organizations list-accounts --query 'Accounts[].Id' --output textExpected output
Three EvaluationResults arrays; empty NON_COMPLIANT sets mean no security group leaves SSH (port 22) open to 0.0.0.0/0 or ::/0, any internet-open group is limited to the authorizedTcpPorts/authorizedUdpPorts you set, and every default security group is closed. Managed rule identifiers: INCOMING_SSH_DISABLED (rule name restricted-ssh), VPC_SG_OPEN_ONLY_TO_AUTHORIZED_PORTS, VPC_DEFAULT_SECURITY_GROUP_CLOSED Plus describe-configuration-recorder-status showing recording=true and, per rule, describe-config-rule-evaluation-status showing FirstEvaluationStarted=true with a LastSuccessfulEvaluationTime — the proof the empty set was produced by a check that ran.
Assertions — what makes it a pass
| Field | Must be | For | Proves |
|---|---|---|---|
| restricted-ssh.EvaluationResults | count_eq 0No security group exposes port 22 to 0.0.0.0/0 or ::/0. | every row | SC-07 |
| vpc-sg-open-only-to-authorized-ports.EvaluationResults | count_eq 0Any internet-open security group is limited to the ports you declared authorized. | every row | SC-07 |
| vpc-default-security-group-closed.EvaluationResults | count_eq 0Every VPC default security group denies all inbound and outbound traffic. | every row | SC-07 |
| configuration-recorder-status.ConfigurationRecordersStatus[].recording | eq trueThe configuration recorder is on — without it an empty NON_COMPLIANT set is indistinguishable from a recorder that never ran. | every row | SC-07 |
| restricted-ssh-evaluation-status.ConfigRulesEvaluationStatus[].FirstEvaluationStarted | eq truerestricted-ssh has evaluated at least once; a deployed-but-never-evaluated rule also returns an empty result. | every row | SC-07 |
| restricted-ssh-evaluation-status.ConfigRulesEvaluationStatus[].LastSuccessfulEvaluationTime | existsrestricted-ssh has a successful evaluation on record. | every row | SC-07 |
| vpc-sg-open-only-to-authorized-ports-evaluation-status.ConfigRulesEvaluationStatus[].FirstEvaluationStarted | eq truevpc-sg-open-only-to-authorized-ports has evaluated at least once; a deployed-but-never-evaluated rule also returns an empty result. | every row | SC-07 |
| vpc-sg-open-only-to-authorized-ports-evaluation-status.ConfigRulesEvaluationStatus[].LastSuccessfulEvaluationTime | existsvpc-sg-open-only-to-authorized-ports has a successful evaluation on record. | every row | SC-07 |
| vpc-default-security-group-closed-evaluation-status.ConfigRulesEvaluationStatus[].FirstEvaluationStarted | eq truevpc-default-security-group-closed has evaluated at least once; a deployed-but-never-evaluated rule also returns an empty result. | every row | SC-07 |
| vpc-default-security-group-closed-evaluation-status.ConfigRulesEvaluationStatus[].LastSuccessfulEvaluationTime | existsvpc-default-security-group-closed has a successful evaluation on record. | every row | SC-07 |
Authored opinion, like the commands. Units live in the operator name — max-age-days is days, and nothing here is converted for you.
Map — what it proves
- recipe1
- recipe— an authored recipe collects evidence for this control
- KSI only— a Key Security Indicator reaches it, but no recipe is authored yet
- orphan— no Key Security Indicator reaches it — a person writes it up instead
What else these families can fetch:SC 13/35 →
GovCloud
AWS Config and all three managed rules are available in AWS GovCloud (US); VPC and security-group ARNs use partition arn:aws-us-gov
Notes & assertions
Set VPC_SG_OPEN_ONLY_TO_AUTHORIZED_PORTS parameters (authorizedTcpPorts/authorizedUdpPorts) to your documented ingress allow-list, otherwise any 0.0.0.0/0 rule is NON_COMPLIANT. These three cover security-group ingress; for full SC-07 boundary evidence also collect NACL and subnet routing posture and, where used, restricted-common-ports and vpc-flow-logs-enabled. Note VPC_DEFAULT_SECURITY_GROUP_CLOSED may lag on deleted VPCs until the next baselining pass. These three rules read security-group ingress and nothing else; SC-07(b) — the logical separation FedRAMP's own guidance singles out — plus NACLs, route tables, gateways and VPC endpoints are a human's architecture assertion against this output. MAS-CSO-FLO is not claimed: its artifact is the enumeration of permitted connections, and a NON_COMPLIANT filter is empty on a compliant estate.
References
- AWS Config managed rule: restricted-ssh (INCOMING_SSH_DISABLED) https://docs.aws.amazon.com/config/latest/developerguide/restricted-ssh.html
- AWS Config managed rule: vpc-sg-open-only-to-authorized-ports https://docs.aws.amazon.com/config/latest/developerguide/vpc-sg-open-only-to-authorized-ports.html
- AWS Config managed rule: vpc-default-security-group-closed https://docs.aws.amazon.com/config/latest/developerguide/vpc-default-security-group-closed.html
This AWS mapping is authored opinion (overlay v3.0.0), versioned separately from the dataset and written against ruleset 2026.07.14.01. The upstream FedRAMP dataset names none of these tools.
The Cloud Native Architecture run (7)
- automatable
- partial — needs judgement
- narrative — no API proves this
Every authored recipe filed under CNA, in the order the plan works them. The mark says how much of the evidence the command produces on its own.
- partialAWS Config compliance results proving the network boundary is controlled — no security group exposes SSH to the internet, groups open to 0.0.0.0/0 only allow authorized ports, and every VPC's default security group denies all trafficyou are herecontinuousconfig-network-boundary-protectionAWS Config · Amazon VPC · Amazon EC2
- partialEvery route in or out of the boundary, named and counted — internet gateways, NAT gateways, VPC endpoints and Site-to-Site VPN tunnels — alongside what each boundary device does with traffic that matched no rule: the network ACL entries, the closed default security group, subnets that hand out public IPs, and the firewall policy's stateless and stateful default actionsweeklyboundary-access-points-and-default-denyAmazon VPC · Amazon EC2 · AWS Network Firewall · AWS Config
- partialThe denial-of-service defences that are actually attached to the internet-facing resources — the Shield Advanced subscription and the list of resources it protects, the web ACL's rate-based rules and their limits, whether web ACL logging is on — plus what those defences observed: the attacks Shield recorded over the period and the CloudWatch detection and block counts underneath themdailyddos-protection-and-rate-limitingAWS Shield Advanced · AWS WAF · Amazon CloudWatch · AWS Config
- partialWhether malware scanning is switched on for compute and for the buckets that accept uploads, plus the scan-by-scan record of what was actually examined and what came back INFECTEDweeklymalicious-code-protectionAmazon GuardDuty · Amazon EC2 · Amazon S3 · AWS Config
- partialThe machine-generated inventory of every plane on which one part of the system reaches another — VPC peering connections, Transit Gateway attachments, the interface and gateway endpoints this account consumes, the endpoint connections other accounts have made INTO your endpoint service, and the security-group rules that name another group rather than a CIDR — each narrowed to the states that are actually livecontinuousinternal-connection-inventory-and-authorizationAmazon VPC · AWS Transit Gateway · AWS PrivateLink
- partialWhich taint-tracking ruleset actually ran over this repository — the query suite, the languages selected, and the threat model that decides what counts as an untrusted source — together with whether the recurring scan is still scheduled, when it last ran per analysed language, and how many rules were in the run; and then the open findings in the injection families SI-10 is about, identified by the CWE tags the queries carry. The ruleset and the freshness are the load-bearing half: a finding names a sink that exists, but only the run record says the absence of findings means anything at all.continuousinput-validation-taint-analysis-coverageGitHub code scanning · GitHub CodeQL
- partialWhether the queries that find information disclosure through an error message or a stack trace ran over this part of the boundary — which languages were selected, whether the recurring scan is still scheduled and when it last completed — and then the open findings those queries produced, identified by the CWE tags the queries carry rather than by their names. The run record is the load-bearing half here as it is on every scanning recipe: a finding names a leak that exists, and only the record of a scan having run over a selected language makes the absence of findings a statement about anything.continuouserror-handling-information-exposure-scanningGitHub code scanning · GitHub CodeQL · GitHub code security configurations