使用策略控制对 AWS 资源的访问。 - AWS Identity and Access Management

使用策略控制对 AWS 资源的访问。

您可以使用策略控制对 IAM 或所有 AWS 中的资源的访问。

要使用标签在 AWS 中控制访问,您必须了解 AWS 如何授予访问权限。AWS 由资源集合组成。IAM 用户是一种资源。Amazon S3 存储桶是一种资源。在使用 AWS API、AWS CLI 或 AWS Management Console 执行操作(如创建用户)时,您将为该操作发送一个请求。您的请求指定操作、资源、委托人实体(用户或角色)、委托人账户 以及所需的任何请求信息。所有这些信息提供了上下文

AWS然后, 检查是否对您 (委托人) 进行身份验证 (登录) 和授权 (具有权限),以便对指定的资源执行指定的操作。在授权期间,AWS 检查应用于请求上下文的所有策略。大多数策略作为 JSON 文档存储在 AWS 中,并指定委托人实体的权限。有关策略类型和用法的更多信息,请参阅IAM 中的策略和权限。

AWS只有在策略允许请求的每个部分时, 才会授权该请求。要查看该过程的图表,请参阅了解 IAM 的工作方式。有关 AWS 如何确定是否允许请求的详细信息,请参阅策略评估逻辑

在创建 IAM 策略时,您可以控制对以下内容的访问:

  • 委托人 - 控制允许发出请求的人员(委托人)执行哪些操作。

  • IAM 身份 - 控制可访问哪些 IAM 身份(用户组、用户和角色)以及如何进行访问。

  • IAM 策略 - 控制哪些用户可以创建、编辑和删除客户托管策略,以及哪些用户可以附加和分离所有托管策略。

  • AWS 资源 - 控制哪些用户有权使用基于身份的策略或基于资源的策略访问资源。

  • AWS 账户 - 控制是否仅允许特定账户的成员发出请求。

通过使用策略,您可以指定哪些用户有权访问 AWS 资源,以及他们可以对这些资源执行哪些操作。每个 IAM 用户在一开始都没有许可。换而言之,在默认状态下,用户什么都不能做,甚至不能查看自己的访问密钥。要为用户授予执行某些操作的权限,您可以为用户添加权限 (即,将策略附加到用户)。或者,您可以将用户添加到具有所需权限的用户组中。

例如,您可能授予用户列出自己的访问密钥的许可。您可能扩展该许可,并让每位用户创建、更新和删除自己的密钥。

当您授予一个用户组许可时,用户组内的全部用户都会获得那些许可。例如,您可以向管理员用户组授予对任意 AWS 账户资源执行任意 IAM 操作的权限。另一个示例:您可以授予 Managers 用户组描述 AWS 账户的 Amazon EC2 实例的权限。

有关如何向用户、用户组和角色委派基本权限的信息,请参阅 访问 IAM 资源所需的权限。有关说明基本权限的更多策略示例,请参阅管理 IAM 资源的策略示例

控制 委托人进行的访问

您可以使用策略控制允许发出请求的人员(委托人)执行哪些操作。为此,您必须将基于身份的策略附加到此人的身份(用户、用户组或角色)。您还可以使用权限边界以设置实体(用户或角色)可以拥有的最大权限。

例如,假定您希望用户 Zhang Wei 可以完全访问 CloudWatch、Amazon DynamoDB、Amazon EC2 和 Amazon S3。您可以创建两个不同的策略,以便以后其他用户需要一组权限时为其分配其中的一个策略。或者,您可以将这两个权限放在单个策略中,然后将该策略附加到名为 Zhang Wei 的 IAM 用户。您还可以将一个策略附加到 Zhang 所属的用户组,或者附加到 Zhang 可以担任的角色。因此,在 Zhang 查看 S3 存储桶内容时,将允许他的请求。如果他尝试创建新的 IAM 用户,则会拒绝他的请求,因为他没有权限。

您可以对 Zhang 使用权限边界,以确保他无法访问 CompanyConfidential S3 存储桶。为此,请确定您希望 Zhang 具有的最大权限。在这种情况下,您使用权限策略控制他执行的操作。在这里,您只希望他无法访问机密存储桶。因此,您使用以下策略来定义 Zhang 的边界,以允许对 Amazon S3 和一些其他服务执行所有 AWS 操作,但拒绝访问 CompanyConfidential S3 存储桶。由于权限边界不允许任何 IAM 操作,它可防止 Zhang 删除他的(或任何人的)边界。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "SomeServices", "Effect": "Allow", "Action": [ "cloudwatch:*", "dynamodb:*", "ec2:*", "s3:*" ], "Resource": "*" }, { "Sid": "NoConfidentialBucket", "Effect": "Deny", "Action": "s3:*", "Resource": [ "arn:aws:s3:::CompanyConfidential/*", "arn:aws:s3:::CompanyConfidential" ] } ] }

