允許從內部 IP 位址存取受保護的資源

本頁面說明如何使用輸入和輸出規則,允許來自虛擬私有雲網路內部 IP 位址的流量進入 service perimeter。

總覽

您可以使用 VPC Service Controls 指定條件,允許虛擬私有雲網路的特定 IP 位址範圍存取受保護的專案和虛擬私有雲網路。這項功能可讓您執行下列任務:

  • 支援基本存取層級條件,允許虛擬私有雲網路的內部 IP 位址範圍。

  • 允許將這些存取層級條件用於輸入或輸出 API 呼叫,以進入或離開 service perimeter 邊界。

這項功能可帶來下列好處:

  • 您可以在 VPC Service Controls 設定中指定條件,允許從虛擬私有雲網路中的內部 IP 位址存取。

  • 如果工作流程需要透過多個 service perimeter 傳遞 API 呼叫,您可以限制存取權,只允許少數子網路,而不是允許整個虛擬私有雲網路或專案。

  • 您可以設定地端部署的不同資源,只允許存取特定 Google Cloud 資源。您需要使用與這些地端部署資源和登陸區虛擬私有雲網路相關聯的子網路 IP 位址範圍,做為存取層級的一部分。

圖 1 顯示的範例設定允許授權的內部 IP 位址存取特定受保護的服務。

使用內部 IP 位址的限制

在 VPC Service Controls 中使用內部 IP 位址時,適用下列限制:

  • 您只能透過基本存取層級啟用內部 IP 位址,無法透過自訂存取層級啟用。

  • 建議您不要使用以內部 IP 位址為依據的條件來排除存取層級,否則可能導致非預期行為。

  • 將虛擬私有雲網路新增至 service perimeter 時,也適用限制

  • VPC Service Controls 記錄政策遭拒的稽核記錄時,會從稽核記錄中遮蓋虛擬私有雲網路名稱,並以 __UNKNOWN__ 取代。

  • 系統不支援 SUBNET_MODE 設為 custom 但沒有子網路的虛擬私有雲網路。如要啟用內部 IP 位址,虛擬私有雲網路必須至少包含一個子網路。

  • 您只能在存取權政策的所有存取層級中,指定 500 個虛擬私有雲網路

  • 如果您刪除存取層級或 service perimeter 參照的虛擬私有雲網路,然後重新建立同名的虛擬私有雲網路,VPC Service Controls 不會自動在重新建立的虛擬私有雲網路上啟用內部 IP 位址。如要解決這項限制,請建立不同名稱的虛擬私有雲網路,並將其新增至 perimeter。

  • 您無法使用內部 IP 位址,允許從 Google 代管服務存取,例如,Cloud SQL。

  • 如果您使用含內部 IP 位址條件的存取層級和輸出規則,建議您不要在存取層級中新增任何其他條件,例如裝置類型、使用者身分。

  • 內部 IP 位址不符合參照地理區域的存取層級。

在存取層級中使用內部 IP 位址

  1. 基本存取層級條件vpcNetworkSources 欄位中,指定虛擬私有雲網路名稱和 IP 位址範圍。

    • 虛擬私有雲網路名稱:您必須以下列格式定義虛擬私有雲網路名稱:

      //compute.googleapis.com/projects/PROJECT_ID/global/networks/NETWORK_NAME
      

      例如://compute.googleapis.com/projects/my-project/global/networks/my-vpc

    • IP 位址範圍:VpcNetworkSourceVpcSubNetwork 欄位中指定的 IP 位址範圍必須符合 CIDR 區塊 IP 子網路規格。您可以為子網路使用任何有效 IPv4 範圍的 IP 位址範圍。

  2. IngressSourceEgressSource 中,將這個存取層級與允許條件搭配使用。

下列各節將以範例情境說明如何執行這些步驟,啟用內部 IP 位址。

使用內部 IP 位址設定子網路存取的範例

在下列範例中,您有兩個專案:

  1. 網路主專案:Project1 會託管虛擬私有雲網路:defaultProject1VM1VM2 中的兩個 VM 會使用這個網路做為網路介面,藉此傳送流量。

  2. Cloud Storage 專案:Project2 包含 Cloud Storage bucket。

