禁止对作业进行外部访问

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

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

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

更多信息 网络概念以及何时配置网络,请参阅 批量网络概览

准备工作

  1. 如果您之前未使用过批处理功能,请参阅开始使用批处理,并完成适用于项目和用户的前提条件,以启用批处理功能。
  2. 如需获得创建用于屏蔽外部访问的作业所需的权限,请让管理员向您授予以下 IAM 角色:

    如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

    您也可以通过自定义角色或其他预定义角色来获取所需的权限。

  3. 如果您阻止对作业虚拟机的外部访问,则需要识别该网络, 要使用的资源。您为作业指定的网络(用于阻止其虚拟机的外部访问)必须满足以下要求:
    • 该网络是与作业位于同一项目中的 Virtual Private Cloud (VPC) 网络,或者是托管作业项目或与作业项目共享的共享 VPC 网络
    • 该网络包含一个子网 在您想要运行作业的位置。
    • 该网络允许您的作业所需的任何访问权限。 如果您阻止对作业虚拟机的外部访问,该网络必须使用 Cloud NAT专用 Google 访问通道 以允许访问作业使用的 API 和服务的网域。 例如,所有作业都使用 Batch API 和 Compute Engine API,并且经常使用 Cloud Logging API。
    如需了解详情,请参阅创建和管理 VPC 网络

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

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

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

gcloud

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

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

如需创建作业并使用 gcloud 标志阻止对作业的外部访问,请执行以下操作: 请完成以下步骤:

  1. 创建一个 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:您要为此作业指定的名称。

后续步骤