当您分配此类策略作为用户的权限边界时,请记住,它不授予任何权限。它设置基于身份的策略可以授予 IAM 实体的最大权限。有关权限边界的更多信息,请参阅IAM 实体的权限边界

有关上述过程的详细信息,请参阅以下资源:

控制对身份的访问

您可以通过用户组创建附加到所有用户的 IAM 策略,以使用该策略控制您的用户可对某个身份执行哪些操作。为此,请创建一个策略以限制可对某个身份执行哪些操作,以及哪些用户可以访问该身份。

例如,您可以创建一个名为 AllUsers 的组,然后将该用户组附加到所有用户。在创建该用户组时,您可以为所有用户授予访问权限以轮换其凭证,如前一节中所述。然后,您可以创建一个策略,以便拒绝访问以禁止更改该用户组,除非在策略条件中包含用户名。但是,该策略部分仅拒绝列出的用户以外的任何人进行访问。您还必须包含相应的权限,以允许该用户组中的所有用户执行所有用户组管理操作。最后,您将该策略附加到该用户组,以便将其应用于所有用户。因此,在策略中未指定的用户尝试更改该用户组时,将拒绝请求。

使用可视化编辑器创建该策略

  1. 登录 AWS Management Console,打开 IAM 控制台 https://console.aws.amazon.com/iam/

  2. 在左侧的导航窗格中,选择策略

    如果这是您首次选择 Policies,则会显示 Welcome to Managed Policies 页面。选择 Get Started

  3. 选择创建策略

  4. 可视化编辑器选项卡上,选择选择服务以开始使用。然后,选择 IAM

  5. 选择 Select actions (选择操作),然后在搜索框中键入 group。可视化编辑器将显示包含 group 一词的所有 IAM 操作。选中所有复选框。

  6. 选择资源以指定您的策略的资源。根据选择的操作,将会看到 groupgroup-pathuser 资源类型。

    • group - 选择 Add ARN(添加 ARN)。对于资源,选中任意旁边的复选框。对于 Group Name With Path(具有路径的组名称),键入用户组名称 AllUsers。然后,选择添加

    • group-path - 选中 Any(任意)旁边的复选框。

    • user - 选中 Any(任意)旁边的复选框。

    您选择的操作之一 (ListGroups) 不支持使用特定的资源。您不需要为该操作选择所有资源。在 JSON 选项卡上保存或查看您的策略时,您可以看到 IAM 自动创建新的权限块,以便为所有资源授予该操作权限。

  7. 要添加其他权限块,请选择添加额外的权限

  8. 选择 Choose a service(选择服务),然后选择 IAM

  9. 选择选择操作,然后选择切换到拒绝权限。在执行该操作时,将使用整个块拒绝权限。

  10. 在搜索框中,键入 group。可视化编辑器将显示包含 group 一词的所有 IAM 操作。选中以下操作旁边的复选框:

    • CreateGroup

    • DeleteGroup

    • RemoveUserFromGroup

    • AttachGroupPolicy

    • DeleteGroupPolicy

    • DetachGroupPolicy

    • PutGroupPolicy

    • UpdateGroup

  11. 选择资源以指定您的策略的资源。根据选择的操作,将会看到 group 资源类型。选择 Add ARN (添加 ARN)。对于资源,选中任意旁边的复选框。对于 Group Name With Path(具有路径的组名称),键入用户组名称 AllUsers。然后,选择添加

  12. 选择指定请求条件 (可选),然后选择添加条件。使用以下值填写表单:

    • Key - 选择 aws:username

    • Qualifier(限定符)- 选择 Default(默认值)

    • Operator(运算符)- 选择 StringNotEquals

    • Value(值)- 键入 srodriguez,然后选择 Add another condition value(添加另一个条件值)。键入 mjackson,然后选择 Add another condition value (添加另一个条件值)。键入 adesai,然后选择 Add (添加)

    在列表中不包含进行调用的用户时,该条件确保拒绝访问指定的用户组管理操作。由于这会显式拒绝权限,它将覆盖前面允许这些用户调用这些操作的块。不会拒绝列表中的用户进行访问,并在第一个权限块中为他们授予权限,因此,他们可以完全管理该用户组。

  13. 完成后,选择查看策略

    注意

    您可以随时在可视化编辑器JSON 选项卡之间切换。不过,如果您进行更改或在可视化编辑器选项卡中选择 Review policy (查看策略),IAM 可能会调整您的策略结构以针对可视化编辑器进行优化。有关更多信息,请参阅 调整策略结构

  14. Review policy (查看策略)页面上,对于 Name (名称),键入 LimitAllUserGroupManagement。对于描述,请键入 Allows all users read-only access to a specific user group, and allows only specific users access to make changes to the user group。查看策略摘要以确保您授予了所需的权限。然后,选择创建策略以保存新策略。

  15. 将策略附加到您的用户组。有关更多信息,请参阅 添加和删除 IAM 身份权限

