3

GCP 允许外部 HTTPS 负载平衡器受 Identity Aware Proxy (IAP) 的保护,使用您的 google 帐户凭据来保护负载平衡器后面的 Web 服务器。这是一种保护您想要在内部使用的 Web 服务的简单方法。但是,有时您需要在另一个域的网站内提供访问权限,例如另一个团队的子域,或者在使用Honeycomb.io 的 Secure Tenancy等第三方服务时。这需要启用跨域资源共享或 CORS

GCP可以配置为允许跨 IAP 的 CORS 请求,但文档很少。您如何实际启用它?

4

2 回答 2

4

从 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
于 2020-01-25T03:15:14.950 回答
1

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

目前,GCP 并没有通过Cloud Consolegcloud命令行工具,或者他们的各种语言 api 库来公开这个 api 。它需要curl从 VM 实例中发出 Web 请求。

虚拟机创建

注意:这似乎可以使用 Cloud Shell 完成,无需虚拟机。

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

通过 SSH 连接到 VM [或 Cloud Shell],并在整个过程的其余部分中将该会话用于 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

签名标头 JWT 受众

  • 转到 GCP 控制台 -> 安全 -> 身份识别代理
  • 找到需要CORS的实例,点击最右边的三个竖点按钮,选择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>

外壳命令

  1. 首先,我们将上一步中的 PROJECT_ID 和 INSTANCE_ID 保存到环境变量中(替换为实际值)
PROJECT_ID=<PROJECT_ID>
INSTANCE_ID=<INSTANCE_ID>
  1. 接下来,我们获得一个用于进行更改的 OAuth 令牌。请注意,您需要足够的权限才能执行此操作。请注意,我们在保存此环境变量时不使用导出;它只能在 shell 会话中访问,其他应用程序不能访问。
BEARER_TOKEN=`gcloud auth application-default print-access-token`
  1. 接下来我们可以构造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. 现在我们为更新请求的主体构建 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"

这应该返回更新的设置,类似于步骤 5 的输出,但具有新值。

请享用!

于 2020-01-25T00:23:14.543 回答