适用于 Amazon EC2 的 IAM 角色
应用程序必须通过 AWS 凭证签署其 API 请求。因此,如果您是应用程序开发人员,您需要一个策略来为 EC2 实例上运行的应用程序管理凭证。例如,您可以安全地将您的 AWS 凭证分配至实例,从而允许这些实例上的应用程序使用您的凭证签署请求,并保护您的凭证不被其他用户使用。但是,要将凭证安全地分配至每个实例是有难度的,尤其是 AWS 以您的名义创建的实例,例如竞价型实例或 Auto Scaling 组中的实例。当您轮换 AWS 凭证时,您还必须能够更新每项实例上的凭证。
对于您的 Amazon EC2 工作负载,我们建议您使用下述方法检索会话凭证。借助这些凭证,您的工作负载能够发出 AWS API 请求,而无需使用 sts:AssumeRole
来代入已与实例关联的相同角色。除非您需要为基于属性的访问权限控制 (ABAC) 传递会话标签或传递会话策略以进一步限制角色的权限,否则您无需调用角色代入,因为此操作会创建一组新的相同临时角色会话凭证。
如果您的工作负载使用某个角色代入自己,则必须创建明确允许该角色代入自己的信任策略。如果您没有创建信任策略,您会收到 AccessDenied
错误消息。有关更多信息,请参阅《IAM 用户指南》中修改角色信任策略。
我们设计了 IAM 角色,以便您的应用程序能够安全地从实例发出 API 请求,而无需管理应用程序使用的安全凭证。您可以使用 IAM 角色委托授权以发出 API 请求,而不用创建并分配您的 AWS 凭证,如下所示:
-
创建一个 IAM 角色。
-
定义能够担任此角色的账户或 AWS 服务。
-
定义担任角色后应用程序可以使用的 API 操作和资源。
-
在您启动实例时指定角色,或者将角色附加到现有实例。
-
让应用程序检索一组临时证书并使用它们。
例如,您可以使用 IAM 角色为在实例上运行的应用程序授予使用 Amazon S3 中的存储桶所需的权限。您可以通过创建 JSON 格式的策略为 IAM 角色指定权限。这些类似于您为 用户创建的策略。如果您更改了某个角色,系统会将此更改传播到所有实例。
您只能将一个 IAM 角色附加到实例,但可以将同一角色附加到多个实例。有关创建和使用 IAM 角色的更多信息,请参阅 IAM 用户指南 中的角色。
您可以将资源级权限应用到您的 IAM policy,以便控制用户为一个实例附加、替换或分离 IAM 角色的能力。有关更多信息,请参阅 Amazon EC2 API 操作支持的资源级权限 以及以下示例:示例:使用 IAM 角色。
实例配置文件
Amazon EC2 使用实例配置文件 作为 IAM 角色的容器。使用 IAM 控制台创建 IAM 角色时,控制台自动创建实例配置文件,按相应的角色为文件命名。如果您使用 Amazon EC2 控制台启动一个带 IAM 角色的实例或将一个 IAM 角色附加到实例,则请根据实例配置文件名称列表选择角色。
如果您使用 AWS CLI、API 或 AWS 开发工具包创建角色,则是以单独操作的形式创建角色和实例配置文件,可以为它们提供不同的名称。如果您使用 AWS CLI、API 或 AWS 开发工具包启动带有 IAM 角色的实例,或将 IAM 角色附加到实例,请指定实例配置文件名称。
一个实例配置文件只能包含一个 IAM 角色。不能提高此限制。
有关更多信息,请参阅 IAM 用户指南 中的实例配置文件。
实例上的应用程序通过实例元数据条目 iam/security-credentials/
role-name 检索角色提供的安全证书。该应用程序具有使用您通过与角色关联的安全凭证为其定义的操作和资源的权限。这些安全凭证是临时的,我们会自动更换它们。我们会在旧凭证过期前至少五分钟提供可用的新凭证。
如果您使用的服务采用了带有 IAM 角色的实例元数据,请确保服务代表您进行 HTTP 调用时不会泄露您的凭证。可能泄露您的凭证的服务类型包括 HTTP 代理、HTML/CSS 验证程序服务和支持 XML 包含的 XML 处理程序。
以下命令检索名为 s3access
的 IAM 角色的安全证书。
- IMDSv2
-
PS C:\>
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT –Uri http://169.254.169.254/latest/api/token
PS C:\>
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access
- IMDSv1
-
PS C:\>
Invoke-RestMethod –uri http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access
下面是示例输出。
{
"Code" : "Success",
"LastUpdated" : "2012-04-26T16:39:16Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "ASIAIOSFODNN7EXAMPLE",
"SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"Token" : "token",
"Expiration" : "2017-05-17T15:09:54Z"
}
对于实例上运行的应用程序、AWS CLI 和 Tools for Windows PowerShell 命令,您无需显式获取临时安全凭证 – AWS开发工具包、AWS CLI 和 Windows PowerShell 工具会自动从 EC2 实例元数据服务中获取凭证并使用这些凭证。要使用临时安全凭证在实例外部发出调用 (例如,为了测试 IAM policy),您必须提供访问密钥、私有密钥和会话令牌。有关更多信息,请参阅 IAM 用户指南中的使用临时安全凭证以请求对 AWS 资源的访问权限。
有关实例元数据的更多信息,请参阅 实例元数据和用户数据。有关实例元数据 IP 地址的信息,请参阅检索实例元数据。
向用户授予将 IAM 角色传递给实例的权限
要支持用户启动带有 IAM 角色的实例或为现有实例替换 IAM 角色,您必须授予用户使用以下 API 操作的权限:
例如,以下 IAM policy 将授权用户启动带有 IAM 角色的实例,或者使用 AWS CLI 为现有实例附加或替换 IAM 角色。
如果您希望策略授予用户对所有角色的访问权限,请将资源指定为策略中的 *
。但是,请考虑最低权限原则作为最佳实践。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:RunInstances",
"ec2:AssociateIamInstanceProfile",
"ec2:ReplaceIamInstanceProfileAssociation"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "arn:aws:iam::123456789012:role/DevTeam*"
}
]
}
要授予用户启动带有 IAM 角色的实例的权限,或使用 Amazon EC2 控制台为现有实例附加或替换 IAM 角色,您必须授予用户使用 iam:ListInstanceProfiles
、iam:PassRole
、ec2:AssociateIamInstanceProfile
和 ec2:ReplaceIamInstanceProfileAssociation
以及他们可能需要的任何其他权限。有关示例策略,请参阅 用于 Amazon EC2 控制台的示例策略。
使用 IAM 角色
在启动过程中或启动之后,您可以创建一个 IAM 角色并将其附加到实例。您也可以为实例替换或分离 IAM 角色。
创建 IAM 角色
您必须先创建 IAM 角色,然后才能启动带有该角色的实例或将其附加到该实例。
- Console
-
使用 IAM 控制台创建 IAM 角色
通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/。
-
在导航窗格中,选择角色,然后选择创建角色。
-
在选择可信实体页面上,选择 AWS 服务,然后选择 EC2 使用案例。选择 Next(下一步)。
-
在添加权限页面上,选择向实例授予对所需资源的访问权限的策略。选择 Next(下一步)。
-
在命名、查看和创建页面上,输入角色的名称和描述。您也可以为角色添加标签。选择 Create role(创建角色)。
- Command line
-
以下示例创建了一个 IAM 角色,并指定允许其使用 Amazon S3 桶的策略。
创建 IAM 角色和实例配置文件(AWS CLI)
-
创建以下信任策略并将其保存在名为 ec2-role-trust-policy.json
的文本文件中。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "ec2.amazonaws.com"},
"Action": "sts:AssumeRole"
}
]
}
-
创建 s3access
角色并指定使用创建 create-role 命令创建的信任策略。
aws iam create-role \
--role-name s3access \
--assume-role-policy-document file://ec2-role-trust-policy.json
响应示例
{
"Role": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
}
}
]
},
"RoleId": "AROAIIZKPBKS2LEXAMPLE",
"CreateDate": "2013-12-12T23:46:37.247Z",
"RoleName": "s3access",
"Path": "/",
"Arn": "arn:aws:iam::123456789012:role/s3access"
}
}
-
创建访问策略并将其保存在名为 ec2-role-access-policy.json
的文本文件中。例如,此策略向在实例上运行的应用程序授予针对 Amazon S3 管理员权限。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:*"],
"Resource": ["*"]
}
]
}
-
使用 put-role-policy 命令将该访问策略附加到角色。
aws iam put-role-policy \
--role-name s3access \
--policy-name S3-Permissions \
--policy-document file://ec2-role-access-policy.json
-
使用 create-instance-profile 命令创建名为 s3access-profile
的实例配置文件。
aws iam create-instance-profile --instance-profile-name s3access-profile
响应示例
{
"InstanceProfile": {
"InstanceProfileId": "AIPAJTLBPJLEGREXAMPLE",
"Roles": [],
"CreateDate": "2013-12-12T23:53:34.093Z",
"InstanceProfileName": "s3access-profile",
"Path": "/",
"Arn": "arn:aws:iam::123456789012:instance-profile/s3access-profile"
}
}
-
将 s3access
角色添加到 s3access-profile
实例配置文件。
aws iam add-role-to-instance-profile \
--instance-profile-name s3access-profile \
--role-name s3access
或者,您可以使用以下 AWS Tools for Windows PowerShell 命令:
启动带有 IAM 角色的实例
创建一个 IAM 角色之后,您可以启动实例,并在启动过程中将该角色与实例关联。
创建 IAM 角色后,可能需要几秒钟时间来让权限传播。若您第一次尝试启动带角色的实例失败,请等待几秒然后重试。有关更多信息,请参阅《IAM 用户指南》中的IAM 角色故障排除。
- New console
-
启动带有 IAM 角色的实例(控制台)
-
按照程序启动实例。
-
展开 Advanced details(高级详细信息),对于 IAM instance profile(IAM 实例配置文件),选择您创建的 IAM 角色。
IAM instance profile(IAM 实例配置文件)列表显示您在创建 IAM 角色时创建的实例配置文件的名称。如果您是使用控制台创建的 IAM 角色,则为您创建了实例配置文件,并提供了与角色相同的名称。如果使用 AWS CLI、API 或 AWS 开发工具包创建了 IAM 角色,则可能对实例配置文件指定了不同名称。
-
为实例配置您需要的其他任何详细信息或接受默认设置,然后选择一个密钥对。有关启动实例向导中字段的信息,请参阅 使用定义的参数启动实例。
-
在 Summary(摘要)面板中查看实例配置,然后选择 Launch instance(启动实例)。
-
如果您的应用程序使用的是 Amazon EC2 API 操作,请检索实例中可用的 AWS 安全凭证,并使用它们签署请求。AWS 开发工具包将为您执行此操作。
IMDSv2IMDSv1
- IMDSv2
PS C:\>
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT –Uri http://169.254.169.254/latest/api/token
PS C:\>
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name
- IMDSv1
PS C:\>
Invoke-RestMethod –uri http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name
- Old console
-
启动带有 IAM 角色的实例(控制台)
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/。
-
在控制面板上,选择启动实例。
-
选择 AMI 和实例类型,然后选择 Next: Configure Instance Details。
-
在 Configure Instance Details (配置实例详细信息) 页面上,为 IAM role (IAM 角色) 选择您创建的 IAM 角色。
IAM role (IAM 角色) 列表显示您在创建 IAM 角色时创建的实例配置文件的名称。如果您是使用控制台创建的 IAM 角色,则为您创建了实例配置文件,并提供了与角色相同的名称。如果使用 AWS CLI、API 或 AWS 开发工具包创建了 IAM 角色,则可能对实例配置文件指定了不同名称。
-
配置其他详细信息,然后按照向导的其余说明操作,或选择 Review and Launch 接受默认设置并直接转到 Review Instance Launch 页面。
-
检查设置,然后选择 Launch 以选择密钥对并启动实例。
-
如果您的应用程序使用的是 Amazon EC2 API 操作,请检索实例中可用的 AWS 安全凭证,并使用它们签署请求。AWS 开发工具包将为您执行此操作。
IMDSv2IMDSv1
- IMDSv2
PS C:\>
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT –Uri http://169.254.169.254/latest/api/token
PS C:\>
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name
- IMDSv1
PS C:\>
Invoke-RestMethod –uri http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name
- Command line
-
您可以在启动过程中使用 AWS CLI 将角色关联到实例。您必须在命令中指定实例配置文件。
启动带有 IAM 角色的实例(AWS CLI)
-
使用 run-instances 命令启动使用实例配置文件的实例。以下示例演示如何使用实例配置启动实例。
aws ec2 run-instances \
--image-id ami-11aa22bb \
--iam-instance-profile Name="s3access-profile" \
--key-name my-key-pair \
--security-groups my-security-group \
--subnet-id subnet-1a2b3c4d
或者,使用 New-EC2Instance Tools for Windows PowerShell 命令。
-
如果您的应用程序使用的是 Amazon EC2 API 操作,请检索实例中可用的 AWS 安全凭证,并使用它们签署请求。AWS 开发工具包将为您执行此操作。
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
role_name
将 IAM 角色附加到实例
要将 IAM 角色附加到没有角色的实例,该实例可以处于 stopped
或 running
状态。
- Console
-
将 IAM 角色附加到实例
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/。
-
在导航窗格中,选择 Instances (实例)。
-
选择实例,然后依次选择 Actions (操作)、Security (安全)、Modify IAM role (修改 IAM 角色)。
-
选择要附加到您的实例的 IAM 角色,然后选择 Save (保存)。
- Command line
-
要将 IAM 角色附加到实例(AWS CLI)
-
如果需要,请描述您的实例以获取要附加角色的实例的 ID。
aws ec2 describe-instances
-
使用 associate-iam-instance-profile 并通过指定实例配置文件,将 IAM 角色附加到实例。您可以使用实例配置文件的 Amazon Resource Name (ARN),或者使用实例的名称。
aws ec2 associate-iam-instance-profile \
--instance-id i-1234567890abcdef0
\
--iam-instance-profile Name="TestRole-1
"
响应示例
{
"IamInstanceProfileAssociation": {
"InstanceId": "i-1234567890abcdef0",
"State": "associating",
"AssociationId": "iip-assoc-0dbd8529a48294120",
"IamInstanceProfile": {
"Id": "AIPAJLNLDX3AMYZNWYYAY",
"Arn": "arn:aws:iam::123456789012:instance-profile/TestRole-1"
}
}
}
或者,使用以下 Tools for Windows PowerShell 命令:
替换 IAM 角色
要替换已附加了 IAM 角色的实例上的 IAM 角色,实例必须处于 running
状态。如果要更改实例的 IAM 角色而先不分离现有角色,则您可以执行此操作。例如,您可以执行此操作,以确保正在实例上运行的应用程序所执行的 API 操作不会被中断。
- Console
-
替换实例的 IAM 角色
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/。
-
在导航窗格中,选择 Instances (实例)。
-
选择实例,然后依次选择 Actions (操作)、Security (安全)、Modify IAM role (修改 IAM 角色)。
-
选择要附加到您的实例的 IAM 角色,然后选择 Save (保存)。
- Command line
-
要替换实例的 IAM 角色(AWS CLI)
-
如果需要,请描述您的 IAM 实例配置文件关联情况,以获取要替换的 IAM 实例配置文件的关联 ID。
aws ec2 describe-iam-instance-profile-associations
-
使用 replace-iam-instance-profile-association 命令并通过为现有实例配置文件或 ARN 指定关联 ID 或指定替换实例配置文件的名称,替换 IAM 实例配置文件。
aws ec2 replace-iam-instance-profile-association \
--association-id iip-assoc-0044d817db6c0a4ba
\
--iam-instance-profile Name="TestRole-2
"
响应示例
{
"IamInstanceProfileAssociation": {
"InstanceId": "i-087711ddaf98f9489",
"State": "associating",
"AssociationId": "iip-assoc-09654be48e33b91e0",
"IamInstanceProfile": {
"Id": "AIPAJCJEDKX7QYHWYK7GS",
"Arn": "arn:aws:iam::123456789012:instance-profile/TestRole-2"
}
}
}
或者,使用以下 Tools for Windows PowerShell 命令:
分离 IAM 角色
您可以将 IAM 角色从正在运行或已停止的实例上分离。
- Console
-
从实例中分离 IAM 角色
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/。
-
在导航窗格中,选择 Instances (实例)。
-
选择实例,然后依次选择 Actions (操作)、Security (安全)、Modify IAM role (修改 IAM 角色)。
-
对于 IAM 角色,请选择无 IAM 角色。选择 Save (保存)。
-
在确认对话框中,输入分离,然后选择分离。
- Command line
-
从实例中分离 IAM 角色(AWS CLI)
-
如果需要,使用 describe-iam-instance-profile-associations 描述您的 IAM 实例配置文件关联,并获取要分离的 IAM 实例配置文件的关联 ID。
aws ec2 describe-iam-instance-profile-associations
响应示例
{
"IamInstanceProfileAssociations": [
{
"InstanceId": "i-088ce778fbfeb4361",
"State": "associated",
"AssociationId": "iip-assoc-0044d817db6c0a4ba",
"IamInstanceProfile": {
"Id": "AIPAJEDNCAA64SSD265D6",
"Arn": "arn:aws:iam::123456789012:instance-profile/TestRole-2"
}
}
]
}
-
使用 disassociate-iam-instance-profile 命令分离使用其关联 ID 的 IAM 实例配置文件。
aws ec2 disassociate-iam-instance-profile --association-id iip-assoc-0044d817db6c0a4ba
响应示例
{
"IamInstanceProfileAssociation": {
"InstanceId": "i-087711ddaf98f9489",
"State": "disassociating",
"AssociationId": "iip-assoc-0044d817db6c0a4ba",
"IamInstanceProfile": {
"Id": "AIPAJEDNCAA64SSD265D6",
"Arn": "arn:aws:iam::123456789012:instance-profile/TestRole-2"
}
}
}
或者,使用以下 Tools for Windows PowerShell 命令:
根据访问活动为您的 IAM 角色生成策略
首次为应用程序创建 IAM 角色时,有时授予的权限可能超出所需权限。在生产环境中启动应用程序之前,您可以根据 IAM 角色的访问活动生成 IAM policy。IAM 访问分析器会查看您的 AWS CloudTrail 日志并生成一个策略模板,其中包含角色在指定日期范围内使用的权限。您可以使用模板创建具有精细权限的托管策略,然后将其附加到 IAM 角色。这样,您仅需授予角色与特定使用案例中的 AWS 资源进行交互所需的权限。这可帮助您遵循授予最低权限的最佳实践。要了解更多信息,请参阅 IAM 用户指南中的基于访问活动生成策略。