或者,您也可以使用该示例 JSON 策略文档创建相同的策略。要查看该 JSON 策略,请参阅 IAM:允许特定的 IAM 用户以编程方式和在控制台中管理组。有关使用 JSON 文档创建策略的详细说明,请参阅在“JSON”选项卡上创建策略

控制对策略的访问

您可以控制您的用户如何应用 AWS 托管策略。为此,请将该策略附加到您的所有用户。理想情况下,您可以使用用户组执行该操作。

例如,您可能会创建一个策略允许用户仅将 IAMUserChangePasswordPowerUserAccess AWS 托管策略附加到新的 IAM 用户、用户组或角色。

对于客户托管策略,您可以控制哪些用户可以创建、更新和删除这些策略。您可以控制哪些用户可以将策略附加到委托人实体(用户组、用户和角色)以及将策略从委托人实体中分离。还可以控制用户可以对哪些实体附加或分离哪些策略。

例如,您可以为账户管理员授予权限以创建、更新和删除策略。然后,您可以为小组负责人或其他有限管理员授予权限,以便将这些策略附加到该有限管理员管理的委托人实体以及将这些策略从这些委托人实体中分离。

有关更多信息,请参阅以下资源:

控制创建、更新和删除客户托管策略的权限

您可以使用 IAM 策略控制谁有权在您的 AWS 账户中创建、更新和删除客户托管策略。以下列表包含与创建、更新和删除策略或策略版本直接相关的 API 操作:

上述列表中的 API 操作对应于可使用 IAM 策略允许或拒绝的操作,即,您可以授予的权限。

考虑以下示例策略。它允许用户创建、更新(即创建新的策略版本)、删除 AWS 账户中的所有客户托管策略以及设置这些策略的默认版本。该示例策略还允许该用户列出策略并获取策略。要了解如何使用该示例 JSON 策略文档创建策略,请参阅在“JSON”选项卡上创建策略

例 允许创建、更新、删除、列出、获取所有策略以及设置这些策略的默认版本的示例策略

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "iam:CreatePolicy", "iam:CreatePolicyVersion", "iam:DeletePolicy", "iam:DeletePolicyVersion", "iam:GetPolicy", "iam:GetPolicyVersion", "iam:ListPolicies", "iam:ListPolicyVersions", "iam:SetDefaultPolicyVersion" ], "Resource": "*" } }

您可以创建限制使用这些 API 操作的策略以仅影响指定的托管策略。例如,您可能希望允许用户设置默认版本和删除策略版本,但是仅允许针对特定客户托管策略执行这些操作。通过在授予这些权限的策略的 Resource 元素中指定策略 ARN,可以实现此目的。

下例所示的策略允许用户删除策略版本和设置默认版本。但是,仅包含路径 /TEAM-A/ 的客户托管策略允许这些操作。客户托管策略 ARN 在策略的 Resource 元素中指定。(在此示例中,ARN 包含一个路径和一个通配符,因而与包含路径 /TEAM-A/ 的所有客户托管策略匹配)。要了解如何使用该示例 JSON 策略文档创建策略,请参阅在“JSON”选项卡上创建策略

有关在客户托管策略名称中使用路径的更多信息,请参阅易记名称和路径

例 仅允许针对特定策略删除策略版本和设置默认版本的示例策略

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "iam:DeletePolicyVersion", "iam:SetDefaultPolicyVersion" ], "Resource": "arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:policy/TEAM-A/*" } }

控制附加和分离托管策略的权限

您还可以使用 IAM 策略仅允许用户使用特定的托管策略。实际上,就是可以控制允许用户向其他委托人实体授予的权限。

以下列表显示与将托管策略附加到委托人实体以及从中分离直接相关的 API 操作:

