安全存取私人網頁應用程式

本文說明如何設定 Chrome Enterprise Premium 安全閘道,確保私人網頁應用程式的存取安全。

Chrome Enterprise Premium 安全閘道可做為正向 Proxy,強制執行零信任存取架構,並提供精細的情境感知控制項,控管私人網頁應用程式的存取權。

如何確保私人網頁應用程式的存取安全

安全閘道會建立安全通道並強制執行情境感知存取權政策,確保私人應用程式的隱私權,避免暴露在公用網路上。用戶端瀏覽器設定會將這些應用程式的流量導向安全閘道 Proxy 端點。安全閘道接著會套用相關存取政策,並在允許的情況下,將要求轉送至目的地應用程式。

安全閘道可保護下列環境中代管的私有網頁應用程式:

  • Google Cloud 專案:安全閘道可直接存取在 Google Cloud 虛擬私有雲網路中執行的應用程式。

  • 非Google Cloud (內部部署資料中心或其他雲端):您必須先在Google Cloud 建立私人 VPC 網路與非Google Cloud 網路之間的連線。這通常是使用 Cloud VPN 或 Cloud Interconnect 完成。安全閘道接著會使用連線將流量傳送至私有虛擬私有雲網路,該網路會將流量傳送至非Google Cloud 環境。

事前準備

設定安全閘道前,請確認您具備下列項目:

設定殼層環境

如要簡化設定程序並與安全閘道 API 互動,請在工作殼層中定義下列環境變數。

  • 一般參數

    API="beyondcorp.googleapis.com"
    API_VERSION=v1
    PROJECT_ID=PROJECT_ID

    更改下列內容:

    • PROJECT_ID:建立安全閘道的專案 ID。
  • 安全閘道參數

    SECURITY_GATEWAY_ID=SECURITY_GATEWAY_ID
    SECURITY_GATEWAY_DISPLAY_NAME="SECURITY_GATEWAY_DISPLAY_NAME"

    更改下列內容:

    • SECURITY_GATEWAY_ID:要建立的安全閘道 ID。ID 最多可包含 63 個字元,且只能包含小寫英文字母、數字和連字號。第一個字元必須是英文字母,最後一個字元則須為英文字母或數字。
    • SECURITY_GATEWAY_DISPLAY_NAME:安全閘道清楚易懂的名稱。名稱長度上限為 63 個字元,且可包含可列印的字元。

建立安全閘道

Chrome Enterprise 進階版安全閘道是建立應用程式安全連線的基本要素。

gcloud

gcloud beyondcorp security-gateways create ${SECURITY_GATEWAY_ID} \
  --project=${PROJECT_ID} \
  --location=global \
  --display-name="${SECURITY_GATEWAY_DISPLAY_NAME}"
      

REST

curl \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-X POST \
-d '{ "display_name": "SECURITY_GATEWAY_DISPLAY_NAME" }' \
"https://${API}/${API_VERSION}/projects/${PROJECT_ID}/locations/global/securityGateways?security_gateway_id=${SECURITY_GATEWAY_ID}"
      

設定私人網頁應用程式

您必須先設定必要的權限和網路設定,才能在安全閘道中定義特定應用程式資源,確保連線和適當的路由。

將權限授予服務帳戶

如要順利將流量傳送至虛擬私有雲網路,安全閘道必須具備授予其委派服務帳戶的特定 IAM 權限。這樣一來,無論私人應用程式是託管在 Google Cloud VPC 中,還是透過 Cloud VPN 或 Cloud Interconnect 連線的非Google Cloud 環境,安全閘道都能存取。

  1. 取得安全閘道的詳細資料,找出委派服務帳戶的電子郵件地址。電子郵件地址會出現在回覆的 delegatingServiceAccount 欄位中。

    gcloud

    gcloud beyondcorp security-gateways describe ${SECURITY_GATEWAY_ID} \
       --project=${PROJECT_ID} \
       --location=global
                   

    REST

    curl \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://${API}/${API_VERSION}/projects/${PROJECT_ID}/locations/global/securityGateways/${SECURITY_GATEWAY_ID}"
                   
  2. 為服務帳戶和目標 VPC 專案設定環境變數。
    DELEGATING_SERVICE_ACCOUNT="security-gateway@my-gateway-service-account.iam.gserviceaccount.com" # Replace with actual value
          
  3. 在私人 VPC 專案中,將 roles/beyondcorp.upstreamAccess IAM 角色授予委派服務帳戶。
    gcloud projects add-iam-policy-binding PRIVATE_VPC_PROJECT_ID \
       --role=roles/beyondcorp.upstreamAccess \
       --member=serviceAccount:${DELEGATING_SERVICE_ACCOUNT}
        
    PRIVATE_VPC_PROJECT_ID 替換為部署私人網頁應用程式或設定 Cloud VPN/Intercconect 的 VPC 網路專案 ID。

