为虚拟机启用基于证书的访问权限

本页介绍了如何为 Google Cloud 虚拟机启用基于证书的访问 (CBA)。您可以使用 CBA 安全地从受信任设备访问 Google Cloud 虚拟机。

概览

适用于虚拟机的 CBA 使用 Google Cloud 情境感知访问功能,通过双向 TLS (mTLS) 实现安全访问。以下是您在为虚拟机启用和使用 CBA 时要使用的主要组件:

  • Access Context Manager:可让您创建在确定对网站应用的访问权限时需要证书的访问权限级别。
  • Identity-Aware Proxy (IAP):借助 IAP TCP 转发,您可以建立加密隧道,再通过该隧道将 SSH、RDP 和其他流量转发到虚拟机实例。此外,通过 IAP 政策,您可以精细控制哪些用户可以建立到特定虚拟机实例的隧道,以及用户必须满足哪些访问条件才能使用此类隧道。
  • Chrome 企业版政策:在用户使用 Chrome 浏览器时,在用户和虚拟机之间提供双向身份验证 (mTLS)。
  • Google Cloud CLI:在使用 gcloud CLI 时,在用户和虚拟机之间提供互相身份验证 (mTLS)。

准备工作

确保您已为 Google Cloud 项目创建了 CBA 访问权限级别

授予通过 IAP TCP 转发访问虚拟机的角色

您必须为项目授予适当的 Identity and Access Management (IAM) 角色,才能让用户或用户群组使用 IAP TCP 转发访问虚拟机。

下表显示了您需要向受信任的管理员授予的预定义角色,以便他们执行 TCP 转发和相关任务。

任务 角色 更多信息
TCP 转发 IAP-secured Tunnel User (roles/iap.tunnelResourceAccessor) 授予对项目中所有虚拟机实例的访问权限授予对特定虚拟机的访问权限
通过 SSH 访问 Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1)
OS Login(推荐) 其他 为用户账号配置 OS Login 角色
使用服务账号 Service Account User (roles/iam.serviceAccountUser) serviceAccountUser 角色

如需详细了解如何为 IAP TCP 转发授予角色,请参阅为 IAP TCP 转发授予角色

配置对虚拟机的基于证书的访问权限

虽然 IAP-TCP 允许您授予对项目中所有虚拟机实例的访问权限,但您必须为每个单独的虚拟机实例配置基于证书的访问权限。

如需向用户或用户群组授予对虚拟机的基于证书的访问权限,请为虚拟机实例授予 roles/iap.tunnelResourceAccessor 角色。您可以在项目中授予其他角色

控制台

  1. 打开 IAP 管理页面,然后选择 SSH 和 TCP 资源标签页。

    转到 IAP 页面

  2. 选择要配置的虚拟机实例。如果信息面板未显示,请点击显示信息面板

  3. 点击添加主账号并配置以下各项:

    • 新主账号:指定您要为其授予访问权限的用户或用户群组。
    • 选择角色:依次选择 Cloud IAP > 受 IAP 保护的隧道的用户
  4. 点击添加 IAM 条件,然后配置条件:

    • 标题:输入条件的名称。
    • 条件构建器:从条件类型下拉菜单中选择访问权限级别,然后选择之前创建的基于证书的访问权限级别。
  5. 点击保存

API

如需配置对虚拟机的基于证书的访问权限,请修改应用的 policy.json 文件。

如需详细了解如何使用 IAM API 管理访问权限政策,请参阅管理对受 IAP 保护的资源的访问权限

  1. 导出以下变量。

    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
    
  2. 使用 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 ''
    
  3. 通过修改 IAM 政策 JSON 文件,向您的正文授予 iap.tunnelResourceAccessor 角色和基于证书的访问权限。

    以下是一个 policy.json 文件的示例,该文件会向一组虚拟机实例管理员授予 iap.tunnelResourceAccessor 角色,从而为他们提供对受 IAP 保护的隧道资源的基于证书的访问权限。

    请注意,如果主账号具有 Owner 角色,则有权使用 IAP 进行 TCP 转发。

    {
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["group:instance-admins@example.com"],
            "condition": {
              "expression": "\"accessPolicies/POLICY_NAME/accessLevels/CERTIFICATE_BASED_ACCESS_LEVEL_NAME\" in request.auth.access_levels,
              "title": "CERTIFICATE_BASED_CONDITION_NAME"
            }
          }
        ]
      }
    }
    

    如需查找政策名称,请调用 accessPolicies.list 方法。

    GET https://accesscontextmanager.googleapis.com/v1/accessPolicies
    
  4. 使用 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}
    

使用客户端证书访问虚拟机

如需使用客户端证书访问虚拟机,请使用以下方法之一。

  • 使用企业证书:如果您拥有 PKI 基础架构,请使用此方法。
  • 使用端点验证预配的证书:如果您没有 PKI 基础架构,请使用此方法。端点验证会为每台设备自动预配并向Google Cloud 注册自签名证书。

在 Chrome 浏览器中使用客户端证书访问虚拟机

  1. 使用以下选项之一配置 Chrome 浏览器。
  2. 在 Chrome 浏览器中,输入以下网域以访问 Google Cloud 控制台:console-secure.cloud.google.com
  3. Google Cloud 使用 IAP 隧道访问虚拟机。

在 gcloud CLI 上使用客户端证书访问虚拟机

  1. 使用以下任一方法配置 gcloud CLI。

  2. Google Cloud 使用 IAP 隧道访问虚拟机。