您可以创建限制使用这些 API 操作的策略以仅影响指定的特定托管策略和/或委托人实体。例如,您可能希望允许用户附加托管策略,但是只能附加您指定的托管策略。或者,您可能希望允许用户附加托管策略,但是只能附加到您指定的委托人实体。

以下示例策略仅允许用户将托管策略附加到包含路径 /TEAM-A/ 的用户组和角色。用户组和角色 ARN 是在策略的 Resource 元素中指定的。(在此示例中,ARN 包含一个路径和一个通配符,因而与包含路径 /TEAM-A/ 的所有用户组和角色匹配。) 要了解如何使用该示例 JSON 策略文档创建策略,请参阅在“JSON”选项卡上创建策略

例 仅允许将托管策略附加到特定用户组或角色的示例策略

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "iam:AttachGroupPolicy", "iam:AttachRolePolicy" ], "Resource": [ "arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:group/TEAM-A/*", "arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:role/TEAM-A/*" ] } }

您可以进一步限制前面示例中的操作,使之仅影响特定的策略。即,通过向策略添加条件,可以控制允许用户附加到其他委托人实体的权限。

以下示例中的条件可确保仅当附加的策略与指定策略之一匹配时才允许 AttachGroupPolicyAttachRolePolicy 权限。该条件使用 iam:PolicyARN 条件键确定允许附加的策略。以下示例策略扩展前一示例。它仅允许用户将包含路径 /TEAM-A/ 的托管策略附加到包含路径 /TEAM-A/ 的用户组和角色。要了解如何使用该示例 JSON 策略文档创建策略,请参阅在“JSON”选项卡上创建策略

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "iam:AttachGroupPolicy", "iam:AttachRolePolicy" ], "Resource": [ "arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:group/TEAM-A/*", "arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:role/TEAM-A/*" ], "Condition": {"ArnLike": {"iam:PolicyARN": "arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:policy/TEAM-A/*"} } } }

该策略使用 ArnLike 条件运算符,因为 ARN 包含通配符。对于特定的 ARN,请使用 ArnEquals 条件运算符。有关 ArnLikeArnEquals 的更多信息,请参阅Amazon Resource Name (ARN) 条件运算符策略元素参考条件类型 部分中的

例如,您可以限制使用操作以仅涉及指定的托管策略。通过在授予这些权限的策略的 Condition 元素中指定策略 ARN,可以实现此目的。例如,指定客户托管策略的 ARN:

"Condition": {"ArnEquals": {"iam:PolicyARN": "arn:aws:iam::123456789012:policy/POLICY-NAME"} }

您还可以在策略的 AWS 元素中指定 Condition; 托管策略的 ARN。AWS 托管策略的 ARN 在策略 ARN 中使用特殊别名 aws 而不是账户 ID,如此示例所示:

"Condition": {"ArnEquals": {"iam:PolicyARN": "arn:aws:iam::aws:policy/AmazonEC2FullAccess"} }

控制对 资源的访问

您可以使用基于身份的策略或基于资源的策略控制对资源的访问。在基于身份的策略中,您将策略附加到一个身份并指定该身份可以访问哪些资源。在基于资源的策略中,您将策略附加到要控制的资源。在该策略中,您指定哪些委托人可以访问该资源。有关这两种类型的策略的更多信息,请参阅基于身份的策略和基于资源的策略

有关更多信息,请参阅以下资源:

资源创建者不会自动拥有许可

如果使用 AWS 账户 根用户凭证登录,您有权对属于该账户的资源执行任何操作。但是,对 IAM 用户来说并非如此。IAM 用户可以获得创建资源的权限,但即使对于该资源,该用户权限也仅限于明确授予的内容。这意味着,您不会仅仅因为创建资源 (如 IAM 角色) 而自动具有编辑或删除该角色的权限。此外,账户所有者或有权管理您的权限的其他用户可以随时撤消您的权限。

控制对特定账户中的委托人的访问

您可以直接向自己账户中的 IAM 用户授予对您的资源的访问权限。如果其他账户中的用户需要访问您的资源,您可以创建 IAM 角色。角色是包含权限但不与特定用户关联的实体。然后,其他账户中的用户可以担任该角色,并根据您为该角色分配的权限访问资源。有关更多信息,请参阅 在您拥有的另一个 AWS 账户中向 IAM 用户提供访问权限

注意

有些服务支持基于资源的策略,如 基于身份的策略和基于资源的策略 中所述(例如 Amazon S3、Amazon SNS 和 Amazon SQS)。对于这些服务,使用角色的替代方法是将策略附加到要共享的资源(存储桶、主题或队列)。基于资源的策略可以指定具有访问资源权限的 AWS 账户。