如何控制CloudFormation元数据访问?

据我了解,一个实例需要被授予访问的cloudformation:*资源,以便做任何事情与CloudFormation。

但是,当我在一个Beanstalk Web服务器实例上运行这个:

 cfn-get-metadata -s awseb-e-xxxxxxxxx-stack -r AWSEBAutoScalingGroup 

我得到一个完整的元数据转储,没有问题。

  1. 我没有在命令行中指定任何访问/密钥。
  2. 我的实例angular色是由我手动创build的,并且绝对不会授予任何有关cloudformation:*权限cloudformation:*资源。

我怎样才能读取任何CF元数据?

我注意到,在客户端代码中,脚本使用实例凭据( self.using_instance_identity为True)

 signer = CFNSigner() \ if self.using_instance_identity \ else V4Signer(region, 'cloudformation') 

这是一些特定于CF的魔法吗?或者我错过了一些授予CF权限的地方?

是的,CloudFormation服务有一个特殊的未公开的身份validation机制,允许来自堆栈中任何实例的cfn- *脚本在不使用IAM的情况下查看堆栈的元数据。 它可能像这样工作:

  • cfn-get-metadata和其他cfn- *脚本包含 http://169.254.169.254/latest/dynamic/instance-identity/document (包含instanceId的JSON文档)和http://169.254.169.254/latest/的内容dynamic/实例身份/签名 (base64编码的128字节值)在CloudFormation DescribeStackResource请求。
  • CloudFormation通过检查实例文档的签名是否由EC2服务签名来validation请求来自EC2实例。 由于签名是128字节,所以很可能是使用由EC2维护的RSA 1024位私钥的签名。
  • CloudFormation从标识文档中获取instanceId,并调用DescribeTags或DescribeInstances以获取与其关联的标签。
  • CloudFormation比较标签aws:cloudformation:stack-nameaws:cloudformation:logical-id (不能被用户修改)的值,并执行DescribeStackResource请求(如果它们匹配请求的StackName和LaunchConfig)。