授予角色後,Identity and Access Management 政策約需兩分鐘才會生效。

設定網路路由和防火牆規則

如要允許來自安全閘道的流量連上私人網路應用程式,請設定防火牆規則、網路路由和 DNS 設定。

應用程式的防火牆規則 Google Cloud

如果您的私人網路應用程式是託管在 Google Cloud 虛擬私有雲端Google Cloud 網路中,例如 Compute Engine VM、具有內部 IP 的 Google Kubernetes Engine 服務,或內部 TCP/UDP 負載平衡器後方,請設定Google Cloud 虛擬私有雲端防火牆規則。這樣一來,來自安全閘道 IP 範圍 (34.158.8.0/21136.124.16.0/20) 的輸入 TCP 流量就能通過。

非Google Cloud 環境中應用程式的防火牆規則

如果您的私人網路應用程式位於地端資料中心或其他雲端服務供應商的網路,並使用 Cloud VPN 或 Cloud Interconnect 連線至虛擬私有雲,請在地端防火牆或等效的網路安全控管機制 (例如安全群組和網路 ACL) 中設定防火牆規則。 Google Cloud允許來自安全閘道 IP 範圍的輸入 TCP 流量。

設定從非Google Cloud 環境到安全閘道的路徑

如要為非Google Cloud 環境 (例如地端部署或其他雲端) 中代管的私人應用程式建立雙向通訊,外部網路必須為下列安全閘道 IP 範圍建立回傳路徑:34.158.8.0/21136.124.16.0/20

確認私人網路可透過 Cloud VPN 或 Cloud Interconnect 存取安全閘道 IP 範圍:

  • 動態轉送:如果您使用動態轉送,例如透過 Cloud Router 使用邊界閘道協定 (BGP),請確認 Cloud Router Google Cloud 明確地將安全閘道 IP 範圍通告至內部部署 BGP 裝置。雖然 BGP 會動態交換許多路徑,但安全閘道 IP 範圍需要明確通告。

  • 靜態路徑:如果您使用靜態路徑,則必須在內部部署網路設備 (例如路由器或防火牆) 上,手動為每個安全閘道 IP 範圍新增路徑。這些靜態路徑必須指定,傳送至安全閘道 IP 範圍的流量必須透過 Cloud VPN 或 Cloud Interconnect 連線傳送。

    使用靜態路徑時,Cloud VPN 必須位於下列其中一個支援的區域:

    • africa-south1
    • asia-east1
    • asia-south1
    • asia-south2
    • asia-southeast1
    • europe-central2
    • europe-north1
    • europe-southwest1
    • europe-west1
    • europe-west2
    • europe-west3
    • europe-west4
    • europe-west8
    • europe-west9
    • northamerica-northeast1
    • northamerica-northeast2
    • northamerica-south1
    • southamerica-east1
    • southamerica-west1
    • us-central1
    • us-east1
    • us-east4
    • us-east5
    • us-west1

安全閘道私人主機名稱解析的 DNS 設定

如要讓安全閘道解析私人應用程式主機名稱,Google Cloud VPC 網路必須能夠使用 Cloud DNS 解析主機名稱。具體 Cloud DNS 設定取決於私人 DNS 記錄的授權代管位置:

  • 使用 Cloud DNS 私人區域的應用程式 Google Cloud :如果您的私人應用程式託管在 Google Cloud 中,且 DNS 記錄是在與 VPC 網路建立關聯的 Cloud DNS 私人區域中管理,請確認區域已正確設定且可存取。安全閘道會使用 VPC 現有的 Cloud DNS 解析功能。

  • 非Google Cloud 環境中的應用程式或使用外部 DNS 伺服器的應用程式:如果您的私人應用程式位於非Google Cloud環境 (地端或其他雲端),或其 DNS 記錄是由虛擬私有雲 Cloud DNS 私人區域外部的 DNS 伺服器管理,您必須設定 Cloud DNS,轉送這些私人網域的查詢。這通常需要在 VPC 中建立 Cloud DNS 轉送區域。這些區域會將指定私有網域的 DNS 查詢,導向您的授權私有 DNS 伺服器,例如地端部署或其他雲端。

