| name | implementing-aws-config-rules-for-compliance |
| description | 实施 AWS Config 规则,对 AWS 资源进行持续合规监控,部署符合 CIS 和 PCI DSS 框架的托管和自定义规则,使用 SSM Automation 配置自动修复,并在多账户之间聚合合规数据。
|
| domain | cybersecurity |
| subdomain | cloud-security |
| tags | ["cloud-security","aws","config-rules","compliance","automation","remediation"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
实施 AWS Config 规则以实现合规
适用场景
- 为 AWS 资源建立针对监管标准的持续合规监控时
- 实施配置漂移的自动检测和修复时
- 使用 AWS Organizations 构建跨多个 AWS 账户的合规仪表盘时
- 审计团队需要持续合规证据而非时点评估时
- 部署能在资源创建后几分钟内检测不合规资源的护栏时
不适用于:实时威胁检测(使用 GuardDuty)、应用漏洞扫描(使用 Inspector),或一次性合规评估(使用 Prowler 进行更快的即席审计)。
前置条件
- 在所有目标账户和区域启用 AWS Config 记录
- 具有
config:*、ssm:* 和 lambda:* 权限的 IAM 角色用于规则管理
- 配置 AWS Organizations 委派管理员,用于 Config 聚合
- S3 存储桶用于 Config 传输通道,SNS 主题用于通知
- CloudFormation StackSets 或 Terraform 用于多账户规则部署
工作流程
步骤 1:启用 AWS Config 记录
在每个目标账户中设置 Config 记录器和传输通道。
aws s3api create-bucket \
--bucket config-compliance-data-ACCOUNT_ID \
--region us-east-1
aws iam create-service-linked-role --aws-service-name config.amazonaws.com
aws configservice put-configuration-recorder \
--configuration-recorder name=default,roleARN=arn:aws:iam::ACCOUNT:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig \
--recording-group allSupported=true,includeGlobalResourceTypes=true
aws configservice put-delivery-channel \
--delivery-channel '{
"name": "default",
"s3BucketName": "config-compliance-data-ACCOUNT_ID",
"snsTopicARN": "arn:aws:sns:us-east-1:ACCOUNT:config-notifications",
"configSnapshotDeliveryProperties": {"deliveryFrequency": "TwentyFour_Hours"}
}'
aws configservice start-configuration-recorder --configuration-recorder-name default
步骤 2:部署用于 CIS 合规的托管 Config 规则
启用映射到 CIS AWS Foundations Benchmark 控制项的 AWS 托管 Config 规则。
aws configservice put-config-rule --config-rule '{
"ConfigRuleName": "s3-bucket-public-read-prohibited",
"Source": {"Owner": "AWS", "SourceIdentifier": "S3_BUCKET_PUBLIC_READ_PROHIBITED"}
}'
aws configservice put-config-rule --config-rule '{
"ConfigRuleName": "s3-bucket-server-side-encryption-enabled",
"Source": {"Owner": "AWS", "SourceIdentifier": "S3_BUCKET_SERVER_SIDE_ENCRYPTION_ENABLED"}
}'
aws configservice put-config-rule --config-rule '{
"ConfigRuleName": "s3-bucket-ssl-requests-only",
"Source": {"Owner": "AWS", "SourceIdentifier": "S3_BUCKET_SSL_REQUESTS_ONLY"}
}'
aws configservice put-config-rule --config-rule '{
"ConfigRuleName": "iam-root-access-key-check",
"Source": {"Owner": "AWS", "SourceIdentifier": "IAM_ROOT_ACCESS_KEY_CHECK"}
}'
aws configservice put-config-rule --config-rule '{
"ConfigRuleName": "mfa-enabled-for-iam-console-access",
"Source": {"Owner": "AWS", "SourceIdentifier": "MFA_ENABLED_FOR_IAM_CONSOLE_ACCESS"}
}'
aws configservice put-config-rule --config-rule '{
"ConfigRuleName": "iam-password-policy",
"Source": {"Owner": "AWS", "SourceIdentifier": "IAM_PASSWORD_POLICY"},
"InputParameters": "{\"RequireUppercaseCharacters\":\"true\",\"RequireLowercaseCharacters\":\"true\",\"RequireSymbols\":\"true\",\"RequireNumbers\":\"true\",\"MinimumPasswordLength\":\"14\"}"
}'
aws configservice put-config-rule --config-rule '{
"ConfigRuleName": "restricted-ssh",
"Source": {"Owner": "AWS", "SourceIdentifier": "INCOMING_SSH_DISABLED"}
}'
aws configservice put-config-rule --config-rule '{
"ConfigRuleName": "vpc-flow-logs-enabled",
"Source": {"Owner": "AWS", "SourceIdentifier": "VPC_FLOW_LOGS_ENABLED"}
}'
aws configservice put-config-rule --config-rule '{
"ConfigRuleName": "rds-storage-encrypted",
"Source": {"Owner": "AWS", "SourceIdentifier": "RDS_STORAGE_ENCRYPTED"}
}'
aws configservice put-config-rule --config-rule '{
"ConfigRuleName": "encrypted-volumes",
"Source": {"Owner": "AWS", "SourceIdentifier": "ENCRYPTED_VOLUMES"}
}'
步骤 3:使用 Lambda 创建自定义 Config 规则
针对组织特定的合规要求构建自定义规则。
import json
import boto3
config = boto3.client('config')
REQUIRED_TAGS = ['Environment', 'Owner', 'CostCenter', 'Project']
def lambda_handler(event, context):
invoking_event = json.loads(event['invokingEvent'])
configuration_item = invoking_event.get('configurationItem', {})
if configuration_item['resourceType'] != 'AWS::EC2::Instance':
return
tags = {t['key']: t['value'] for t in configuration_item.get('tags', [])}
missing_tags = [tag for tag in REQUIRED_TAGS if tag not in tags]
if missing_tags:
compliance = 'NON_COMPLIANT'
annotation = f"缺少必需标签: {', '.join(missing_tags)}"
else:
compliance = 'COMPLIANT'
annotation = '所有必需标签均已存在'
config.put_evaluations(
Evaluations=[{
'ComplianceResourceType': configuration_item['resourceType'],
'ComplianceResourceId': configuration_item['resourceId'],
'ComplianceType': compliance,
'Annotation': annotation,
'OrderingTimestamp': configuration_item['configurationItemCaptureTime']
}],
ResultToken=event[]
)
aws configservice put-config-rule --config-rule '{
"ConfigRuleName": "ec2-required-tags",
"Source": {
"Owner": "CUSTOM_LAMBDA",
"SourceIdentifier": "arn:aws:lambda:us-east-1:ACCOUNT:function:config-required-tags",
"SourceDetails": [{
"EventSource": "aws.config",
"MessageType": "ConfigurationItemChangeNotification"
}]
},
"Scope": {"ComplianceResourceTypes": ["AWS::EC2::Instance"]}
}'
步骤 4:配置自动修复
设置 SSM Automation 文档,自动修复不合规资源。
aws configservice put-remediation-configurations --remediation-configurations '[{
"ConfigRuleName": "s3-bucket-public-read-prohibited",
"TargetType": "SSM_DOCUMENT",
"TargetId": "AWS-DisableS3BucketPublicReadWrite",
"Parameters": {
"S3BucketName": {"ResourceValue": {"Value": "RESOURCE_ID"}},
"AutomationAssumeRole": {"StaticValue": {"Values": ["arn:aws:iam::ACCOUNT:role/ConfigRemediationRole"]}}
},
"Automatic": true,
"MaximumAutomaticAttempts": 3,
"RetryAttemptSeconds": 60
}]'
aws configservice put-remediation-configurations --remediation-configurations '[{
"ConfigRuleName": "encrypted-volumes",
"TargetType": "SSM_DOCUMENT",
"TargetId": "AWS-EnableEBSEncryptionByDefault",
"Parameters": {
"AutomationAssumeRole": {"StaticValue": {"Values": ["arn:aws:iam::ACCOUNT:role/ConfigRemediationRole"]}}
},
"Automatic": true,
"MaximumAutomaticAttempts": 1,
"RetryAttemptSeconds": 300
}]'
aws configservice put-remediation-configurations --remediation-configurations '[{
"ConfigRuleName": "restricted-ssh",
"TargetType": "SSM_DOCUMENT",
"TargetId": "AWS-DisablePublicAccessForSecurityGroup",
"Parameters": {
"GroupId": {"ResourceValue": {"Value": "RESOURCE_ID"}},
"AutomationAssumeRole": {"StaticValue": {"Values": ["arn:aws:iam::ACCOUNT:role/ConfigRemediationRole"]}}
},
"Automatic": true,
"MaximumAutomaticAttempts": 3,
"RetryAttemptSeconds": 60
}]'
步骤 5:设置多账户聚合
将所有组织账户的合规数据聚合到中央视图。
aws configservice put-configuration-aggregator \
--configuration-aggregator-name org-compliance-aggregator \
--organization-aggregation-source '{
"RoleArn": "arn:aws:iam::ACCOUNT:role/ConfigAggregatorRole",
"AllAwsRegions": true
}'
aws configservice get-aggregate-compliance-details-by-config-rule \
--configuration-aggregator-name org-compliance-aggregator \
--config-rule-name s3-bucket-public-read-prohibited \
--compliance-type NON_COMPLIANT \
--query 'AggregateEvaluationResults[*].[AccountId,AwsRegion,EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType]' \
--output table
aws configservice get-aggregate-compliance-summary-by-source \
--configuration-aggregator-name org-compliance-aggregator \
--query 'AggregateComplianceCounts[*].[GroupName,ComplianceSummary.CompliantResourceCount.CappedCount,ComplianceSummary.NonCompliantResourceCount.CappedCount]' \
--output table
核心概念
| 术语 | 定义 |
|---|
| AWS Config 规则(Config Rule) | 持续或按计划评估 AWS 资源配置是否满足特定要求的合规检查 |
| 托管规则(Managed Rule) | AWS 提供的预构建 Config 规则,包含用于常见合规检查(如加密和公开访问)的标准化逻辑 |
| 自定义规则(Custom Rule) | 由 Lambda 函数支持的组织专用 Config 规则,评估自定义合规逻辑 |
| 修复操作(Remediation Action) | SSM Automation 文档或 Lambda 函数,用于自动修复不合规资源 |
| 配置聚合器(Configuration Aggregator) | AWS Config 功能,将多个账户和区域的合规数据汇总到集中视图 |
| 合规包(Conformance Pack) | 打包为可部署单元的 Config 规则和修复操作集合,用于特定合规框架 |
工具与系统
- AWS Config:用于 AWS 资源的持续配置记录和合规评估服务
- SSM Automation:AWS Systems Manager 文档,用于对不合规资源执行自动修复操作
- Config 合规包(Config Conformance Packs):适用于 CIS、PCI DSS、NIST 800-53 和 HIPAA 合规的预构建规则集合
- CloudFormation StackSets:跨 AWS Organizations 多账户部署 Config 规则的机制
- Config 聚合器(Config Aggregator):跨账户和跨区域的合规数据整合
常见场景
场景:在 30 个 AWS 账户中部署 CIS 合规监控
场景背景:一家金融服务公司需要在其所有 30 个生产账户中持续证明 CIS AWS Foundations Benchmark 合规,以通过年度 SOC 2 审计。
方法:
- 通过 CloudFormation StackSets 在所有账户中启用 AWS Config 记录
- 使用 StackSets 将 CIS 合规包部署到所有账户
- 在安全账户中设置 Config 聚合器,实现全组织可见性
- 为安全可自动修复的规则(公开 S3、未加密卷)配置自动修复
- 创建 EventBridge 规则,在出现新的 NON_COMPLIANT 评估时发送告警
- 构建每周合规报告,聚合所有账户的合规得分
- 将 Config 快照存储在具有生命周期策略的 S3 中,用于审计留存
常见陷阱:Config 记录按记录的配置项收费。在资源众多的账户中,成本可能较高。使用有针对性的记录组,专注于与合规相关的资源类型,而不是记录所有资源。网络规则(安全组)的自动修复如果规则是有意设置为宽泛的,可能会中断应用程序。
输出格式
AWS Config 合规报告
===============================
组织: Acme Financial(30 个账户)
框架: CIS AWS Foundations 1.4
报告日期: 2026-02-23
活跃 Config 规则数: 48
合规摘要:
总体合规率: 87%
合规资源数: 4,234
不合规资源数: 612
不适用: 189
不合规情况最多的规则:
encrypted-volumes: 89 个资源(14 个账户)
vpc-flow-logs-enabled: 67 个资源(12 个账户)
mfa-enabled-for-iam-console: 45 个资源(8 个账户)
s3-bucket-ssl-requests-only: 34 个资源(6 个账户)
restricted-ssh: 28 个资源(5 个账户)
自动修复情况(过去 30 天):
已修复的公开 S3 存储桶: 12 个
已限制的安全组: 8 个
已启用 EBS 默认加密: 6 个
自动修复总计: 26 个
修复失败: 3 次
账户合规排名:
1. prod-core(account-001): 96% 合规
2. prod-data(account-002): 94% 合规
...
30. dev-sandbox(account-030): 68% 合规