禁止从外部访问作业

本文档介绍了如何配置 Batch 作业以阻止其所有虚拟机或特定容器的外部访问。

禁止作业的外部访问以满足网络要求或提高安全性。如果满足以下任一条件,您必须使用没有外部 IP 地址的虚拟机来阻止对作业虚拟机的外部访问:

或者,如果您不想阻止某个作业的所有直接外部访问,则可以阻止该作业运行的任何容器的外部访问。

如需详细了解网络概念以及何时配置网络,请参阅批量网络概览

准备工作

创建一个阻止所有虚拟机的外部访问的作业

创建作业时,禁止其外部访问作业的虚拟机。 如果阻止作业运行的所有虚拟机的外部访问,您还需要指定允许作业访问所需 API 的网络和子网。

如果您希望在创建此作业时使用虚拟机实例模板,则必须在虚拟机实例模板中指定网络并停用外部 IP 地址。否则,请按照以下步骤使用 gcloud CLI 或 Batch API 阻止作业的虚拟机从外部访问。

gcloud

如需使用 gcloud CLI 创建阻止外部访问的作业,请选择以下选项之一:

使用 gcloud 标志阻止所有虚拟机的外部访问

如需创建作业并使用 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 命令创建作业。 如需阻止所有虚拟机的外部访问,请添加 --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 网络,请指定宿主项目。
      • 否则,请指定当前项目。
    • NETWORK:当前项目中的 VPC 网络的名称,或者由当前项目托管或与当前项目共享的共享 VPC 网络的名称。
    • REGION:子网和用于作业的虚拟机所在的区域
      • 如果您添加 allowedLocations 字段以便为作业指定允许的虚拟机位置,则必须在此处指定相同的区域。
      • 否则,区域必须与您为作业选择的位置 (LOCATION) 相同。
    • SUBNET:属于 VPC 网络并且与作业的虚拟机位于同一区域的子网的名称。

使用 JSON 字段阻止所有虚拟机的外部访问

如需创建作业并使用 JSON 配置文件中的字段来阻止所有虚拟机的外部访问,请完成以下步骤:

  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
        }
      ],
      "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
      • 如果您使用的是共享 VPC 网络,请指定宿主项目。
      • 否则,请指定当前项目。
    • NETWORK:提供此作业所需访问权限的网络的名称。网络必须是当前项目中的 VPC 网络,或者是由当前项目托管或与当前项目共享的共享 VPC 网络
    • REGION:子网和用于作业的虚拟机所在的区域
      • 如果您添加 allowedLocations 字段以便为作业指定允许的虚拟机位置,则必须在此处指定相同的区域。
      • 否则,区域必须与您为作业选择的位置 (LOCATION) 相同。
    • SUBNET:属于 VPC 网络并且与作业的虚拟机位于同一区域的子网的名称。
  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 方法并指定作业的配置详细信息。如需禁止所有虚拟机从外部访问,请执行以下操作:

例如,如需创建一个基本脚本作业来阻止对所有虚拟机进行外部访问,请发出以下 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
    • 如果您使用的是共享 VPC 网络,请指定宿主项目。
    • 否则,请指定当前项目 (PROJECT_ID)。
  • NETWORK:提供此作业所需访问权限的网络的名称。网络必须是当前项目中的 VPC 网络,或者是由当前项目托管或与当前项目共享的共享 VPC 网络
  • REGION:子网和用于作业的虚拟机所在的区域
    • 如果您添加 allowedLocations 字段以便为作业指定允许的虚拟机位置,则必须在此处指定相同的区域。
    • 否则,区域必须与您为作业选择的位置 (LOCATION) 相同。
  • SUBNET:属于 VPC 网络并且与作业的虚拟机位于同一区域的子网的名称。

创建一个作业,以阻止一个或多个容器的外部访问

创建作业时,阻止其任何容器的外部访问。

您可以使用 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:您想要的此作业的名称。

后续步骤