【问题标题】:AWS STS Assume Role: Get session tokenAWS STS 担任角色:获取会话令牌
【发布时间】:2020-11-05 22:46:37
【问题描述】:

我正在尝试在邮递员中获取给定 IAM 的会话令牌,但无法接收令牌。

如果我使用 boto3.client('sts'),我可以得到令牌。

用例:我正在尝试从运行 ServiceNow 中间服务器实例的 EC2 实例调用 VPC Rest Endpoint。由于我们在 EC2 实例上运行 ServiceNow 中间服务器代理,因此我想使用附加到 EC2 的 IAM 角色对部署在同一 AWS 账户中的其他 VPC 端点进行身份验证。

我已将权限策略附加到 IAM 角色以允许承担角色策略。如果有其他方法,请提出建议。

这里是邮递员中的 HTML HTML 响应。邮递员重定向到 IAM 文档

client = boto3.client('sts')
response = client.assume_role(
    RoleArn='arn:aws:iam::**************:role/ServiceNow-midserver-Role',
    RoleSessionName='Session1',
    DurationSeconds=3600
    )
print(response)

邮递员请求正文或端点有任何问题。 没有邮递员身份验证。

【问题讨论】:

  • 您希望如何在不提供凭证的情况下担任 IAM 角色?此外,您没有说明收到的错误响应。
  • @jarmod 感谢您的回复。我没有收到错误,但回复是空的。预期的响应应该是 access_key、secrete_key 和会话令牌。原因是,我使用 IAM 来避免密钥轮换。
  • 您收到 200 OK 响应?还是 HTTP 错误代码?
  • @jarmod 是的,我得到 200 OK 但作为响应,正文包含没有凭据的 HTML 内容
  • 响应是 HTML 还是 XML?应该是后者,并且会包含响应。

标签: amazon-web-services postman aws-sts


【解决方案1】:

要从 Postman(或 curl 等)调用 AssumeRole,而不是使用受支持的 AWS 开发工具包,您应该遵循 AssumeRole API documentation。您还需要使用 AWS 凭证进行身份验证。

具体来说,请求是一个HTTP GET,参数作为查询字符串传递,例如:

GET https://sts.amazonaws.com/
?Version=2011-06-15
&Action=AssumeRole
&RoleSessionName=stackoverflow-64706420
&RoleArn=arn:aws:iam::123456781234:role/myrole
&DurationSeconds=3600

这是 Postman 中的样子:

您需要添加 AWS 凭证,以便正确签署您的 API 请求,例如:

单击“发送”,响应将如下所示:

<AssumeRoleResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
  <AssumeRoleResult>
    <AssumedRoleUser>
      <Arn>arn:aws:sts::123456781234:assumed-role/123456781234/stackoverflow-64706420</Arn>
      <AssumedRoleId>ARO123EXAMPLE123:stackoverflow-64706420</AssumedRoleId>
    </AssumedRoleUser>
    <Credentials>
      <AccessKeyId>ASIAIOSFODNN7EXAMPLE</AccessKeyId>
      <SecretAccessKey>wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY</SecretAccessKey>
      <SessionToken>
       AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQW
       LWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGd
       QrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU
       9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz
       +scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==
      </SessionToken>
      <Expiration>2020-12-09T13:34:41Z</Expiration>
    </Credentials>
    <PackedPolicySize>6</PackedPolicySize>
  </AssumeRoleResult>
  <ResponseMetadata>
    <RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId>
  </ResponseMetadata>
</AssumeRoleResponse>

【讨论】:

  • 感谢这项工作。知道为什么 GetSessionToken 不起作用(假设它是作为用户 ARN 中的权限添加的)?
  • @MitaleeRao 你得到什么回应?
  • 实际上我得到了令牌,但它们在我对 SPAPI 的另一个调用中不起作用。我猜他们在某处禁用了某些配置。 AssumRole 有效!谢谢!
【解决方案2】:

您需要使用 IAM 用户或 IAM 角色的凭证来调用 AssumeRole。 boto3 必须从它寻找的标准位置获取凭据(如 ~/.aws/config)[ref:https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html]。也许您可以尝试在 Postman 的 Authorization 选项卡中提供 AWS 凭据,选择类型为 AWS Signature,然后调用假设角色。

【讨论】:

猜你喜欢
  • 2021-10-10
  • 1970-01-01
  • 2021-03-03
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2018-09-19
  • 2016-03-24
相关资源
最近更新 更多