本頁說明如何使用輸入和輸出規則,允許來自虛擬私有雲網路內部 IP 位址的流量進入服務範圍。
總覽
您可以使用 VPC Service Controls 指定條件,允許 VPC 網路的特定 IP 位址範圍存取受保護的專案和 VPC 網路。這項功能可讓您執行下列工作:
- 支援基本存取層級條件,允許虛擬私有雲網路的內部 IP 位址範圍。 
- 允許將這些存取層級條件用於 API 輸入或輸出呼叫,以進入或離開服務範圍界線。 
這項功能可帶來下列好處:
- 您可以在 VPC Service Controls 設定中指定條件,允許從虛擬私有雲網路中的內部 IP 位址存取。 
- 如果工作流程需要透過 API 呼叫傳遞多個服務安全防護範圍,您可以限制存取權,只允許少數子網路,而不是允許整個虛擬私有雲網路或專案。 
- 您可以設定不同資源,讓內部部署環境只能存取特定 Google Cloud 資源。您需要使用與這些地端資源和登陸區虛擬私有雲網路相關聯的子網路 IP 位址範圍,做為存取層級的一部分。 
圖 1 顯示的範例設定允許授權的內部 IP 位址存取特定受保護的服務。
使用內部 IP 位址的限制
在 VPC Service Controls 中使用內部 IP 位址時,適用下列限制:
- 您只能使用基本存取層級啟用內部 IP 位址,無法使用自訂存取層級。 
- 建議您不要使用以內部 IP 位址為準的條件來排除存取層級,以免發生非預期行為。 
- 將 VPC 網路新增至服務範圍時,也適用限制。 
- 當 VPC Service Controls 記錄政策遭拒的稽核記錄時,稽核記錄中的虛擬私有雲網路名稱會以 - __UNKNOWN__形式顯示。
- 系統不支援 - SUBNET_MODE設為- custom但沒有子網路的虛擬私有雲網路。如要啟用內部 IP 位址,虛擬私有雲網路必須至少包含一個子網路。
- 在存取權政策中,所有存取層級最多只能指定 500 個虛擬私有雲網路。 
- 如果您刪除存取層級或服務範圍參照的虛擬私有雲網路,然後重新建立同名的虛擬私有雲網路,VPC Service Controls 不會自動在新建立的虛擬私有雲網路上啟用內部 IP 位址。如要解決這項限制,請建立名稱不同的虛擬私有雲網路,並將其新增至範圍。 
- 您無法使用內部 IP 位址,允許從 Google 管理的服務存取。例如 Cloud SQL。 
- 如果您使用的存取層級含有以內部 IP 位址為準的條件和輸出規則,建議您不要在存取層級中新增任何其他條件,例如裝置類型、使用者身分。 
- 內部 IP 位址不符合參照地理區域的存取層級。 
在存取層級中使用內部 IP 位址
- 在 - vpcNetworkSources欄位中,指定「基本存取層級條件」的虛擬私有雲網路名稱和 IP 位址範圍。- 虛擬私有雲網路名稱。您必須以下列格式定義 VPC 網路名稱: - //compute.googleapis.com/projects/PROJECT_ID/global/networks/NETWORK_NAME - 例如 - //compute.googleapis.com/projects/my-project/global/networks/my-vpc。
- IP 位址範圍。 - VpcSubNetwork- VpcNetworkSource- VpcSubNetwork欄位中指定的 IP 位址範圍必須符合 CIDR 區塊 IP 子網路規格。您可以為子網路使用任何有效的 IPv4 範圍。
 
- 在 - IngressSource或- EgressSource中,將這個存取層級與允許條件搭配使用。
以下各節將以範例情境說明如何執行這些步驟,啟用內部 IP 位址。
使用內部 IP 位址設定子網路存取的範例
在下列範例中,您有兩個專案:
- 網路主專案: - Project1主機代管虛擬私有雲網路:- default。- Project1、- VM1和- VM2中的兩個 VM 會使用這個網路做為網路介面,藉此傳送流量。
- Cloud Storage 專案: - Project2包含 Cloud Storage 值區。
您可以使用 VPC Service Controls,只允許 Project1 中的 VM1 使用內部 IP 位址存取 Project2 中的 Cloud Storage 值區。如要完成這項設定,請按照下列步驟操作:
- 您可以在 - Project1周圍建立服務範圍- sp1,並在- Project2周圍建立另一個服務範圍- sp2。
- 然後,您可以在服務範圍中新增 Ingress 和 Egress 規則,只允許 - VM1的子網路存取 Cloud Storage 值區。
下圖顯示本範例所述的設定。
在機構層級設定存取政策
- 確認您已設定機構層級的存取政策。如果這個層級沒有存取權政策,請執行下列 gcloud CLI 指令: - gcloud access-context-manager policies create \ --organization=ORGANIZATION_ID --title=POLICY_TITLE- 更改下列內容: - ORGANIZATION_ID:貴機構的數值 ID。 
- POLICY_TITLE:使用者可自然閱讀的存取權政策標題。 
 - 詳情請參閱「建立機構層級存取權政策」。 
