2014-09-01 72 views
1

我是AWS CloudFormation的新手,我试图找出一些预先存在的CloudFormation JSON。我已经多次阅读过这些文档,但我似乎最终得到的答案比答案还要多。AWS CloudFormation IAM策略和SQS策略似乎有类似的设置,但不知道为什么?

下面是我的CloudFormation文件的修改版本。我试图尽可能地从CloudFormation示例中去除,以期望减少视觉噪音。我很感谢读者不知道为什么某些事情已经完成的原因,但我希望我的问题(下文)会突出CF如何写出更基本的问题。

CF JSON创建一个SQS队列,一个SQS队列策略和一个IAM策略。

的SQS队列策略允许的SQS队列(这也限制了通过条件访问特定的IP地址)完整的API访问,似乎这些权限分配给队列本身。

但我们也有这似乎做类似的事情的IAM策略?它分配特定的SQS队列权限,但这次是分配给一个角色,而不是像队列本身一样,像SQS队列策略似乎正在做的那样。

我的问题是为什么重复?我们是否可以将访问权限应用于SQS队列策略并只删除“QueuesPolicy”IAM策略?

我可以理解为什么IAM策略“QueuesPolicy”会设置SQS队列访问权限:因为您可以让多个角色访问单个队列并且希望他们拥有一组不同的权限(而不是Queue所有角色的一组具体权限)。但是,如果是这样的话,为什么还要在队列上设置权限?这看起来像是一个错误还是用作某种“后备”?

我也认为我们能保持SQS队列策略,但只是删除API权限,并保持以限制其自身的访问某些IP地址的能力。这个例子能起作用吗?

此外,AWS :: IAM ::角色混淆了我,因为我真的不知道我的理解它在做什么。似乎表明EC2实例将有能力承担FooRole,这是否正确?我想,因为我们有一组AWS凭证,即在EC2实例中运行的应用程序可能使用的凭据,以获得我们的AWS账户的访问,但因为没有单独的“用户”,我们将需要有一个角色创建并且EC2实例有权访问该角色以获得授权请求(例如从应用程序向队列发送消息)?

{ 
    "AWSTemplateFormatVersion": "2010-09-09", 
    "Resources": { 
    "EC2ComponentPolicy": { 
     "Type": "AWS::IAM::Policy", 
     "Properties": { 
     "PolicyName": "EC2ComponentPolicy", 
     "PolicyDocument": { 
      "Statement": [ 
      { 
       "Action": [ 
       "cloudformation:Describe*" 
       ], 
       "Resource": [ 
       "*" 
       ], 
       "Effect": "Allow" 
      }, 
      { 
       "Action": [ 
       "ec2:Describe*" 
       ], 
       "Resource": [ 
       "*" 
       ], 
       "Effect": "Allow" 
      } 
      ] 
     }, 
     "Roles": [ 
      { 
      "Ref": "FooRole" 
      } 
     ] 
     } 
    }, 
    "SQSFooQueue": { 
     "Type": "AWS::SQS::Queue", 
     "Properties": { 
     "MessageRetentionPeriod": 86400, 
     "VisibilityTimeout": { 
      "Ref": "VisibilityTimeout" 
     } 
     } 
    }, 
    "ComponentInstanceProfile": { 
     "Type": "AWS::IAM::InstanceProfile", 
     "Properties": { 
     "Path": "/", 
     "Roles": [ 
      { 
      "Ref": "FooRole" 
      } 
     ] 
     } 
    }, 
    "SQSFooQueuePolicy": { 
     "Type": "AWS::SQS::QueuePolicy", 
     "Properties": { 
     "Queues": [ 
      { 
      "Ref": "SQSFooQueue" 
      } 
     ], 
     "PolicyDocument": { 
      "Version": "2012-10-17", 
      "Id": "SQSFooQueuePolicy", 
      "Statement": [ 
      { 
       "Resource": [ 
       { 
        "Fn::GetAtt": [ 
        "SQSFooQueue", 
        "Arn" 
        ] 
       } 
       ], 
       "Effect": "Allow", 
       "Sid": "Allow-User-SendMessage", 
       "Action": [ 
       "sqs:*" 
       ], 
       "Condition": { 
       "IpAddress": { 
        "aws:SourceIp": [ 
        "xxx.xx.xxx.x/xx", 
        "xxx.xx.xxx.x/xx", 
        "xxx.xx.xxx.x/xx" 
        ] 
       } 
       }, 
       "Principal": { 
       "AWS": "*" 
       } 
      } 
      ] 
     } 
     } 
    }, 
    "QueuesPolicy": { 
     "Type": "AWS::IAM::Policy", 
     "Properties": { 
     "PolicyName": "QueuesPolicy", 
     "PolicyDocument": { 
      "Statement": [ 
      { 
       "Action": [ 
       "sqs:AddPermission", 
       "sqs:ChangeMessageVisibility", 
       "sqs:ChangeMessageVisibilityBatch", 
       "sqs:CreateQueue", 
       "sqs:DeleteMessage", 
       "sqs:DeleteMessageBatch", 
       "sqs:DeleteQueue", 
       "sqs:GetQueueAttributes", 
       "sqs:GetQueueUrl", 
       "sqs:ListQueues", 
       "sqs:ListDeadLetterSourceQueues", 
       "sqs:ReceiveMessage", 
       "sqs:RemovePermission", 
       "sqs:SendMessage", 
       "sqs:SendMessageBatch", 
       "sqs:SetQueueAttributes" 
       ], 
       "Resource": [ 
       { 
        "Fn::GetAtt": [ 
        "SQSFooQueue", 
        "Arn" 
        ] 
       } 
       ], 
       "Effect": "Allow" 
      } 
      ] 
     }, 
     "Roles": [ 
      { 
      "Ref": "FooRole" 
      } 
     ] 
     } 
    }, 
    "FooRole": { 
     "Type": "AWS::IAM::Role", 
     "Properties": { 
     "Path": "/", 
     "AssumeRolePolicyDocument": { 
      "Statement": [ 
      { 
       "Action": [ 
       "sts:AssumeRole" 
       ], 
       "Effect": "Allow", 
       "Principal": { 
       "Service": [ 
        "ec2.amazonaws.com" 
       ] 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
+0

似乎'Statement'块*必须*有一个'Action'关键,这可以解释为什么在SQS队列策略它包含的内容似乎是操作的副本。但昨天有人向我解释说,“Condition”实际上是说“限制对SQS队列资源的访问权限给这些IPS,让这些IPS拥有完全访问权限” – Integralist 2014-09-02 08:44:32

回答

1

我会尽量按顺序排列您的问题,但请首先对此代码段进行一般性解释。这可能是基于AWS的应用程序的模板,该应用程序将在与代码片段中的角色关联的实例配置文件下运行,并将使用SQS与已知IP范围中的某个离线云系统进行集成。据推测,它将被更新为使用SDK,但显然无法像通过元数据端点一样容易地获得临时证书。

  1. 队列策略和IAM策略资源引用同一个队列,但它们似乎不是多余的。一个用于匿名用户(IAM策略无法完成),另一个用于您的EC2实例。

  2. 您可以扩展队列策略以涵盖两个明显需求,但我个人更喜欢以委托人为中心的IAM策略。同样,我会使用传统的S3控制选项,例如,只有当您不能使用IAM策略时。但除非您必须使用资源绑定策略,否则它主要是一种偏好。