使用 IAM 角色向在 Amazon EC2 实例上运行的应用程序授予权限 - AWS Identity and Access Management

使用 IAM 角色向在 Amazon EC2 实例上运行的应用程序授予权限

在 EC2 实例上运行的应用程序必须将 AWS 凭证包含在其 AWS API 请求中。您可以让开发人员将 AWS 凭证直接存储在 EC2 实例中,并允许该实例中的应用程序使用这些凭证。但开发人员随后必须管理凭证,确保他们能安全地将凭证传递给每个实例,并在需要轮换凭证时更新每个 EC2 实例。这需要进行大量的额外工作。

相反,您可以且应使用 IAM 角色管理在 EC2 实例上运行的应用程序的临时凭证。在使用角色时,您不需要将长期凭证 (如用户名和密码或访问密钥) 分配给 EC2 实例。相反,角色可提供临时权限供应用程序在调用其他 AWS 资源时使用。当您启动 EC2 实例时,可指定要与实例关联的 IAM 角色。然后,实例上运行的应用程序可使用角色提供的临时凭证对 API 请求进行签名。

若要使用角色向 EC2 实例上运行的应用程序授予权限,需要进行一点额外配置。EC2 实例上运行的应用程序由虚拟化操作系统从 AWS 中提取。因为存在这一额外分离操作,所以需要执行一个附加步骤将 AWS 角色及其关联权限分配给 EC2 实例,并使这些权限对其应用程序可用。此额外步骤是创建要附加到实例的实例配置文件。实例配置文件包含角色,并且可以为实例上运行的应用程序提供角色的临时凭证。然后,可以在应用程序的 API 调用中使用这些临时凭证访问资源,以及将访问限制为仅角色指定的那些资源。请注意,一次只能将一个角色分配给 EC2 实例,实例上的所有应用程序都共享相同的角色和权限。

以这种方式使用该角色拥有多种优势。因为角色凭证是临时的,并且会自动轮换,所以您不必管理凭证,也不必担心长期安全风险。此外,如果您对多个实例使用单个角色,则可以对该角色进行更改,而此更改会自动传播到所有实例。

注意

通常会在您启动 EC2 实例时向它分配角色,不过也可以向已在运行的 EC2 实例附加角色。要了解如何将角色附加到运行的实例,请参阅适用于 Amazon EC2 的 IAM 角色

EC2 实例的角色的工作方式?

在下图中,一名开发人员在 EC2 实例上运行一个应用程序,该应用程序要求访问名为 photos 的 S3 存储桶。管理员创建 Get-pics 服务角色并将该角色附加到 EC2 实例。该角色包括一个权限策略,该策略授予对指定 S3 存储桶的只读访问权限。它还包括一个信任策略,该策略允许 EC2 实例担任该角色并检索临时凭证。在该实例上运行应用程序时,应用程序可以使用该角色的临时凭证访问照片存储桶。管理员不必向开发人员授予访问照片存储桶的权限,开发人员完全不必共享或管理凭证。


        访问 AWS 资源的 EC2 实例上的应用程序
  1. 管理员使用 IAM 创建 Get-pics 角色。在角色的信任策略中,管理员指定仅 EC2 实例能够担任该角色。在角色的权限策略中,管理员为 photos 存储桶指定只读权限。

  2. 开发人员启动 EC2 实例,并向该实例分配 Get-pics 角色。

    注意

    如果您使用 IAM 控制台,则会为您管理实例配置文件,该配置文件大部分对您是透明的。但是,如果您使用 AWS CLI 或 API 创建和管理角色和 EC2 实例,则必须创建实例配置文件并采用单独步骤将角色分配给它。随后在启动实例时,您必须指定实例配置文件名称而不是角色名称。

  3. 应用程序在运行时会从 Amazon EC2 实例元数据获取临时安全凭证,如从实例元数据检索安全凭证中所述。这些是临时安全凭证,用于表示角色,在有限时间段内有效。

    使用某些 AWS 开发工具包,开发人员可以使用提供程序以透明方式管理临时安全凭证。(各 AWS 开发工具包的文档介绍该软件开发工具包支持的证书管理功能。)

    应用程序也可以直接从 EC2 实例的实例元数据中获取临时凭证。凭证和相关值可从元数据的 iam/security-credentials/role-name 类别(在本例中为 iam/security-credentials/Get-pics)获得。如果应用程序从实例元数据获取凭证,则它可对凭证进行缓存。

  4. 通过使用检索到的临时凭证,应用程序可以访问照片存储桶。由于附加到 Get-pics 角色的策略,应用程序具有只读权限。

    实例上提供的临时安全凭证会在过期之前自动轮换,因此始终具有有效的凭证集。应用程序只需要确保在当前凭证过期之前从实例元数据获取新的凭证集。可以使用 AWS 开发工具包管理凭证,这样应用程序就不需要包含额外的逻辑来刷新凭证。例如,使用实例配置文件凭证提供程序实例化客户端。但是,如果应用程序从实例元数据获取临时安全凭证并对它们进行缓存,则它应在当前凭证集过期之前,每隔一小时 (或至少每隔 15 分钟) 获取刷新的凭证集。在 iam/security-credentials/role-name 类别中返回的信息中包含过期时间。

在 Amazon EC2 中使用角色所需的权限

要启动具有角色的实例,开发人员必须有启动 EC2 实例的权限和传递 IAM 角色的权限。

