CloudFormation 采集堆栈:CFN 验证器示例 - AMS 高级应用程序开发者指南

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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"] }