禁止作业从外部访问

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

禁止作业访问外部网络以满足网络要求或提高安全性。如果出现以下任一情况,您必须使用没有外部 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:您要为此作业指定的名称。

后续步骤