如需 DNS 設定的詳細操作說明,請參閱「建立轉送區域」。

建立應用程式資源

如要提供私人 Web 應用程式的存取權,您必須在安全閘道架構中建立應用程式資源,這個資源會定義安全閘道如何識別應用程式的流量 (根據主機名稱),以及如何轉送該流量。

  1. 執行下列指令,設定必要的環境變數:
       APPLICATION_ID=APPLICATION_ID
       APP_DISPLAY_NAME="APP_DISPLAY_NAME"
       HOST_NAME=HOST_NAME
       PRIVATE_NETWORK_RESOURCE_NAME=PRIVATE_NETWORK_RESOURCE_NAME
       
    更改下列內容:
    • APPLICATION_ID:應用程式資源的專屬 ID。
    • APP_DISPLAY_NAME:要顯示的名稱,方便使用者辨識。
    • HOST_NAME:使用者存取的主要主機名稱 (例如 private.local)。
    • PRIVATE_NETWORK_RESOURCE_NAME:虛擬私有雲網路的完整資源名稱 (例如 projects/my-project/global/networks/my-network)。
  2. 建立應用程式資源。

    gcloud

    執行下列指令來建立應用程式資源。

    gcloud beyondcorp security-gateways applications create ${APPLICATION_ID} \
      --project=${PROJECT_ID} \
      --security-gateway=${SECURITY_GATEWAY_ID} \
      --location=global \
      --display-name="${APP_DISPLAY_NAME}" \
      --endpoint-matchers="hostname=${HOST_NAME},ports=[443]" \
      --upstreams=network=name="${PRIVATE_NETWORK_RESOURCE_NAME}"
            

    如要指定輸出區域 (例如使用靜態路徑時),請新增 --egress-regions 旗標:

    gcloud beyondcorp security-gateways applications create ${APPLICATION_ID} \
      --project=${PROJECT_ID} \
      --security-gateway=${SECURITY_GATEWAY_ID} \
      --location=global \
      --display-name="${APP_DISPLAY_NAME}" \
      --endpoint-matchers="hostname=${HOST_NAME},ports=[443]" \
      --upstreams=network=name="${PRIVATE_NETWORK_RESOURCE_NAME}",egressPolicy=regions=us-central1
            

    us-central1 替換為與區域靜態路由設定一致的 Google Cloud 區域 (例如 europe-west1asia-northeast1)。如果沒有特定的區域靜態路徑需求,可以從設定中省略輸出政策。

    REST

    如要使用 API 建立應用程式資源,請完成下列步驟:

    1. 建立名為 application.json 的檔案。

      {
      "display_name": "APP_DISPLAY_NAME",
      "endpoint_matchers": [
         {"hostname": "HOST_NAME", "ports": [443]}
      ],
      "upstreams": [{
         "network": {
            "name": "PRIVATE_NETWORK_RESOURCE_NAME"
         }
      }]
      }
               

      如要指定輸出區域 (例如使用靜態路徑時),請在上游設定中新增 egress_policy

      {
      "display_name": "APP_DISPLAY_NAME",
      "endpoint_matchers": [
         {"hostname": "HOST_NAME", "ports": [443]}
      ],
      "upstreams": [{
         "network": {
            "name": "PRIVATE_NETWORK_RESOURCE_NAME"
         },
         "egress_policy": {
            "regions": [
            "us-central1"
            ]
         }
      }]
      }
                

      us-central1 替換為與區域靜態路由設定一致的 Google Cloud 區域 (例如 europe-west1asia-northeast1)。如果沒有特定的區域靜態路徑需求,可以從設定中省略輸出政策。

    2. 呼叫 Create API 方法。

      curl \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json" \
      -X POST \
      -d @application.json \
      "https://${API}/${API_VERSION}/projects/${PROJECT_ID}/locations/global/securityGateways/${SECURITY_GATEWAY_ID}/applications?application_id=${APPLICATION_ID}"
                

設定 Google Chrome Proxy 模式

