亚马逊AWS官方博客

如何使用区域 AWS STS 终端节点

本文提供了 AWS Security Token Service (AWS STS) 的增强建议,在全球(现为传统的终端节点)AWS STS 终端节点的可用性不太可能出现中断的情况下,您仍可以根据这些建议来帮助提可用性。尽管传统 AWS STS 终端节点 https://sts.amazonaws.com 高度可用,但它托管在单个 AWS 区域(美国东部(弗吉尼亚北部)中,与其他终端节点一样,它不提供到其他区域终端节点的自动故障转移。在这篇文章中,将展示如何在配置中使用区域 AWS STS 终端节点来提高工作负载的性能和弹性。

对于身份验证,使用临时证书而不是长期凭证,以帮助降低安全性风险,例如无意中泄露密钥、共享或盗窃凭证。借助 AWS STS,可信任用户可以申请临时的、权限有限的凭证来访问 AWS 资源

临时安全凭证包括访问密钥对和会话令牌。访问密钥对由访问密钥 ID (Access Key ID)和密钥(Security Key)组成。AWS STS 会动态生成临时安全凭证,并在收到请求时将其提供给用户,而无需长期存储。临时安全凭证是短期凭证,其有效期有限,到期后无法重复使用,因此您无需管理或轮换它们。

要获取这些证书,您可以使用几种不同的方法:

图 1:从 AWS STS 请求证书的方法

全球(旧版)和区域性 AWS STS 终端节点

要以编程方式连接到 AWS 服务,您需要使用终端节点终端节点是 AWS STS 的入口 URL。

AWS STS 在每个区域都提供区域终端节点。AWS 最初使用全球终端节点(现为传统终端节点)https://sts.amazonaws.com 构建 AWS STS,该终端节点托管在美国东部(弗吉尼亚北部)区域(us-east-1)。对于在您的 AWS 账户中默认启用的区域,默认情况下会激活区域 AWS STS 终端节点。例如,https://sts.us-east-2.amazonaws.com 是美国东部(俄亥俄州)区域终端节点。 默认情况下,AWS 服务使用区域 AWS STS 终端节点。例如,IAM Roles Anywhere 使用与 Trust anchor 对应的区域 STS 终端节点。有关每个区域的 AWS STS 终端节点的完整列表,您可以参阅 AWS 安全令牌服务终端节点和配额。与此同时,您无法在已禁用的区域中激活 AWS STS 终端节点。有关默认激活哪些 AWS STS 终端节点以及您可以激活或停用哪些终端节点的更多信息,请参阅区域和终端节点

如前所述,全球(传统)AWS STS 终端节点 https://sts.amazonaws.com 托管在单个区域:美国东部(弗吉尼亚北部),与其他终端节点一样,它不提供到其他区域终端节点的自动故障转移。因此,如果您在 AWS 上或 AWS 之外的工作负载配置为使用传统 AWS STS 终端节点 https://sts.amazonaws.com,则会引入对单个区域(us-east-1)的依赖。若终端节点在该区域不可用,或者您的资源与该区域之间的连接中断,您的工作负载将无法使用 AWS STS 获取临时凭证,这会给您的工作负载带来可用性风险。