- 如要將這項政策設為預設存取權政策,請執行下列 gcloud CLI 指令: - gcloud config set access_context_manager/policy POLICY_NAME - 將 POLICY_NAME 換成存取權政策的數字名稱。 - 詳情請參閱「為 - gcloud指令列工具設定預設存取權政策」。
建立安全防護範圍,保護網路主專案和 Cloud Storage 專案
- 如要建立 - sp1周圍的重疊範圍- Project1,請執行下列 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。
 
- 如要在 - Project2周圍建立限制 Cloud Storage 服務的重疊範圍- 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。
 
如要進一步瞭解如何建立服務範圍,請參閱「建立服務範圍」。
建立這兩個安全防護範圍後,這兩個 VM 就無法再存取 Cloud Storage bucket。
建立存取層級,並以內部 IP 位址為基礎設定存取條件
建立存取層級,只允許來自 VM1 子網路的流量。
- 建立定義存取條件的 YAML 檔案。以下範例僅顯示啟用內部 IP 位址所需的屬性: - echo """ - vpcNetworkSources: - vpcSubnetwork: network: VPC_NETWORK_NAME vpcIpSubnetworks: - IP_RANGE """ > level.yaml- 更改下列內容: - VPC_NETWORK_NAME: - VM1所在的虛擬私有雲網路名稱。例如:- //compute.googleapis.com/projects/Project1/global/networks/default。
- IP_RANGE:子網路的 IP 位址範圍。例如: - 10.10.0.0/24。
 - 使用稍早說明的虛擬私有雲網路名稱和 IP 位址範圍格式。 - 如要進一步瞭解 YAML 檔案,請參閱 - basic-level-specYAML 檔案。
- 如要透過 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。
 - 詳情請參閱「建立基本存取層級」。 
設定 Ingress 政策,允許傳入的 API 流量進入 Cloud Storage 值區
如要只允許從 VM1 存取,請在sp2 範圍中設定 Ingress 政策,允許 Cloud Storage API 流量進入範圍。
- 建立定義 Ingress 政策的 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 檔案,請參閱Ingress 規則參考資料。 
- 如要更新服務範圍的輸入政策,請執行下列 gcloud CLI 指令: - gcloud access-context-manager perimeters update PERIMETER --set-ingress-policies=FILE_NAME - 更改下列內容: - PERIMETER:保護 Cloud Storage 專案的服務範圍名稱。例如: - sp2。
- FILE_NAME:定義 Ingress 政策的 YAML 檔案。例如: - ingress.yaml。
 - 詳情請參閱「更新服務周邊的輸入和輸出政策」。 
設定輸出政策,允許輸出 API 流量傳輸至 Cloud Storage 值區
此外,請在 sp1 範圍中設定輸出政策,允許 Cloud Storage API 流量離開範圍。
- 建立定義輸出政策的 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 檔案,請參閱輸出規則參考資料。 
- 如要更新服務範圍的出站政策,請執行下列指令: - gcloud access-context-manager perimeters update PERIMETER --set-egress-policies=FILE_NAME - 更改下列內容: - PERIMETER:保護網路主機專案的服務安全防護範圍名稱。例如: - sp1。
- FILE_NAME:定義輸出政策的 YAML 檔案。例如: - egress.yaml。
 - 詳情請參閱「更新服務周邊的輸入和輸出政策」。 
設定輸入和輸出政策後,即可從 VM1 存取 Cloud Storage 值區,但無法從 VM2 存取。
建議
- 啟用內部 IP 位址時,建議您為 VM 停用 IP 轉送。IP 轉送功能可讓相同 VPC 網路中的 VM 使用其他 IP 位址傳送要求,因此有 IP 位址詐欺的風險。 
- 如要啟用 IP 轉送,建議使用下列設定,降低 IP 位址詐欺的風險: