如何为 API Gateway HTTP API 提供跨账户 IAM 授权?

2 分钟阅读
0

我想激活 AWS Identity and Access Management (IAM) 身份验证以跨账户访问我的 Amazon API Gateway HTTP API。

简短描述

对于 API 网关 REST API,您可以使用资源策略为跨账户提供 IAM 身份验证。但是,此选项不适用于 API Gateway HTTP API。

您可以使用 sts:AssumeRole API 操作来代入 HTTP API 账户的角色。代入的角色提供临时安全凭证,该凭证可用于在另一个账户中调用 HTTP API。

解决方法

创建 IAM 临时凭证

**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您使用的是最新版本的 AWS CLI

1.为托管 HTTP API 的账户 A 创建 IAM 策略。此策略提供 HTTP API execute-api ARN 的调用权限。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "execute-api:Invoke",
            ],
            "Resource": [
                "arn:aws:execute-api:us-east-1:<AccountA-id>:<Api-id>/$default/*/*"
            ]
        }
    ]
}

2.账户 A 中创建 IAM 角色,将“可信实体类型”添加为“AWS 账户”,然后输入账户 B 的 ID。

3.将步骤 1 中创建的 IAM 策略附加到步骤 2 中创建的 IAM 角色。

4.为账户 B 创建 IAM 策略以允许 sts:AssumeRole API 操作:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::<AccountA-id>:role/<AssumedRoleName>"
    }
  ]
}

5.将 IAM 策略附加到账户 B 中的用户。

6.运行 AWS CLI 命令 assume-role,类似于以下内容:

$ aws sts assume-role --role-arn arn:aws:iam::<account-id>:role/<AssumedRoleName> --role-session-name role_session

输出示例:

{
    "Credentials": {
        "AccessKeyId": "A1B2C3D4E5E6G7H8J9K0",
        "SecretAccessKey": "abcdefghijk123456789",

 "SessionToken":
"11111111111122222222223333333333344444444455555566666667777777777778888888999999999aaaaaaaaaabbbbbbbbbcccccccc==",
        "Expiration": "2022-07-11T15:55:25+00:00"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "AAAAAAABBBBBBBBBBB:role_session",
        "Arn": "arn:aws:sts::<account-id>:assumed-role/<AssumedRoleName>/role_session"
    }
}

检查凭证对象中是否有 AccessKeyIdSecretAccessKeySessionToken。由代入的角色提供的这些临时凭证可用于调用 HTTP API。

测试 IAM 身份验证

使用 Postman 应用程序,通过已激活 IAM 身份验证的方法向您的 API 资源发送请求。

**注意:**要手动验证使用其他工具或环境发送到 API Gateway 的请求,请使用签名版本 4 (SigV4) 签名流程。有关详细信息,请参阅签署 AWS API 请求

1.在 Postman 中,选择 Authorization(授权)选项卡并执行以下操作:
对于类型,选择 AWS 签名
对于 AccessKeySecretKeySessionToken,输入 assume-role API 调用中的值。

2.对于 Enter request URL(输入请求 URL),输入您的 API 的调用 URL,类似于以下内容:

https://<Api-id>.execute-api.<region>.amazonaws.com/<stagename>/<resourcepath>

经过身份验证的请求将返回 200 OK 响应代码。未授权的请求会返回缺少身份验证令牌消息和 403 禁止访问响应代码。

相关信息

如何为 API Gateway REST API 激活 IAM 身份验证?

AWS 官方
AWS 官方已更新 3 个月前