您可以使用 VPC Service Controls,只允許 VM1Project1 使用內部 IP 位址存取 Project2 中的 Cloud Storage bucket。如要完成這項設定,請按照下列步驟操作:

  1. 您會在 Project1 周圍建立 service perimeter sp1,並在 Project2 周圍建立另一個 service perimeter sp2

  2. 接著,您可以在 service perimeter 中新增輸入和輸出規則,只允許 VM1 的子網路存取 Cloud Storage bucket。

下圖顯示本範例所述的設定。

在組織層級設定存取權政策

  1. 確認您已設定組織層級的存取權政策。如果這個層級沒有存取權政策,請執行下列 gcloud CLI 指令:

    gcloud access-context-manager policies create \
        --organization=ORGANIZATION_ID --title=POLICY_TITLE
    

    更改下列內容:

    • ORGANIZATION_ID:組織的數字 ID。

    • POLICY_TITLE:存取權政策的人類可讀標題。

    詳情請參閱「建立組織層級存取權政策」。

  2. 取得存取權政策的名稱

  3. 如要將這項政策設為預設存取權政策,請執行下列 gcloud CLI 指令:

    gcloud config set access_context_manager/policy POLICY_NAME
    

    POLICY_NAME 替換為存取權政策的數字名稱。

    詳情請參閱「設定 gcloud 指令列工具的預設存取權政策」。

建立 perimeter,以保護網路主專案和 Cloud Storage 專案

  1. 如要建立 Project1 周圍的 perimeter sp1,請執行下列 gcloud CLI 指令:

    gcloud access-context-manager perimeters create sp1 --title="sp1" --resources=PROJECT_NUMBER \
        --restricted-services=storage.googleapis.com --policy=POLICY_NAME
    

    更改下列內容:

    • PROJECT_NUMBER:網路主專案的專案編號。例如:projects/111

    • POLICY_NAME:存取權政策的數字名稱。例如:1234567890

  2. 如要建立可限制 Cloud Storage 服務並圍繞 Project2 的perimeter sp2,請執行下列 gcloud CLI 指令:

    gcloud access-context-manager perimeters create sp2 --title="sp2" --resources=PROJECT_NUMBER \
        --restricted-services=storage.googleapis.com --policy=POLICY_NAME
    

    更改下列內容:

    • PROJECT_NUMBER:Cloud Storage 專案的專案編號。例如:projects/222

    • POLICY_NAME:存取權政策的數字名稱。例如:1234567890

如要進一步瞭解如何建立 service perimeter,請參閱「建立 service perimeter」。

建立這兩個 perimeter 後,這兩個 VM 就無法再存取 Cloud Storage bucket。

建立存取層級,並以內部 IP 位址為基礎設定存取條件

建立存取層級,只允許來自 VM1 子網路的流量。

  1. 建立定義存取條件的 YAML 檔案。下列範例僅顯示啟用內部 IP 位址所需的屬性:

    echo """
    - vpcNetworkSources:
      - vpcSubnetwork:
          network: VPC_NETWORK_NAME
          vpcIpSubnetworks:
          - IP_RANGE
    
    """ > level.yaml
    

    更改下列內容:

    • VPC_NETWORK_NAMEVM1 所在的虛擬私有雲網路名稱。例如://compute.googleapis.com/projects/Project1/global/networks/default

    • IP_RANGE:子網路的 IP 位址範圍。例如:10.10.0.0/24

    使用先前說明的虛擬私有雲網路名稱和 IP 位址範圍格式。

    如要進一步瞭解 YAML 檔案,請參閱 basic-level-spec YAML 檔案

  2. 如要使用 YAML 檔案建立存取層級,請執行下列 gcloud CLI 指令:

    gcloud access-context-manager levels create LEVEL_NAME \
        --title="TITLE" --basic-level-spec=FILE_NAME
    

    更改下列內容:

    • LEVEL_NAME:存取層級的專屬名稱。例如:allowvm1

    • TITLE:存取層級的人類可讀簡短標題。例如:allowvm1

    • FILE_NAME:定義存取層級存取條件的 YAML 檔案。例如:level.yaml

    詳情請參閱「建立基本存取層級」。