您可以在 Google 管理控制台的 Chrome 設定中套用 PAC 檔案,將應用程式流量轉送至安全的閘道。如要套用 PAC 檔案,請按照下列步驟操作:

  1. 建立或更新 PAC 檔案。

    • 請使用下列範例 PAC 檔案建立 pac_config.js 檔案,建立第一個應用程式。

    • 更新現有的 pac_config.js 檔案,並將新應用程式的網域新增至網站陣列,如下列 PAC 檔案範例所示。

    function FindProxyForURL(url, host) {
     const PROXY = "HTTPS ingress.cloudproxy.app:443";
     const sites = ["HOST_NAME"];
    
     for (const site of sites) {
       if (shExpMatch(url, 'https://' + site + '/*') || shExpMatch(url, '*.' + site + '/*')) {
         return PROXY;
       }
     }
    return 'DIRECT';
    }

    HOST_NAME 替換為應用程式的主機名稱,例如 myapp.example.com

    如果您使用現有的 PAC 檔案,但該檔案並非專為安全閘道而設,請將應用程式的網域新增至網站陣列,合併 PAC 檔案。

  2. 上傳檔案,讓使用者可以公開下載。舉例來說,您可以將檔案上傳至 Cloud Storage,並在 bucket 中授予所有使用者 Storage Object User 角色,讓他們公開下載檔案。

  3. 如要確認上傳的檔案是最新版本,請將 Cache-Control 標頭設為 no-cache,調整檔案的快取行為。這項設定可防止瀏覽器和中繼伺服器儲存檔案副本,確保 Chrome 下載最新版本。

    如要進一步瞭解 Cache-Control,以及這項指令對瀏覽器快取造成的影響,請參閱「Cache-Control 標頭」。

  4. 複製上傳檔案的公開網址。

更新 Proxy 模式設定

  1. 前往 Google 管理控制台
  2. 依序點選「裝置」>「Chrome」>「設定」
  3. 選取機構單位或群組,然後按一下「Proxy 模式」
  4. 在「Proxy 模式」中,選取「一律使用以下指定的 Proxy 自動設定」,然後輸入 Cloud Storage 中的 PAC 檔案網址。
  5. 如要儲存 Proxy 模式設定,請按一下「儲存」

設定存取權政策

您可以套用存取權政策,在安全閘道層級控管存取權 (這會影響所有相關聯的應用程式),也可以在個別應用程式層級進行更精細的控管。

安全地更新存取權政策

setIamPolicy 指令會將整個現有政策換成您提供的政策。為避免誤刪現有權限,建議您使用下列「讀取-修改-寫入」模式。這個模式有助於避免意外移除現有權限。

  1. 讀取:首先,取得目前的存取權政策。

  2. 修改:在本地編輯政策檔案,新增或變更權限。

  3. 寫入:套用更新後的政策檔案。

取得目前的政策

請先擷取目前的政策,再進行任何變更。

政策中的 etag 欄位會做為版本 ID。如果多位管理員同時進行變更,這項功能可避免更新作業發生衝突。

下列指令會擷取政策,並儲存至名為 policy.json 的檔案。

gcloud

gcloud beta beyondcorp security-gateways applications get-iam-policy APPLICATION_ID \
  --security-gateway=SECURITY_GATEWAY_ID \
  --project=PROJECT_ID \
  --location=global > policy.json

請替換下列項目:

  • APPLICATION_ID:應用程式資源的 ID
  • SECURITY_GATEWAY_ID:安全閘道的 ID
  • PROJECT_ID:設定安全閘道的專案 ID

REST

curl \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://${API}/${API_VERSION}/projects/PROJECT_ID/locations/global/securityGateways/SECURITY_GATEWAY_ID/applications/APPLICATION_ID:getIamPolicy" > policy.json

請替換下列項目:

  • PROJECT_ID:設定安全閘道的專案 ID
  • SECURITY_GATEWAY_ID:安全閘道的 ID
  • APPLICATION_ID:應用程式資源的 ID

這項指令會建立 policy.json 檔案,其中包含目前的政策。

修改政策檔案

在文字編輯器中開啟 policy.json 檔案。如要授予群組安全閘道的使用權,請將該群組新增至 members 角色的 roles/beyondcorp.securityGatewayUser 清單。

policy.json 檔案類似下列範例:

{
  "version": 3,
  "bindings": [
    {
      "role": "roles/beyondcorp.securityGatewayUser",
      "members": [
        "group:existing-group@example.com"
      ]
    }
  ],
  "etag": "BwXN8_d-bOM="
}

如要新增其他群組,請在 members 陣列中新增項目。在先前的項目後加上半形逗號。

