封鎖工作外部存取權

本文說明如何設定 Batch 工作,以封鎖所有 VM 或特定容器的外部存取權。

封鎖工作外部存取權,以符合網路需求或提升安全性。如果符合下列任一條件,您必須使用沒有外部 IP 位址的 VM,封鎖作業 VM 的外部存取權:

或者,如果您不想封鎖作業的所有外部直接存取權,可以封鎖作業執行的任何容器的外部存取權。

如要進一步瞭解網路概念和設定網路的時機,請參閱 Batch 網路總覽

事前準備

  1. 如果您從未使用過 Batch,請參閱「開始使用 Batch」,並完成專案和使用者的必要條件,啟用 Batch。
  2. 如要取得建立工作所需的權限,請管理員授予下列 IAM 角色:

    如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

    您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

  3. 如果封鎖工作 VM 的外部存取權,您需要找出要用於工作的網路。為禁止 VM 外部存取的工作指定網路時,必須符合下列規定:
    • 網路是與作業位於相同專案的虛擬私有雲 (VPC) 網路,或是由作業專案代管或與該專案共用的共用虛擬私有雲網路
    • 網路包含您要執行工作的地點中的子網路
    • 這個網路可提供工作所需的任何存取權。 如果封鎖作業 VM 的外部存取權,網路就必須使用 Cloud NAT私人 Google 存取權,才能存取作業使用的 API 和服務網域。舉例來說,所有工作都會使用 Batch 和 Compute Engine API,而且經常使用 Cloud Logging API。
    詳情請參閱「建立及管理虛擬私有雲網路」。

建立工作,封鎖所有 VM 的外部存取權

建立工作時,封鎖工作 VM 的外部存取權。 如果封鎖工作執行所在的所有 VM 的外部存取權,您也必須指定網路和子網路,允許工作存取必要的 API。

如要在建立這項作業時使用 VM 執行個體範本,您必須在 VM 執行個體範本中指定網路,並停用外部 IP 位址。否則,請按照下列步驟,使用 gcloud CLI 或 Batch API 封鎖工作 VM 的外部存取權。

gcloud

如要使用 gcloud CLI 建立禁止外部存取的工作,請選取下列任一選項:

使用 gcloud 標記封鎖所有 VM 的外部存取權

如要建立工作並使用 gcloud 旗標封鎖工作外部存取權,請完成下列步驟:

  1. 建立 JSON 檔案,指定作業的設定詳細資料。

    舉例來說,如要建立基本指令碼作業,請建立包含下列內容的 JSON 檔案。

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks."
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    
  2. 使用 gcloud batch jobs submit 指令建立工作。 如要封鎖所有 VM 的外部存取權,請加入 --no-external-ip-address--network--subnetwork 標記。

    gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE \
        --no-external-ip-address \
        --network projects/HOST_PROJECT_ID/global/networks/NETWORK \
        --subnetwork projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET
    

    更改下列內容:

    • JOB_NAME:這項工作的名稱。
    • LOCATION:這項工作的地點
    • JSON_CONFIGURATION_FILE:JSON 檔案的路徑,內含作業的設定詳細資料。
    • HOST_PROJECT_ID:您指定網路的專案 ID
      • 如果您使用共用虛擬私有雲網路,請指定主專案。
      • 否則,請指定目前專案。
    • :目前專案中的 VPC 網路名稱,或是由目前專案代管或與目前專案共用的共用 VPC 網路NETWORK
    • REGION:子網路和作業 VM 所在的區域
      • 如果您加入allowedLocations 欄位,指定工作 VM 的允許位置,則必須在此處指定相同區域。
      • 否則,地區必須與您為工作選取的位置 (LOCATION) 相同。
    • SUBNET子網路的名稱,該子網路屬於虛擬私有雲網路,且與作業的 VM 位於相同區域。

使用 JSON 欄位封鎖所有 VM 的外部存取權