AWS 建议您使用区域性 AWS STS 终端节点(https://sts.<地区名称>. amazonaws.com),而不是全球(传统)AWS STS 终端节点。

除了提高弹性外,区域端点还有其他好处:

  • 隔离 — 通过向与您的工作负载位于同一区域的 AWS STS 终端节点发出请求,您可以最大限度地减少跨区域的依赖性,并使您的资源范围与临时安全凭证的范围保持一致,以帮助解决可用性和安全问题。例如,如果您的工作负载在美国东部(俄亥俄州)地区运行,则可以考虑使用美国东部(俄亥俄州)区域(us-east-2)中的区域 AWS STS 终端节点,以消除对其他区域的依赖。
  • 性能 — 通过向离您的服务和应用程序更近的区域终端节点发出 AWS STS 请求,帮助您以更低的延迟和更短的响应时间访问 AWS STS。

图 2 说明了通过 AWS STS AssumeRole API 呼叫 AWS 身份和访问管理 (IAM) 角色的过程,该程序会返回一组临时安全凭证:

图 2:使用对区域 AWS STS 终端节点的 API 调用 IAM 角色(AssumeRole)

在同一区域内调用 AWS STS

作为最佳实践,您应将特定区域内的工作负载配置为仅使用该区域的区域 AWS STS 终端节点。通过使用区域终端节点,您可以在与工作负载相同的区域中使用 AWS STS,从而消除跨区域依赖。例如,美国东部(俄亥俄州)区域的工作负载应仅使用区域终端节点 https://sts.us-east-2.amazonaws.com 来调用 AWS STS。如果区域性 AWS STS 终端节点无法访问,则您的工作负载不应在操作区域之外调用 AWS STS 终端节点。如果您的工作负载有多区域弹性要求,则您工作负载的当前区域和其他备用区域应使用各自区域的 AWS STS 终端节点,并且将您的工作负载也部署至其他备用区域,以便在出现区域故障时应用程序仍能正常运行。您应将 STS 流量引导到同一区域内的 STS 终端节点,该终端节点应与其他区域隔离,并移除对传统终端节点(https://sts.amazonaws.com)的依赖。

从 AWS 外部调用 AWS STS

在 AWS 之外运行的工作负载,您应使其调用相应的区域 AWS STS 终端节点,这些区域终端节点可为您的工作负载提供最低延迟。如果您的工作负载有多区域弹性要求,请在区域 AWS STS 终端节点无法访问时为其他区域的 AWS STS 调用构建故障转移逻辑。从区域 AWS STS 终端节点获取的临时安全凭证,在默认会话持续时间或您指定的持续时间内於全球范围内有效

如何为您的工具和软件开发工具包配置区域 AWS STS 终端节点

建议您使用最新主要版本AWS 命令行界面(CLI)AWS 开发工具包来调用 AWS STS API。

AWS CLI

默认情况下,AWS CLI 版本 2 会将 AWS STS API 请求发送到当前配置区域的区域 AWS STS 终端节点。如果您使用的是 AWS CLI v2,则无需进行其他更改。

默认情况下,AWS CLI v1 会使用旧版AWS STS 终端节点发送 AWS STS 请求。要检查您正在使用的 AWS CLI 的版本,请运行以下命令:$ aws--version

当您运行 AWS CLI 命令时,AWS CLI 会按特定顺序查找凭证配置,首先是在 shell 环境变量中,循序查找至本地 AWS 配置文件(~/.aws/config)。

AWS SDK

AWS 软件开发工具包适用于各种编程语言和开发环境。 自 2022 年 7 月起,AWS 开发工具包的主要新版本默认为区域性 AWS STS 终端节点,并使用与当前配置的区域相对应的终端节点。如果您使用的是 2022 年 7 月之后发布的 AWS 开发工具包的主要版本,则无需进行其他更改。

AWS 开发工具包会查看各种配置位置,直到找到凭证配置值。例如,适用于 Python 的 AWS 开发工具包(Boto3)在源中搜索配置值时会遵循以下查找顺序:

  1. 在程序中创建 AWS 资源客户端时为对象进行的传递参数
  2. 环境变量
  3. AWS 配置文件 ~/.aws/config

如果您仍在使用 AWS CLI v1,或者您的 AWS 开发工具包版本仍使用传统默认的 AWS STS 终端节点,则可以使用以下选项来设置区域 AWS STS 终端节点:

选项 1 – 使用共享的 AWS 配置文件设置

在 Linux 或 macOS 上,配置文件位于 ~/.aws/config,位于 Windows 上的 C:\Users\USERNAME\ .aws\ config。要使用区域终端节点,请添加 sts_regional_endpoints 参数。

以下配置示例说明如何在 AWS 配置文件中设置为 us-east-2 区域的 AWS STS 终端节点:

[default]
region = us-east-2
sts_regional_endpoints = regional

AWS STS 终端节点参数(sts_regional_endpoints)的有效值为:

  • legacy(默认)— 使用全球(旧版)AWS STS 终端节点 sts.amazonaws.com
  • regional —使用当前配置的区域的 AWS STS 终端节点。

注意:自 2022 年 7 月起,AWS 开发工具包的主要新版本默认为区域性 AWS STS 终端节点,并使用与当前配置的区域相对应的终端节点。如果您使用的是 AWS CLI v1,则必须使用版本 1.16.266 或更高版本才能使用 AWS STS 终端节点参数。

您可以使用AWS CLI 命令提供的 --debug 选项来接收调试日志并验证使用了哪个 AWS STS 终端节点。

$ aws sts get-caller-identity \
$ --region us-east-2 \
$ --debug

如果您在调试日志中搜索 UseGlobalEndpoint,您会发现 UseGlobalEndpoint 参数设置为 False,并且,若您在共享的 AWS 配置文件或环境变量中配置区域 AWS STS 终端节点,您将看到区域终端节点的完整域名(FQDN):

2023-09-11 18:51:11,300 – MainThread – botocore.regions – DEBUG – Calling endpoint provider with parameters: {'Region': 'us-east-2', 'UseDualStack': False, 'UseFIPS': False, 'UseGlobalEndpoint': False}
2023-09-11 18:51:11,300 – MainThread – botocore.regions – DEBUG – Endpoint provider result: https://sts.us-east-2.amazonaws.com

有关支持以共享 AWS 配置文件中设置区域 AWS STS 终端节点的 AWS 软件开发工具包列表,请参阅与 AWS 开发工具包的兼容性

选项 2 – 使用环境变量

环境变量提供了另一种指定配置选项的方法。对应用来说,这些配置是全域性的,会影响应用对 AWS 服务的调用行为。大多数 SDK 都支持环境变量。设置环境变量时,SDK 会使用该值直到 shell 会话结束或将变量设置为其他值。要使变量在未来的会话中保持不变,请在 shell 的启动脚本中对其进行设置。

以下示例说明如何使用环境变量设置默认区域为 us-east-2 并使用 AWS STS 终端节点:

Linux 或 macOS

$ export AWS_DEFAULT_REGION=us-east-2
$ export AWS_STS_REGIONAL_ENDPOINTS=regional

你可以运行命令 $ (echo $AWS_DEFAULT_REGION; echo $AWS_STS_REGIONAL_ENDPOINTS) 来验证变量。 输出应类似于以下内容:

us-east-2
regional

Windows

C:\> set AWS_DEFAULT_REGION=us-east-2
C:\> set AWS_STS_REGIONAL_ENDPOINTS=regional

以下示例说明适用于 Python 的 AWS 开发工具包(Boto3)STS 客户端,通过设置环境变量来配置使用区域 AWS STS 终端节点:

import boto3
import os
os.environ["AWS_DEFAULT_REGION"] = "us-east-2"
os.environ["AWS_STS_REGIONAL_ENDPOINTS"] = "regional"

您可以使用 Boto3 提供的属性 sts_client.meta.endpoint_url 来检查和验证 STS 客户端的配置方式。 输出应类似于以下内容:

>>> sts_client = boto3.client (“sts”)
>>> sts_client.meta.endpoint_url
'https://sts.us-east-2.amazonaws.com '

有关支持以环境变量设置区域 AWS STS 终端节点的 AWS 软件开发工具包列表,请参阅与 AWS 开发工具包的兼容性

选项 3 – 自行构造终端节点 URL

您也可以为特定的区域 AWS STS 终端节点手动构建终端节点 URL。

以下示例代码显示了如何通过设置特定的终端节点 URL,将适用于 Python 的 AWS 开发工具包(Boto3) 提供的 STS 客户端配置为使用区域 AWS STS 终端节点:

import boto3
sts_client = boto3.client('sts', region_name='us-east-2', endpoint_url='https://sts.us-east-2.amazonaws.com')

在 AWS STS 中使用 VPC 终端节点

您可以利用 VPC 终端节点为您在 Amazon VPC 中部署的资源创建到 AWS STS 的私有连接。AWS STS 能够与 VPC 终端节点 AWS PrivateLink 功能提供的网络接口集成。AWS PrivateLink 上的网络流量保持在全球 AWS 网络主干上,不会通过公共互联网。这意味着当您为 AWS STS 配置 VPC 终端节点时,在 VPC 内部传送至区域 AWS STS 终端节点的流量将使用私有网络流量。

默认情况下,您的 VPC 中的 DNS 将更新区域 AWS STS 终端节点的条目,并且解析该域名为您 VPC 中 AWS STS 的 VPC 终端节点的私有 IP 地址。以下示例 Amazon EC2 实例的输出,通过查询 AWS STS 终端节点的 DNS 名称返回纪录,显示了解析为 AWS STS 的 VPC 终端节点的私有 IP 地址:

[ec2-user@ip-10-120-136-166 ~]$ nslookup sts.us-east-2.amazonaws.com
Server:         10.120.0.2
Address:        10.120.0.2#53

Non-authoritative answer:
Name:   sts.us-east-2.amazonaws.com
Address: 10.120.138.148 

在您所在区域为 AWS STS 创建接口 VPC 终端节点后,您可以使用环境变量为相应的区域 AWS STS 终端节点设置值,以访问同一区域中的 AWS STS。

以下日志的输出显示向区域 AWS STS 终端节点发出了 AWS STS 调用:

POST
/

content-type:application/x-www-form-urlencoded; charset=utf-8
host:sts.us-east-2.amazonaws.com

记录 AWS STS 请求

您可以使用 AWS CloudTrail 事件来获取有关用于 AWS STS 的请求和终端节点的信息。 这些信息可以帮助您识别 AWS STS 请求模式并验证您是否仍在使用传统的 STS 终端节点。

CloudTrail 中的事件(event是 AWS 账户中某项活动的记录。 CloudTrail 事件提供通过 AWS 管理控制台、AWS 软件开发工具包、命令行工具和其他 AWS 服务进行的 API 和非 API 账户活动的历史记录。

记录位置

  • 区域 AWS STS 终端节点 sts.<region-name>.amazonaws.com 的请求将会在各自区域内的 CloudTrail 事件中纪录。
  • sts.amazonaws.com 终端节点发出的请求則會在美国东部(弗吉尼亚北部)区域(us-east-1)内记录。

日志字段

  • 对区域 AWS STS 终端节点和传统终端节点的请求记录保存在 CloudTrail 的 tlsDetails 字段中。您可以使用此字段来确定请求是向区域端点还是传统终端节点发出。
  • 从 VPC 终端节点发出的请求记录保存在 CloudTrail 的 vpcendPointID 字段中。

以下示例显示了向具有 VPC 终端节点的区域 AWS STS 终端节点发出请求的 CloudTrail 事件。

"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "123456789012",
"vpcEndpointId": "vpce-021345abcdef6789",
"eventCategory": "Management",
"tlsDetails": {
    "tlsVersion": "TLSv1.2",
    "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
    "clientProvidedHostHeader": "sts.us-east-2.amazonaws.com"
}

以下示例显示了使用旧版 AWS STS 终端节点发出请求的 CloudTrail 事件。

"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "123456789012",
"eventCategory": "Management",
"tlsDetails": {
    "tlsVersion": "TLSv1.2",
    "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
    "clientProvidedHostHeader": "sts.amazonaws.com"
}

要以交互方式搜索和分析您的 AWS STS 日志数据,请使用 AWS CloudWatch Logs InsightsAmazon Athena

CloudWatch Logs Insights

以下示例运行 CloudWatch Logs Insights 查询语法,以查找对旧版 AWS STS 终端节点进行的 API 调用。若您要使用这种方式搜索 CloudTrail 事件,在查询事件之前,您必须在 CloudTrail 中配置 Trail 以将事件发送到 CloudWatch 日志

filter eventSource="sts.amazonaws.com" and tlsDetails.clientProvidedHostHeader="sts.amazonaws.com"
| fields eventTime, recipientAccountId, eventName, tlsDetails.clientProvidedHostHeader, sourceIPAddress, userIdentity.arn, @message
| sort eventTime desc

上述查询输出显示了向旧版 AWS STS 终端节点(https://sts.amazonaws.com)的调用事件详细信息。

图 3:使用 CloudWatch 日志见解查询查找 STS API 调用

Amazon Athena

以下示例展示了使用 Amazon Athena 语句查询对旧版 AWS STS 终端节点进行的 API 调用的 CloudTrail 事件。

SELECT
    eventtime,
    recipientaccountid,
    eventname,
    tlsdetails.clientProvidedHostHeader,
    sourceipaddress,
    eventid,
    useridentity.arn
FROM "cloudtrail_logs"
WHERE
    eventsource = 'sts.amazonaws.com' AND
    tlsdetails.clientProvidedHostHeader = 'sts.amazonaws.com'
ORDER BY eventtime DESC

上述查询输出显示了仍对旧版 AWS STS 终端节点 https://sts.amazonaws.com 进行的 API 调用事件。

图 4:使用 Athena 搜索 STS API 调用并识别 STS 端点

结论

在这篇文章中,您学习了如何使用区域 AWS STS 终端节点来帮助您的应用提高弹性、减少延迟,并在您的 AWS 环境中善用您的区域的临时性安全凭证建立会话,提高区域终端节点的使用率。

AWS 建议您检查环境中 AWS STS 终端节点的配置和使用情况,验证 CloudTrail 日志中的 AWS STS 活动,并确认您的应用正确地使用区域 AWS STS 终端节点。

如果您有任何疑问,您可以在 Security Identity and Compliance re:Post 主题中发布您的问题,或联系 AWS Support

本篇作者

Darius Januskis

亚马逊云科技高级解决方案架构师,致力于协助全球金融服务客户踏上云之旅。他是一位技术爱好者,喜欢与客户合作并帮助他们构建架构良好的解决方案。他的核心兴趣包括安全、DevOps、自动化和无服务器技术。

校译作者

Eason Cao

亚马逊云科技资深技术支持工程師,专门研究 AWS 容器解决方案。作为 AWS 容器服务领域的主题专家,致力于帮助客户克服云环境挑战和优化分布式系统。