以下示例策略可以实现使用 AWS Management Console发布引用角色的实例。策略包含通配符 (*) 以允许用户传递任意角色并执行所有 Amazon EC2 操作。用户可以通过 ListInstanceProfiles 操作浏览 AWS 账户中的所有角色。

例 授权用户使用 Amazon EC2 控制台启动具有任何角色的实例的示例策略

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "iam:PassRole", "iam:ListInstanceProfiles", "ec2:*" ], "Resource": "*" }] }

限制哪些角色能够传递到 EC2 实例(使用 PassRole)

您可以使用 PassRole 权限来限制用户启动实例时可以传递给 EC2 实例的角色。这有助于防止用户运行具有超出用户获授权限的应用程序 即防止用户获取提升的权限。例如,假设用户 Alice 仅有权启动 EC2 实例并使用 Amazon S3 存储桶,但是她传递给 EC2 实例的角色有权使用 IAM 和 Amazon DynamoDB。在这种情况下,Alice 或许能够启动实例,登录它,获取临时安全凭证,然后执行未向她授权的 IAM 或 DynamoDB 操作。

要限制用户可以传递给 EC2 实例的角色,您可创建一个允许执行 PassRole 操作的策略。然后,将策略附加到将启动 EC2 实例的用户(或该用户所属的 IAM 组)。在策略的 Resource 元素中,列出允许用户传递给 EC2 实例的角色。用户启动一个实例并将角色与该实例关联时,Amazon EC2 会检查是否允许用户传递该角色。当然,您还应确保用户可传递的角色不包含用户不应拥有的权限。

注意

就像 PassRoleRunInstances 那样,ListInstanceProfiles 不是 API 操作。相反,它是只要有角色 ARN 作为参数传递给 API 时,AWS 便会检查的权限 (或者控制台代表用户这么做)。它帮助管理员控制哪些角色可以由哪些用户传递。在这种情况下,它可确保用户可以将特定角色附加到 Amazon EC2 实例。

例 通过特定角色向用户授予启动 EC2 实例的权限的示例策略

通过以下示例策略,用户可以使用 Amazon EC2 API,通过角色来启动实例。Resource 元素指定角色的 Amazon 资源名称 (ARN)。通过指定 ARN,该策略授予用户仅传递 Get-pics 角色的权限。如果在启动实例时用户尝试指定其他角色,则该操作会失败。用户拥有运行任何实例的权限,无论他们是否传递角色。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:role/Get-pics" } ] }

允许实例配置文件角色切换到另一个账户中的角色

您可以允许 Amazon EC2 实例上运行的应用程序在另一个账户中运行命令。为此,您必须允许第一个账户中的 EC2 实例角色切换到第二个账户中的角色。

假设您使用两个 AWS 账户,并希望允许 Amazon EC2 实例上运行的应用程序在两个账户中运行 AWS CLI 命令。假设 EC2 实例位于 111111111111 账户中。该实例包含 abcd 实例配置文件角色,以允许应用程序对同一 111111111111 账户中的 my-bucket-1 存储桶执行只读 Amazon S3 任务。不过,还必须允许应用程序担任 efgh 跨账户角色以访问 222222222222 账户中的 my-bucket-2 Amazon S3 存储桶。

abcd EC2 实例配置文件角色必须具有以下权限策略,以允许应用程序访问 my-bucket-1 Amazon S3 存储桶:

账户 111111111111 abcd 角色权限策略

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccountLevelS3Actions", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets", "s3:HeadBucket" ], "Resource": "*" }, { "Sid": "AllowListAndReadS3ActionOnMyBucket", "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::my-bucket-1/*", "arn:aws:s3:::my-bucket-1" ] }, { "Sid": "AllowIPToAssumeCrossAccountRole", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::222222222222:role/efgh" } ] }

abcd 角色必须信任 Amazon EC2 服务以担任该角色。为此,abcd 角色必须具有以下信任策略:

账户 111111111111 abcd 角色信任策略

{ "Version": "2012-10-17", "Statement": [ { "Sid": "abcdTrustPolicy", "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": {"Service": "ec2.amazonaws.com"} } ] }

假设 efgh 跨账户角色允许对同一 222222222222 账户中的 my-bucket-2 存储桶执行只读 Amazon S3 任务。为此,efgh 跨账户角色必须具有以下权限策略:

账户 222222222222 efgh 角色权限策略

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccountLevelS3Actions", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets", "s3:HeadBucket" ], "Resource": "*" }, { "Sid": "AllowListAndReadS3ActionOnMyBucket", "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::my-bucket-2/*", "arn:aws:s3:::my-bucket-2" ] } ] }

efgh 角色必须信任 abcd 实例配置文件角色以担任该角色。为此,efgh 角色必须具有以下信任策略:

账户 222222222222 efgh 角色信任策略

{ "Version": "2012-10-17", "Statement": [ { "Sid": "efghTrustPolicy", "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": {"AWS": "arn:aws:iam::111111111111:role/abcd"} } ] }

怎样入门?

为了理解角色如何在 EC2 实例中起作用,您需要使用 IAM 控制台创建一个角色,启动使用该角色的 EC2 实例,然后检查正在运行的实例。您可以检查实例元数据,以了解如何为实例提供角色的临时凭证。也可以了解实例上运行的应用程序如何使用角色。使用以下资源了解更多信息。

有关创建角色或适用于 EC2 实例的角色的更多信息,请参阅以下信息: