本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
CloudFormation 采集堆栈:CFN 验证器示例
这些示例可以帮助您准备模板以成功收录。
格式验证
验证模板是否包含 “资源” 部分,并且在其下定义的所有资源都具有 “类型” 值。
{ "AWSTemplateFormatVersion": "2010-09-09", "Description" : "Create a SNS topic", "Resources": { "SnsTopic": { "Type": "AWS::SNS::Topic" } } }
验证是否允许使用模板的根密钥。允许的根密钥是:
[ "AWSTemplateFormatVersion", "Description", "Mappings", "Parameters", "Conditions", "Resources", "Rules", "Outputs", "Metadata" ]
需要手动审核验证
如果模板包含以下资源,则自动验证将失败,您需要手动审核。
从安全角度来看,所示的策略是高风险区域。例如,允许除特定用户或组之外的任何人创建对象或写入权限的 S3 存储桶策略极其危险。因此,我们会验证政策,并根据内容批准或拒绝,这些政策无法自动创建。我们正在研究解决此问题的可能方法。
我们目前没有针对以下资源的自动验证。
[ "S3::BucketPolicy", "SNS::TopicPolicy", "SQS::QueuePolicy" ]
参数验证
验证模板参数是否没有提供值;它必须具有默认值。
资源属性验证
必填属性检查:某些资源类型必须存在某些属性。
“VPCOptions” 必须存在于
AWS::OpenSearch::Domain“CludsterSubnetGroupName” 必须存在于
AWS::Redshift::Cluster
{ "AWS::OpenSearch::Domain": [ "VPCOptions" ], "AWS::Redshift::Cluster": [ "ClusterSubnetGroupName" ] }
不允许的属性检查:某些资源类型的某些属性必须*不*存在。
“SecretString” 不能存在于 “AWS::SecretsManager::Secret”
“MongoDbSettings” 不能存在于 “AWS::DMS::Endpoint”
{ "AWS::SecretsManager::Secret": [ "SecretString" ], "AWS::DMS::Endpoint": [ "MongoDbSettings" ] }
SSM 参数检查:对于以下列表中的属性,必须通过 Secrets Manager 或 Systems Manager 参数存储(安全字符串参数)指定值:
{ "RDS::DBInstance": [ "MasterUserPassword", "TdeCredentialPassword" ], "RDS::DBCluster": [ "MasterUserPassword" ], "ElastiCache::ReplicationGroup": [ "AuthToken" ], "DMS::Certificate": [ "CertificatePem", "CertificateWallet" ], "DMS::Endpoint": [ "Password" ], "CodePipeline::Webhook": { "AuthenticationConfiguration": [ "SecretToken" ] }, "DocDB::DBCluster": [ "MasterUserPassword" ] },
某些属性必须符合某些模式;例如,IAM 实例配置文件名称不得以 AMS 保留前缀开头,并且属性值必须与特定的正则表达式匹配,如下所示:
{ "AWS::EC2::Instance": { "IamInstanceProfile": [ "^(?!arn:aws:iam|ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+", "arn:aws:iam::(\\$\\{AWS::AccountId\\}|[0-9]+):instance-profile/(?!ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+" ] }, "AWS::AutoScaling::LaunchConfiguration": { "IamInstanceProfile": [ "^(?!arn:aws:iam|ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+", "arn:aws:iam::(\\$\\{AWS::AccountId\\}|[0-9]+):instance-profile/(?!ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+" ] }, "AWS::EC2::LaunchTemplate": { "LaunchTemplateData.IamInstanceProfile.Name": [ "^(?!ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+" ], "LaunchTemplateData.IamInstanceProfile.Arn": [ "arn:aws:iam::(\\$\\{AWS::AccountId\\}|[0-9]+):instance-profile\/(?!ams|Ams|AMS|AWSManagedServices|Managed_Services|mc|Mc|MC|sentinel|Sentinel).+" ] } }
资源验证
只能在模板中指定列入许可名单的资源;这些资源在中进行了介绍。支持的资源
EC2 由于修补限制,不能将堆栈和 Auto Scaling 组 (ASGs) 放在同一个堆栈中。
安全组入口规则验证
对于来自 CFN Ingest Create 或 Stack Update CT 更改类型的请求:
如果 (
IpProtocol是 tcp 或 6) AND(端口为 80 或 443),则该CidrIP值没有限制否则,
CidrIP不能是 0.0.0.0/0
对于来自服务目录(服务目录产品)的请求:
除了 CFN Ingest Create 或 Stack Update CT 更改类型验证外,协议所在的端口
ip_protocols只能通过以下方式访问:management_portsallowed_cidrs{ "ip_protocols": ["tcp", "6", "udp", "17"], "management_ports": [22, 23, 389, 636, 1494, 1604, 2222, 3389, 5900, 5901, 5985, 5986], "allowed_cidrs": ["10.0.0.0/8", "100.64.0.0/10", "172.16.0.0/12", "192.168.0.0/16"] }