assume role
是 AWS (亚马逊网络服务) Security Token Service (STS) 提供的一项功能。使用此功能,您可以请求临时的、有限权限的 AWS 凭据,以代表其他用户角色执行 AWS 服务请求。这是一个为了增强安全性并限制权限的策略,允许用户或服务代表一个角色来执行特定任务,而不必直接将长期 AWS 访问凭据授予该用户或服务。
以下是 assume_role
的基本用法和关键概念:
**角色 (Role)**:在 AWS IAM (Identity and Access Management) 中定义的实体。角色不是与特定用户或组关联的,而是与权限策略关联的。这些策略定义了角色可以和不能做什么。
**信任策略 (Trust Policy)**:定义了哪些实体可以假设此角色。例如,您可以创建一个信任策略,允许特定的 AWS 账户的用户代表这个角色。
**权限策略 (Permission Policy)**:定义了角色可以执行的操作和访问的资源。
Assuming a Role:当实体(如用户或 AWS 服务)想要代表角色执行操作时,他们需要”假设”该角色。这是通过调用
AssumeRole
API 来完成的。**临时安全凭据 (Temporary Security Credentials)**:当角色被假设时,STS 返回一个临时的安全凭据,它包括:Access Key ID、Secret Access Key 和 Session Token。这些凭据具有与角色相关的权限,并且在一段时间后会过期。
用例:
- 跨账户访问:例如,如果您有两个 AWS 账户 A 和 B,您可以在 A 账户中的用户代表 B 账户中的角色,从而访问 B 账户的资源。
- 临时权限提升:用户可能需要临时访问某些资源,例如为了调试或管理任务。
- 应用程序与服务:应用程序可以假设一个角色来访问 AWS 资源,而不是直接使用固定的 AWS 凭据。
安全性:由于返回的是临时凭据,即使这些凭据被泄露,它们也只在有限的时间内有效,从而减少了潜在的风险。
当然可以。以下是使用 assume_role
的例子,分别提供了 boto3
(Python SDK) 和 AWS CLI 的代码。
1. boto3
假设你想要代表角色 MyS3ReadOnlyRole
,这个角色在账户 123456789012
中。以下是如何使用 boto3
获取这个角色的临时凭据:
import boto3
# 创建 STS 客户端
sts_client = boto3.client('sts')
# 假设角色
response = sts_client.assume_role(
RoleArn="arn:aws:iam::123456789012:role/MyS3ReadOnlyRole",
RoleSessionName="MySessionName"
)
# 从响应中获取临时凭据
credentials = response['Credentials']
print("AccessKeyId:", credentials['AccessKeyId'])
print("SecretAccessKey:", credentials['SecretAccessKey'])
print("SessionToken:", credentials['SessionToken'])
# 使用这些临时凭据创建 S3 客户端
s3_client = boto3.client(
's3',
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken']
)
# 用这个客户端列出 S3 桶
print(s3_client.list_buckets())
2. AWS CLI
使用 AWS CLI 代表同一角色获取临时凭据:
# 假设角色并获取临时凭据
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/MyS3ReadOnlyRole \
--role-session-name MyCLISessionName > temp_credentials.json
# 使用 jq 解析 JSON 输出来提取临时凭据 (需要安装 jq)
export AWS_ACCESS_KEY_ID=$(jq -r .Credentials.AccessKeyId temp_credentials.json)
export AWS_SECRET_ACCESS_KEY=$(jq -r .Credentials.SecretAccessKey temp_credentials.json)
export AWS_SESSION_TOKEN=$(jq -r .Credentials.SessionToken temp_credentials.json)
# 使用临时凭据列出 S3 桶
aws s3 ls
这些代码示例向您展示了如何使用 assume_role
获取临时凭据,并使用这些凭据执行 AWS 服务请求。在实际应用中,你可能需要适当地处理错误和异常,并确保临时凭据在需要时被正确地销毁。
当我们提到AWS CLI或SDK的配置文件中的“永久版”assume_role
,我们实际上是指如何在~/.aws/config
文件中为特定的profile配置角色假设,使得每次使用那个profile时都会自动假设指定的角色。
下面是如何在AWS CLI配置文件中设置assume_role
:
- 配置基本的credentials:
首先,在~/.aws/credentials
文件中,您应该有一个基本的profile(例如”default”):
[default]
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
- 配置role profile:
在~/.aws/config
文件中,您可以为特定的profile配置一个角色假设。例如,假设您想为名为”myroleprofile”的profile假设一个角色:
[profile myroleprofile]
role_arn = arn:aws:iam::123456789012:role/MyS3ReadOnlyRole
source_profile = default
在上述配置中:
role_arn
指的是您想要切换的IAM角色的ARN。source_profile
指的是包含原始凭据的profile名称(在此例中为”default”)。
- 使用配置的profile:
现在,当您使用AWS CLI并希望使用myroleprofile
时,CLI将自动为您假设MyS3ReadOnlyRole
角色。
使用CLI:
aws s3 ls --profile myroleprofile
对于boto3,您可以这样做:
import boto3
session = boto3.Session(profile_name='myroleprofile')
s3 = session.client('s3')
print(s3.list_buckets())
每次您使用myroleprofile
profile,它都会使用default
profile中的凭据来假设MyS3ReadOnlyRole
角色,然后使用返回的临时凭据执行操作。
使用 assume_role
可以帮助组织遵循最佳的安全实践,如权限的最小化原则,确保用户和服务只获得执行任务所需的最小权限。