設定輸入政策,允許傳入 Cloud Storage bucket 的 API 流量

如要只允許從 VM1 存取,請在 sp2 perimeter 設定輸入政策,允許 Cloud Storage API 流量進入 perimeter。

  1. 建立定義輸入政策的 YAML 檔案。

    echo """
    - ingressFrom:
        identityType: ANY_IDENTITY
        sources:
        - accessLevel: accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME
      ingressTo:
        operations:
        - methodSelectors:
          - method: '*'
          serviceName: storage.googleapis.com
        resources:
        - '*'
    
    """ > ingress.yaml
    

    更改下列內容:

    • POLICY_NAME:存取權政策的數字名稱。例如:1234567890

    • ACCESS_LEVEL_NAME:存取層級的名稱。例如:allowvm1

    如要進一步瞭解 YAML 檔案,請參閱輸入規則參考資料

  2. 如要更新 service perimeter 的輸入政策,請執行下列 gcloud CLI 指令:

    gcloud access-context-manager perimeters update PERIMETER --set-ingress-policies=FILE_NAME
    

    更改下列內容:

    • PERIMETER:保護 Cloud Storage 專案的 service perimeter 名稱。例如:sp2

    • FILE_NAME:定義輸入政策的 YAML 檔案。例如:ingress.yaml

    詳情請參閱「更新 service perimeter 的輸入和輸出政策」。

設定輸出政策,允許輸出 API 流量傳輸至 Cloud Storage bucket

此外,請在 sp1 perimeter 中設定輸出政策,允許 Cloud Storage API 流量離開 perimeter。

  1. 建立定義輸出政策的 YAML 檔案。請確認您在 YAML 檔案中將 sourceRestriction 欄位設為 SOURCE_RESTRICTION_ENABLED

    echo """
    - egressFrom:
        identityType: ANY_IDENTITY
        sourceRestriction: SOURCE_RESTRICTION_ENABLED
        sources:
        - accessLevel: accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME
      egressTo:
        operations:
        - methodSelectors:
          - method: '*'
          serviceName: storage.googleapis.com
        resources:
        - '*'
    
    """ > egress.yaml
    

    更改下列內容:

    • POLICY_NAME:存取權政策的數字名稱。例如:1234567890

    • ACCESS_LEVEL_NAME:存取層級的名稱。例如:allowvm1

    如要進一步瞭解 YAML 檔案,請參閱輸出規則參考資料

  2. 如要更新 service perimeter 的輸出政策,請執行下列指令:

    gcloud access-context-manager perimeters update PERIMETER --set-egress-policies=FILE_NAME
    

    更改下列內容:

    • PERIMETER:service perimeter 的名稱,用於保護網路主專案。例如:sp1

    • FILE_NAME:定義輸出政策的 YAML 檔案。例如:egress.yaml

    詳情請參閱「更新 service perimeter 的輸入和輸出政策」。

設定輸入和輸出政策後,即可從 VM1 存取 Cloud Storage bucket,但無法從 VM2 存取。

建議

  • 啟用內部 IP 位址時,建議您為 VM 停用 IP 轉送。IP 轉送功能可讓相同虛擬私有雲網路中的 VM 使用其他 IP 位址傳送要求,因此有 IP 位址假冒的風險。

  • 如要啟用 IP 轉送,建議使用下列設定,降低 IP 位址假冒的風險:

    • 使用 Restrict VM IP Forwarding 組織政策限制 (constraints/compute.vmCanIpForward),確保只有授權的 VM 才能啟用 IP 轉送功能。

    • 使用防火牆規則的來源,限制可與啟用 IP 轉送的 VM 通訊的 IP 位址。需負責完成下列任務:

      • 設定輸入防火牆規則,只允許來自特定 IP 位址範圍的傳入流量,傳送至已啟用 IP 轉送功能的 VM。

      • 設定輸出防火牆規則,只允許來自啟用 IP 轉送功能的 VM,將輸出流量傳送至特定 IP 位址範圍。