assume role


assume role 是 AWS (亚马逊网络服务) Security Token Service (STS) 提供的一项功能。使用此功能,您可以请求临时的、有限权限的 AWS 凭据,以代表其他用户角色执行 AWS 服务请求。这是一个为了增强安全性并限制权限的策略,允许用户或服务代表一个角色来执行特定任务,而不必直接将长期 AWS 访问凭据授予该用户或服务。

以下是 assume_role 的基本用法和关键概念:

  1. **角色 (Role)**:在 AWS IAM (Identity and Access Management) 中定义的实体。角色不是与特定用户或组关联的,而是与权限策略关联的。这些策略定义了角色可以和不能做什么。

  2. **信任策略 (Trust Policy)**:定义了哪些实体可以假设此角色。例如,您可以创建一个信任策略,允许特定的 AWS 账户的用户代表这个角色。

  3. **权限策略 (Permission Policy)**:定义了角色可以执行的操作和访问的资源。

  4. Assuming a Role:当实体(如用户或 AWS 服务)想要代表角色执行操作时,他们需要”假设”该角色。这是通过调用 AssumeRole API 来完成的。

  5. **临时安全凭据 (Temporary Security Credentials)**:当角色被假设时,STS 返回一个临时的安全凭据,它包括:Access Key ID、Secret Access Key 和 Session Token。这些凭据具有与角色相关的权限,并且在一段时间后会过期。

  6. 用例

    • 跨账户访问:例如,如果您有两个 AWS 账户 A 和 B,您可以在 A 账户中的用户代表 B 账户中的角色,从而访问 B 账户的资源。
    • 临时权限提升:用户可能需要临时访问某些资源,例如为了调试或管理任务。
    • 应用程序与服务:应用程序可以假设一个角色来访问 AWS 资源,而不是直接使用固定的 AWS 凭据。
  7. 安全性:由于返回的是临时凭据,即使这些凭据被泄露,它们也只在有限的时间内有效,从而减少了潜在的风险。

当然可以。以下是使用 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

  1. 配置基本的credentials:

首先,在~/.aws/credentials文件中,您应该有一个基本的profile(例如”default”):

[default]
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
  1. 配置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”)。
  1. 使用配置的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 可以帮助组织遵循最佳的安全实践,如权限的最小化原则,确保用户和服务只获得执行任务所需的最小权限。


文章作者: AWS Learner
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 AWS Learner !
评论
  目录