AWS资源策略中“资源”的目的是什么?

时间:2019-09-20 09:02:13

标签: amazon-web-services amazon-iam

按照标题,当资源策略已经将要应用于特定资源时,在定义资源策略时具有资源字段的目的是什么。

例如,在此tutorial aws中,以下策略被定义为队列的附件。 resource字段的用途是什么?

{
 "Version": "2008-10-17",
 "Id": "example-ID",
 "Statement": [
  {
   "Sid": "example-statement-ID",
   "Effect": "Allow",
   "Principal": {
     "AWS": "*"  
   },
   "Action": [
    "SQS:SendMessage"
   ],
   "Resource": "arn:aws:sqs:REGION:ACCOUNT-ID:QUEUENAMEHERE",
   "Condition": {
      "ArnLike": { "aws:SourceArn": "arn:aws:s3:*:*:bucket-name" }
   }
  }
 ]
}

2 个答案:

答案 0 :(得分:2)

S3是您需要在策略中包括资源语句的好例子。假设您要在S3存储桶上有一个上传位置。

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"Upload",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:PutObject"],
      "Resource":["arn:aws:s3:::examplebucket/uploads/*"]
    }
  ]
}

在这些情况下,您确实不想将资源默认为存储桶,因为这可能会意外导致全局访问。最好确保用户清楚地了解允许或拒绝什么访问。

但是,为什么在不需要SQS的资源策略中将其设置为必需?为此,让我们深入研究如何使用资源策略。

您可以通过两种方式授予对资源的访问权限:

  1. 用于IAM负责人(用户和角色)的基于身份的策略。
  2. 基于资源的政策

要理解的重要部分是如何使用资源策略? IAM实际上在策略评估逻辑中将资源策略用于授权。换句话说,资源不负责留给IAM(身份和访问管理)的实际授权。

由于IAM要求每个策略语句都必须具有Resource或NotResource,这意味着如果缺少资源,则服务在将其发送到IAM时需要添加资源。因此,让我们从设计的角度看待服务缺失时添加服务的含义。

  1. 该服务不再需要仅验证策略正确。
  2. 如果语句中缺少资源,则服务需要先更新策略,然后再将其发送给IAM。
  3. 现在有两种不同版本的资源策略。用户创建的一个用于编辑,然后发送给IAM。
  4. 通过将策略附加到错误的资源,增加了用户出错和意外打开访问的可能性。如果我们修改问题中的策略声明,然后删除资源和条件声明,那么我们就有一个非常开放的策略。这很容易被附加到错误的资源上,尤其是来自CLI或terraform的资源。
  {
   "Sid": "example-statement-ID",
   "Effect": "Allow",
   "Principal": {
     "AWS": "*"  
   },
   "Action": [
    "*"
   ]
  }

请注意,我基于对AWS如何实施访问管理的理解,从一般设计的角度回答了这一问题。 AWS实施该系统的方式可能有所不同,但我对此表示怀疑,因为确实需要针对性能优化策略评估逻辑,因此最好在一项服务(IAM)中而不是在每项服务中做到这一点。

希望有帮助。

如果您对Policy Evaluation Logic的详细信息感兴趣,请额外阅读。

您可以拒绝6种访问方式:

  1. 身份政策
  2. 资源政策
  3. 组织政策(如果您的帐户是组织的一部分)
  4. IAM权限边界(如果已设置)
  5. 会话假定策略(如果使用)
  6. 如果没有允许政策,则很简单

这是完整的IAM策略评估逻辑工作流程。 The complete IAM policy evaluation

答案 1 :(得分:0)

有您定义的政策。

  • 政策应用资源:A,我不知道您将在哪里应用它。
  • 策略中的资源:B,arn:aws:sqs:REGION:ACCOUNT-ID:QUEUENAMEHERE

一旦将策略应用于ec2之类的A实例之类的服务,则该实例只能通过资源SQS:SendMessage来完成B。 A和B完全不同。


如果要限制对资源A的访问权限,该资源不应访问其他资源,而只能访问已定义的资源,则必须定义resource,例如{{ 1}}。

您的策略仅对该资源B有效,而不是您应用的资源B