如何为启用了 Google Compute Engine IAP 的负载均衡器启用 CORS 请求?

How do you enable CORS requests to a Google Compute Engine IAP enabled Load Balancer?

GCP 允许 external HTTPS load balancers to be protected by Identity Aware Proxy (IAP), using your google account credentials to protect the web server behind the load balancer. This an easy way to protect web services you want to use internally. Sometimes you need to provide access within a website on another domain, however, such as another team's subdomain, or when using a third party service like Honeycomb.io's Secure Tenancy. This requires Cross-origin resource sharing, or CORS 启用。

GCP can be configured to allow CORS requests across IAP,但文档很少。您实际上是如何启用它的?

更新: https://twitter.com/mattsachs/status/1220907777247154178?s=19

此时,GCP 不会通过 Cloud Console, the gcloud command line tool, or their various language api libraries 公开此 api。它需要从 VM 实例中使用类似 curl 的内容发出 Web 请求。

虚拟机创建

注意: 看来这可以通过 Cloud Shell 完成,而无需 VM。

首先,在 GCP 中创建启用 IAP 的外部负载均衡器,并在同一网络中创建一个要连接的 VM 实例。它应该与启用 IAP 的负载均衡器位于同一项目中。 重要提示: 创建 VM 时,select Allow full access to all Cloud APIsIdentity and API access>Access scopes.

通过 SSH 连接到 VM [或云 Shell],并在其余过程中使用 session 执行 shell 命令。

变量

我们将准备以下环境变量(或稍后手动替换值):

BEARER_TOKEN = OAuth token used in curl API calls
PROJECT_ID = ID for the compute project
INSTANCE_ID = ID for the IAP instance
IAP_NAME = Name for the IAP instance

已签名 Header JWT 观众

  • 转到 GCP 控制台 -> 安全 -> Identity-Aware 代理
  • 找到需要CORS的实例,点击最右边的竖三点按钮,Select Signed Header JWT Audience
  • 弹出窗口应包含路径:/projects/[PROJECT_ID]/global/backendServices/[INSTANCE_ID]
  • 通过VM中的运行 shell命令保存PROJECT_ID和INSTANCE_ID:PROJECT_ID=<PROJECT_ID>INSTANCE_ID=<INSTANCE_ID>

Shell 命令

  1. 首先我们将上一步的PROJECT_ID和INSTANCE_ID保存到环境变量中(替换为真实值)
PROJECT_ID=<PROJECT_ID>
INSTANCE_ID=<INSTANCE_ID>
  1. 接下来我们获取用于进行更改的 OAuth 令牌。请注意,您需要足够的权限才能执行此操作。请注意,我们在保存此环境变量时不使用导出;它只能在 shell session 中访问,其他应用程序无法访问。
BEARER_TOKEN=`gcloud auth application-default print-access-token`
  1. 接下来我们可以构造name/path中使用的api:
INSTANCE_NAME="projects/${PROJECT_ID}/iap_web/compute/services/${INSTANCE_ID}"
  1. 接下来我们查询以检查当前设置:
curl --request GET --header "Accept: application/json" --header "Content-Type: application/json" --header "Authorization: Bearer ${BEARER_TOKEN}" "https://iap.googleapis.com/v1/${INSTANCE_NAME}:iapSettings"
  1. 现在我们为更新请求的 body 构建 json:
SETTINGS_BODY='{"name":"'${INSTANCE_NAME}'","accessSettings":{"corsSettings":{"allowHttpOptions":true}}}'
  1. 我们现在准备更新设置:
curl --request PATCH --header "Accept: application/json" --header "Content-Type: application/json" --header "Authorization: Bearer ${BEARER_TOKEN}" --data ${SETTINGS_BODY} --compressed "https://iap.googleapis.com/v1/${INSTANCE_NAME}:iapSettings"

这应该 return 更新后的设置,类似于第 5 步的输出,但具有新值。

尽情享受吧!

从 gcloud 277.0 开始,这可以通过 gcloud beta iap settings 命令完成。 Cloud Console 支持即将推出。你想要这样的东西:

cat > settings <<EOF
accessSettings:
  corsSettings:
    allowHttpOptions: true
EOF
gcloud beta iap settings set settings \
  --project=project-id \
  --resource-type=compute \
  --service=backend-service-name