用于 API 身份验证的 EC2 实例元数据或 AWS STS?安全最佳实践
EC2 Instance Metadata OR AWS STS for API Authentication? security best practice
这是用例。
我有一个 EC2 实例 运行 ServiceNow 中间服务器代理。 EC2 实例附加了 IAM_Role 称为“TestIAMRole”,并且假设角色策略附加到该角色。我使用此 EC2 实例和 ServiceNow 中间服务器代理来调用使用 AWS boto3 端点的 VPC 端点。 Python 脚本将使用 boto3 SDK 生成身份验证令牌并调用端点。
Python 示例:
import boto3
client = boto3.client('sts')
repsonse = client.assume_role(RoleArn='<IAM ROle ARN>',RoleSessionName='AssumeROle01')
credentials=repsonse['Credentials']
然后使用 Python 请求,我们调用 VPC 端点并且它工作正常。
由于我们是 运行 EC2 实例上的代理,我们想到了另一种使用 EC2 实例元数据的方法,使用本地 https 端点使用 curl,它返回 access_key、secret_key , 和 session_token
http://169.254.169.254/latest/meta-data/iam/security-credentials/TestIAMRole
所以,我们正在寻找专家意见,从以上两个选项中,什么是最安全/最推荐的。
另外,关于优化的几个问题
- 如果我们使用承担角色的 STS 方法来检索凭据,那么建议将这些凭据存储在 cache/app 中直到到期日期时间,以便我们可以重复使用它们,或者我们是否应该在每次创建新的 sts 凭据时获取新的 sts 凭据调用其他 AWS 服务?每次我们调用 AWS 服务时都试图节省额外的 STS 调用。
- 如果选择存储在缓存或应用程序中,那么我们可以将密钥安全地存储在 ServiceNow 中(加密格式),并且可以在到期日期时间之前定期更新。
请指教这是否正确。
实例元数据端点用于 IAM 角色,使用 IAM 角色授予您对 EC2 实例的权限是首选方法。
在某些情况下您需要担任角色,详情如下:
- 访问不同 AWS 账户的 API 时(支持资源策略的服务允许引用您不需要 STS 的跨账户权限)。
- 假设您的应用程序通常不应访问的权限(限时任务)。
- 作为 IAM 用户在帐户之间切换(例如在组织中)。
这些是概括,所以我确信在需要时还有其他小众案例,但是假设所有内容都在同一个帐户中,我建议只使用实例角色。
它们几乎是一回事。
当您调用 boto3.client('sts')
时,它会在多个位置查找凭据。其中之一是实例元数据。
您可以检索实例元数据,从中提取凭据,然后使用这些凭据创建客户端。这不仅会为您带来更多工作,而且您检索到的凭据将是 time-limited:在某些时候它们会过期,您必须再次执行该过程。 Boto 客户端足够聪明,可以为您完成这项工作。
至于承担 不同的 角色,正如您在问题中所展示的那样,实例元数据不会帮助您。您只能检索附加到 EC2 实例的角色(实例配置文件)的凭据。
这是用例。 我有一个 EC2 实例 运行 ServiceNow 中间服务器代理。 EC2 实例附加了 IAM_Role 称为“TestIAMRole”,并且假设角色策略附加到该角色。我使用此 EC2 实例和 ServiceNow 中间服务器代理来调用使用 AWS boto3 端点的 VPC 端点。 Python 脚本将使用 boto3 SDK 生成身份验证令牌并调用端点。
Python 示例:
import boto3
client = boto3.client('sts')
repsonse = client.assume_role(RoleArn='<IAM ROle ARN>',RoleSessionName='AssumeROle01')
credentials=repsonse['Credentials']
然后使用 Python 请求,我们调用 VPC 端点并且它工作正常。
由于我们是 运行 EC2 实例上的代理,我们想到了另一种使用 EC2 实例元数据的方法,使用本地 https 端点使用 curl,它返回 access_key、secret_key , 和 session_token
http://169.254.169.254/latest/meta-data/iam/security-credentials/TestIAMRole
所以,我们正在寻找专家意见,从以上两个选项中,什么是最安全/最推荐的。
另外,关于优化的几个问题
- 如果我们使用承担角色的 STS 方法来检索凭据,那么建议将这些凭据存储在 cache/app 中直到到期日期时间,以便我们可以重复使用它们,或者我们是否应该在每次创建新的 sts 凭据时获取新的 sts 凭据调用其他 AWS 服务?每次我们调用 AWS 服务时都试图节省额外的 STS 调用。
- 如果选择存储在缓存或应用程序中,那么我们可以将密钥安全地存储在 ServiceNow 中(加密格式),并且可以在到期日期时间之前定期更新。
请指教这是否正确。
实例元数据端点用于 IAM 角色,使用 IAM 角色授予您对 EC2 实例的权限是首选方法。
在某些情况下您需要担任角色,详情如下:
- 访问不同 AWS 账户的 API 时(支持资源策略的服务允许引用您不需要 STS 的跨账户权限)。
- 假设您的应用程序通常不应访问的权限(限时任务)。
- 作为 IAM 用户在帐户之间切换(例如在组织中)。
这些是概括,所以我确信在需要时还有其他小众案例,但是假设所有内容都在同一个帐户中,我建议只使用实例角色。
它们几乎是一回事。
当您调用 boto3.client('sts')
时,它会在多个位置查找凭据。其中之一是实例元数据。
您可以检索实例元数据,从中提取凭据,然后使用这些凭据创建客户端。这不仅会为您带来更多工作,而且您检索到的凭据将是 time-limited:在某些时候它们会过期,您必须再次执行该过程。 Boto 客户端足够聪明,可以为您完成这项工作。
至于承担 不同的 角色,正如您在问题中所展示的那样,实例元数据不会帮助您。您只能检索附加到 EC2 实例的角色(实例配置文件)的凭据。