如要建立工作,並使用 JSON 設定檔中的欄位封鎖所有 VM 的外部存取權,請完成下列步驟:

  1. 建立 JSON 檔案,指定作業的設定詳細資料。如要封鎖所有 VM 的外部存取權,請按照下列步驟操作:

    舉例來說,如要建立基本指令碼作業,禁止所有 VM 存取外部資源,請建立內容如下的 JSON 檔案。

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks."
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "network": {
          "networkInterfaces": [
            {
              "network": "projects/HOST_PROJECT_ID/global/networks/NETWORK",
              "subnetwork": "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET",
              "noExternalIpAddress": true
            }
          ]
        }
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

    更改下列內容:

    • HOST_PROJECT_ID:您指定網路的專案 ID
      • 如果您使用共用虛擬私有雲網路,請指定主專案。
      • 否則,請指定目前專案。
    • NETWORK:提供這項工作所需存取權的網路名稱。網路必須是目前專案中的虛擬私有雲網路,或是由目前專案代管或與目前專案共用的共用虛擬私有雲網路
    • REGION:子網路和作業 VM 所在的區域
      • 如果您加入allowedLocations 欄位,指定工作 VM 的允許位置,則必須在此處指定相同區域。
      • 否則,地區必須與您為工作選取的位置 (LOCATION) 相同。
    • SUBNET子網路的名稱,該子網路屬於虛擬私有雲網路,且與作業的 VM 位於相同區域。
  2. 使用 gcloud batch jobs submit 指令建立工作。

    gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE
    

    更改下列內容:

    • JOB_NAME:您要為這項工作指定的名稱。
    • LOCATION:這項工作的地點
    • JSON_CONFIGURATION_FILE:JSON 檔案的路徑,內含作業的設定詳細資料。

API

如要使用 Batch API 建立工作,請使用 jobs.create 方法,並指定工作設定詳細資料。如要封鎖所有 VM 的外部存取權,請按照下列步驟操作:

舉例來說,如要建立基本指令碼工作,禁止所有 VM 的外部存取權,請發出下列 POST 要求:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks."
            }
          }
        ]
      },
      "taskCount": 3
    }
  ],
  "allocationPolicy": {
    "network": {
      "networkInterfaces": [
        {
          "network": "projects/HOST_PROJECT_ID/global/networks/NETWORK",
          "subnetwork": "projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET",
          "noExternalIpAddress": true
        }
      ]
    }
  },
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

更改下列內容:

  • PROJECT_ID:專案的專案 ID
  • LOCATION:這項工作的地點
  • JOB_NAME:您要為這項工作指定的名稱。
  • HOST_PROJECT_ID:您指定網路的專案 ID
    • 如果您使用共用虛擬私有雲網路,請指定主專案。
    • 否則,請指定目前專案 (PROJECT_ID)。
  • NETWORK:提供這項工作所需存取權的網路名稱。網路必須是目前專案中的虛擬私有雲網路,或是由目前專案代管或與目前專案共用的共用虛擬私有雲網路
  • REGION:子網路和作業 VM 所在的區域
    • 如果您加入allowedLocations 欄位,指定工作 VM 的允許位置,則必須在此處指定相同區域。
    • 否則,地區必須與您為工作選取的位置 (LOCATION) 相同。
  • SUBNET子網路的名稱,該子網路屬於虛擬私有雲網路,且與作業的 VM 位於相同區域。

建立工作,禁止一或多個容器存取外部資源

建立工作時,封鎖任何工作容器的外部存取權。

您可以使用 gcloud CLI 或 Batch API,封鎖任何工作容器的外部存取權。

gcloud

如要使用 gcloud CLI 建立工作,禁止一或多個容器的外部存取權,請完成下列步驟:

  1. 建立 JSON 檔案,指定作業的設定詳細資料。針對您要限制的作業中每個容器,將 blockExternalNetwork 欄位設為 true

    舉例來說,如要建立基本容器作業,禁止容器進行外部存取,請建立含有下列內容的 JSON 檔案。

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "container": {
                  "imageUri": "gcr.io/google-containers/busybox",
                  "entrypoint": "/bin/sh",
                  "commands": [
                    "-c",
                    "echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks."
                  ],
                  "blockExternalNetwork": true
                }
              }
            ]
          },
          "taskCount": 4,
          "parallelism": 2
        }
      ],
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    
  2. 使用 gcloud batch jobs submit 指令建立工作。

    gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE
    

    更改下列內容:

    • JOB_NAME:您要為這項工作指定的名稱。
    • LOCATION:這項工作的地點
    • JSON_CONFIGURATION_FILE:JSON 檔案的路徑,內含作業的設定詳細資料。

API

如要使用 Batch API 建立工作,請使用 jobs.create 方法,並指定工作設定詳細資料。針對您要限制的作業中每個容器,將 blockExternalNetwork 欄位設為 true

舉例來說,如要建立基本容器工作,禁止容器存取外部資源,請發出下列 POST 要求:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "container": {
              "imageUri": "gcr.io/google-containers/busybox",
              "entrypoint": "/bin/sh",
              "commands": [
                "-c",
                "echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks."
              ],
              "blockExternalNetwork": true
            }
          }
        ]
      },
      "taskCount": 4,
      "parallelism": 2
    }
  ],
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

更改下列內容:

  • PROJECT_ID:專案的專案 ID
  • LOCATION:這項工作的地點
  • JOB_NAME:您要為這項工作指定的名稱。

後續步驟