以下範例會新增 new-group@example.com

{
  "version": 3,
  "bindings": [
    {
      "role": "roles/beyondcorp.securityGatewayUser",
      "members": [
        "group:existing-group@example.com",
        "group:new-group@example.com"
      ]
    }
  ],
  "etag": "BwXN8_d-bOM="
}

您也可以在政策繫結中新增其他類型的成員,例如 serviceAccountusergroupprincipalprincipalSet。詳情請參閱「IAM 主體」。

套用更新後的政策

編輯並儲存 policy.json 檔案後,請使用 setIamPolicy 指令將其套用至資源。這個指令會使用檔案中的 etag,確保您更新的是正確版本。

gcloud

gcloud beta beyondcorp security-gateways applications set-iam-policy APPLICATION_ID policy.json \
  --security-gateway=SECURITY_GATEWAY_ID \
  --project=PROJECT_ID \
  --location=global

請替換下列項目:

  • APPLICATION_ID:應用程式資源的 ID
  • SECURITY_GATEWAY_ID:安全閘道的 ID
  • PROJECT_ID:設定安全閘道的專案 ID

REST

jq '{policy: .}' policy.json | curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  -d @- \
  "https://${API}/${API_VERSION}/projects/PROJECT_ID/locations/global/securityGateways/SECURITY_GATEWAY_ID/applications/APPLICATION_ID:setIamPolicy"

請替換下列項目:

  • PROJECT_ID:設定安全閘道的專案 ID
  • SECURITY_GATEWAY_ID:安全閘道的 ID
  • APPLICATION_ID:應用程式資源的 ID

新增條件式存取政策

您也可以設定附帶條件的存取權政策。條件會指定需求,例如使用者 IP 位址的來源位置。

下列範例政策只會在來源 IP 位址位於指定存取層級內時,授予存取權:

{
  "version": 3,
  "bindings": [
    {
      "role": "roles/beyondcorp.securityGatewayUser",
      "members": [
        "group:group@example.com"
      ],
      "condition": {
        "expression": "request.auth.access_levels.contains('accessPolicies/1234567890/accessLevels/in_us')",
        "title": "Source IP must be in US"
      }
    }
  ],
  "etag": "BwXN8_d-bOM="
}

如要套用這項政策,請按照先前所述的步驟操作。

安裝 Chrome Enterprise 進階版擴充功能

Chrome Enterprise Premium 擴充功能是安全閘道不可或缺的一環,有助於進行驗證。為安全閘道的所有使用者安裝擴充功能。如要瞭解如何部署擴充功能,請參閱「查看及設定應用程式和擴充功能」。如要安裝 Chrome Enterprise Premium 擴充功能,請按照下列步驟操作:

  1. 前往 Google 管理控制台
  2. 依序點選「Chrome 瀏覽器」>「應用程式和擴充功能」
  3. 按一下「使用者和瀏覽器」分頁。
  4. 如要新增 Chrome 擴充功能,請按一下「+」按鈕。
  5. 搜尋下列擴充功能,然後要求機構單位或群組中的所有使用者安裝:

    ekajlcmdfcigmdbphhifahdfjbkciflj
  6. 按一下已安裝的擴充功能,然後在「擴充功能政策」欄位中輸入下列 JSON 值:

    {
      "securityGateway": {
        "Value": {
          "authentication": {},
          "context": { "resource": "projects/PROJECT_ID/locations/global/securityGateways/SECURITY_GATEWAY_ID" }
        }
      }
    }

    請替換下列項目:

    • PROJECT_ID:設定安全閘道的專案 ID
    • SECURITY_GATEWAY_ID:安全閘道的 ID

  7. 如要儲存設定,請按一下「儲存」

使用者體驗

設定完成後,系統會根據套用至應用程式的存取權政策,授予或拒絕存取受保護的 SaaS 應用程式。

在 Chrome 中存取應用程式

Chrome Enterprise 進階版擴充功能 必須將流量導向安全閘道。擴充功能會處理使用者與安全閘道之間的驗證。系統會透過網域政策自動安裝擴充功能。

使用者存取您設定的 SaaS 應用程式時,流量會通過安全閘道,系統會檢查使用者是否符合存取政策。如果使用者通過存取政策檢查,系統就會授予應用程式存取權。

如果授權政策拒絕瀏覽器存取應用程式,使用者會收到 Access denied 訊息。

後續步驟