本页面介绍了如何使用 Identity-Aware Proxy (IAP) TCP 转发实现对没有外部 IP 地址或不允许通过互联网直接访问的虚拟机实例的管理员权限。
借助 IAP TCP 转发,您可以建立加密隧道,再通过该隧道将 SSH、RDP 和其他流量转发到虚拟机实例。IAP TCP 转发还提供了对哪些用户可以建立隧道和用户可以与哪些虚拟机实例连接的精细控制。
如需了解有关 IAP TCP 转发如何工作的更多信息,请参阅 TCP 转发概览。
准备工作
如需准备环境以使用 IAP 进行 TCP 转发,请完成以下步骤:
选择或创建 Google Cloud 项目,并确保已启用结算功能。
如果您计划使用命令行,请安装并初始化 Google Cloud CLI。
所需的角色
如需获得使用 IAP TCP 转发所需的权限,请让您的管理员为您授予项目的 IAP Policy Admin (roles/iap.policyAdmin) IAM 角色。
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
确保您的项目中有 Compute Engine 虚拟机实例。 如果您没有虚拟机实例,请创建并启动 Compute Engine 实例。 您的虚拟机实例不需要外部 IP 地址即可进行 IAP TCP 转发。
准备您的项目以进行 IAP TCP 转发
本部分将引导您通过必要步骤在 Google Cloud 项目中启用 IAP TCP 转发。
创建防火墙规则
如需允许 IAP 连接到您的虚拟机实例,请创建一个防火墙规则,该规则:
- 适用于您希望使用 IAP 可访问的所有 VM 实例。
- 允许 IP 范围
35.235.240.0/20的入站流量。此范围包含 IAP 用于 TCP 转发的所有 IP 地址。对于 IPv6 虚拟机,请使用以下 IP 范围:
2600:2d00:1:7::/64。 - 允许连接到您希望通过使用 IAP TCP 转发访问的所有端口,例如,SSH 的端口
22和 RDP 的端口3389。
控制台
如需允许 RDP 和 SSH 访问网络中的所有虚拟机实例,请执行以下操作:
- 打开“防火墙规则”页面。
其余步骤会显示在 Google Cloud 控制台中。
- 选择一个 Google Cloud 项目。
- 在“防火墙规则”页面上,点击
创建防火墙规则 。 - 配置以下设置:
- 名称:
allow-ingress-from-iap - 流量方向:入站
- 目标:网络中的所有实例
- 来源过滤条件:IP 地址范围
- 来源 IP 地址范围:
35.235.240.0/20 - 协议和端口:选择 TCP,然后输入
3389,22以允许 RDP 和 SSH。
- 名称:
- 点击创建。
gcloud
如需允许 RDP 访问网络中的所有虚拟机实例,请运行:
gcloud compute firewall-rules create allow-rdp-ingress-from-iap \ --direction=INGRESS \ --action=allow \ --rules=tcp:3389 \ --source-ranges=35.235.240.0/20
对于 SSH 访问,请运行:
gcloud compute firewall-rules create allow-ssh-ingress-from-iap \ --direction=INGRESS \ --action=allow \ --rules=tcp:22 \ --source-ranges=35.235.240.0/20
对于其他协议,运行
gcloud compute firewall-rules create allow-ingress-from-iap \ --direction=INGRESS \ --action=allow \ --rules=tcp:PORT \ --source-ranges=35.235.240.0/20
其中 PORT 是协议使用的端口。
授予 IAP TCP 转发角色
如需控制允许哪些用户和群组使用 IAP TCP 转发以及允许它们连接到哪些虚拟机实例,请在项目上授予适当的 Identity and Access Management (IAM) 角色。
如果您使用的是 OS Login(推荐),请参阅为用户账号配置 OS Login 角色。
下表显示了您需要向可信管理员授予的预定义角色,以便他们执行 TCP 转发和相关任务:
| 任务 | 角色 | 更多信息 |
|---|---|---|
| TCP 转发 |
IAP-secured Tunnel User (roles/iap.tunnelResourceAccessor)
|
请参阅授予对项目中所有虚拟机实例的访问权限或授予对特定虚拟机的访问权限。 |
| 通过 SSH 访问 |
Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1)
|
|
| 使用服务账号 | Service Account User (roles/iam.serviceAccountUser) |
请参阅 serviceAccountUser 角色。 |
如果您想创建仅具有此任务所需的特定权限的自定义角色,请参阅权限详情。
您可以授予用户或群组对项目中所有虚拟机实例的访问权限,也可以授予对特定虚拟机的访问权限,具体取决于您授予所需角色的方式。
不支持标记
目前不支持使用 tag 授予 IAP TCP 转发权限。
授予对项目中所有虚拟机实例的访问权限
您可以通过在项目级层授予所需的 IAM 角色来为用户或群组提供对项目中的所有虚拟机实例的访问权限:
控制台
- 在 Google Cloud 控制台中打开 IAM 和管理页面。
其余步骤会显示在 Google Cloud 控制台中。
- 在 IAM 和管理页面上,点击添加并配置以下内容:
- 新主账号:指定您要为其授予访问权限的用户或群组。
- 选择角色:选择 Cloud IAP > IAP-Secured Tunnel User。
- (可选)点击添加条件并配置条件:
- 标题:输入条件的名称。
- 表达式:输入用户必须满足才能获取 IAP-Secured Tunnel User 角色提供的权限的条件。
例如,以下 CEL 表达式仅授予对端口 22 的访问权限:
destination.port == 22 - 点击添加其他角色并配置以下内容:
- 选择角色:选择 Compute Engine > Compute Instance Admin (v1)。
- 点击保存。
gcloud
通过运行以下命令为用户授予这两个角色:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=user:EMAIL \ --role=roles/iap.tunnelResourceAccessor gcloud projects add-iam-policy-binding PROJECT_ID \ --member=user:EMAIL \ --role=roles/compute.instanceAdmin.v1
替换以下内容:
PROJECT_ID:项目的 IDEMAIL:您要授予访问权限的用户的电子邮件地址,例如user@example.com。
授予对特定虚拟机的访问权限
如需向用户或群组授予对特定虚拟机的访问权限,请向该虚拟机授予 roles/iap.tunnelResourceAccessor 角色。其他角色必须在项目级层授予。
控制台
- 打开 IAP 管理页面,然后选择 SSH 和 TCP 资源标签页。
其余步骤会显示在 Google Cloud 控制台中。
- 在 IAP 管理页面的 SSH 和 TCP 资源标签页上,选择您要配置的虚拟机实例。
- 如果信息面板未显示,请点击显示信息面板。
点击添加主账号并配置以下各项:
- 新主账号:指定您要为其授予访问权限的用户或群组。
- 选择角色:选择 Cloud IAP > IAP-Secured Tunnel User。
(可选)点击添加条件并配置条件:
- 标题:输入条件的名称。
- 表达式:输入用户必须满足才能获取 IAP-Secured Tunnel User 角色提供的权限的条件。
例如,以下 CEL 表达式仅授予对端口 22 的访问权限:
destination.port == 22您还可以根据访问权限级别授予访问权限:
destination.port == 22 &&"FULL_ACCESS_LEVEL_NAME" in request.auth.access_levels其中
FULL_ACCESS_LEVEL_NAME是现有的访问权限级别,并使用以下格式:accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME- 点击保存。
API
如需编辑应用的 policy.json 文件,请执行以下过程。如需详细了解如何使用 IAM API 管理访问权限政策,请参阅管理对受 IAP 保护的资源的访问权限。
导出以下变量。
export IAP_BASE_URL=https://iap.googleapis.com/v1/projects/PROJECT_NUMBER/iap_tunnel # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy export JSON_NEW_POLICY=POLICY_FILE.JSON
使用
getIamPolicy方法获取 Compute Engine 实例的 IAM 政策。最后的空数据位表示将curl请求转换为 POST,而不是 GET。curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \ ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:getIamPolicy \ -d ''通过修改 IAM 政策 JSON 文件,为您的正文授予
iap.tunnelResourceAccessor角色。(可选)根据 IAM 条件和访问权限级别,仅向满足特定条件的主账号授予该角色。
以下是经过修改的
policy.json文件的示例,该文件会将iap.tunnelResourceAccessor角色授予一组虚拟机实例管理员,并为他们授予对受 IAP 保护的隧道资源的访问权限。示例中添加了 IAM Conditions,利用destination.ip和destination.portIAM Conditions,仅允许虚拟机实例管理员组中端口22上具有专用 IP 地址10.0.0.1的正文访问资源。它们还必须满足 ACCESS_LEVEL_NAME 访问权限级层的要求。请注意,如果主账号具有 Owner 角色,他们就有权使用 IAP 进行 TCP 转发。
policy.json 文件示例{ "policy": { "bindings": [ { "role": "roles/iap.tunnelResourceAccessor", "members": ["group:instance-admins@example.com"], "condition": { "expression": "\"accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME\" in request.auth.access_levels && destination.ip == \"10.0.0.1\" && destination.port == 22", "title": "CONDITION_NAME" } } ] } }
如需查找政策名称,请调用
accessPolicies.list:GET https://accesscontextmanager.googleapis.com/v1/accessPolicies
- 使用
setIamPolicy方法设置新的policy.json文件。curl -i -H "Content-Type:application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:setIamPolicy \ -d @${JSON_NEW_POLICY}
- 使用
权限详情
所需权限因用户使用 IAP TCP 转发的方式而异:
| 情况 | 所需权限 | |
|---|---|---|
| 全部 |
|
|
使用 gcloud compute [start-iap-tunnel, ssh, scp] |
|
|
使用 gcloud compute [ssh, scp] |
|
|
| 使用 OS Login 的虚拟机 | 请参阅这些说明 | |
| 不使用 OS Login |
|
|
| 使用服务账号通过 SSH 连接到虚拟机 |
|
|
| 通过浏览器进行 SSH 连接 | 请参阅 | |