חסימת גישה חיצונית למשרה

במאמר הזה מוסבר איך מגדירים משימה באצווה כדי לחסום גישה חיצונית לכל המכונות הווירטואליות או לקונטיינרים ספציפיים שלה.

חסימת גישה חיצונית לעבודה כדי לעמוד בדרישות הרשת או לשפר את האבטחה. אם אחד מהתנאים הבאים מתקיים, אתם צריכים לחסום את הגישה החיצונית למכונות הווירטואליות של משימה באמצעות מכונות וירטואליות ללא כתובות IP חיצוניות:

  • הפרויקט שלך מוגבל על ידי האילוץ של מדיניות הארגון compute.vmExternalIpAccess.
  • הרשת שאתם מציינים לעבודה משתמשת בגישה פרטית ל-Google כדי להגדיר קישוריות פרטית ל-Google APIs ולשירותים של Google. לגישה פרטית ל-Google אין השפעה על מכונות וירטואליות עם כתובות IP חיצוניות.

    אם הרשת שציינתם לעבודה משתמשת בגישה פרטית ל-Google עם VPC Service Controls ל-Batch, כדאי לעיין במאמר בנושא שימוש ב-VPC Service Controls וב-Batch.

לחלופין, אם אתם לא רוצים לחסום את כל הגישה החיצונית הישירה למשימה, אתם יכולים לחסום גישה חיצונית לכל מאגר שהמשימה מופעלת בו.

מידע נוסף על מושגים של רשתות ומתי צריך להגדיר רשתות זמין במאמר סקירה כללית על רשתות Batch.

לפני שמתחילים

  1. אם עוד לא השתמשתם ב-Batch, כדאי לעיין במאמר תחילת העבודה עם Batch ולהפעיל את Batch על ידי השלמת הדרישות המוקדמות לפרויקטים ולמשתמשים.
  2. כדי לקבל את ההרשאות שדרושות ליצירת משימה שחוסמת גישה חיצונית, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:

    להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

    יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

  3. אם חוסמים גישה חיצונית למכונות הווירטואליות של משימה, צריך לזהות את הרשת שרוצים להשתמש בה למשימה. הרשת שמציינים לעבודות שחוסמות גישה חיצונית למכונות הווירטואליות שלהן צריכה לעמוד בדרישות הבאות:
    • הרשת היא רשת של ענן וירטואלי פרטי (VPC) שנמצאת באותו פרויקט כמו העבודה, או רשת VPC משותפת שמארחת את הפרויקט של העבודה או משותפת איתו.
    • הרשת כוללת רשת משנה (subnet) במיקום שבו רוצים להריץ את העבודה.
    • הרשת מאפשרת כל גישה שנדרשת לעבודה שלכם. אם חוסמים גישה חיצונית למכונות וירטואליות של משימה, הרשת צריכה להשתמש ב-Cloud NAT או ב-גישה פרטית ל-Google כדי לאפשר גישה לדומיינים של ממשקי ה-API והשירותים שבהם נעשה שימוש במשימה. לדוגמה, כל העבודות משתמשות בממשקי Batch ו-Compute Engine API, ולעתים קרובות גם ב-Cloud Logging API.
    מידע נוסף זמין במאמר בנושא יצירה וניהול של רשתות VPC.

יצירת עבודה שחוסמת גישה חיצונית לכל המכונות הווירטואליות

חסימת גישה חיצונית למכונות וירטואליות של משימה כשיוצרים את המשימה. כשחוסמים גישה חיצונית לכל המכונות הווירטואליות שעליהן מופעלת משימה, צריך גם לציין רשת ותת-רשת שמאפשרות למשימה לגשת לממשקי ה-API הנדרשים.

אם רוצים להשתמש בתבנית של הגדרות מכונה כשיוצרים את העבודה הזו, צריך לציין את הרשת ולהשבית את כתובות ה-IP החיצוניות בתבנית של הגדרות המכונה הווירטואלית. אחרת, אפשר להשתמש בשלבים הבאים כדי לחסום גישה חיצונית למכונות וירטואליות של עבודה באמצעות ה-CLI של gcloud או Batch API.

gcloud

כדי ליצור משימה שחוסמת גישה חיצונית באמצעות ה-CLI של gcloud, בוחרים באחת מהאפשרויות הבאות:

שימוש בדגלים של 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. כדי לחסום גישה חיצונית לכל המכונות הווירטואליות, צריך לכלול את הדגלים --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: מזהה הפרויקט של הפרויקט שבו נמצאת הרשת שציינתם:
      • אם אתם משתמשים ברשת VPC משותפת, צריך לציין את הפרויקט המארח.
      • אחרת, מציינים את הפרויקט הנוכחי.
    • NETWORK: השם של רשת VPC בפרויקט הנוכחי או של רשת VPC משותפת שמארחת את הפרויקט הנוכחי או שמשותפת איתו.
    • REGION: האזור שבו נמצאים תת-הרשת והמכונות הווירטואליות של העבודה:
      • אם כוללים את השדה allowedLocations כדי לציין את המיקום המותר של המכונות הווירטואליות עבור העבודה, צריך לציין כאן את אותו אזור.
      • אחרת, האזור צריך להיות זהה למיקום שבוחרים למשרה (LOCATION).
    • SUBNET: השם של תת-רשת שמהווה חלק מרשת ה-VPC ונמצאת באותו אזור כמו המכונות הווירטואליות של העבודה.

שימוש בשדות JSON כדי לחסום גישה חיצונית לכל מכונות ה-VM

כדי ליצור עבודה ולהשתמש בשדות בקובץ ההגדרות בפורמט 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: מזהה הפרויקט של הפרויקט שבו נמצאת הרשת שציינתם:
      • אם אתם משתמשים ברשת 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: מזהה הפרויקט שלכם.
  • LOCATION: המיקום שרוצים להגדיר למשימה.
  • JOB_NAME: השם שרוצים לתת למשימה.
  • HOST_PROJECT_ID: מזהה הפרויקט של הפרויקט שבו נמצאת הרשת שציינתם:
    • אם אתם משתמשים ברשת VPC משותפת, צריך לציין את הפרויקט המארח.
    • אחרת, מציינים את הפרויקט הנוכחי (PROJECT_ID).
  • NETWORK: השם של רשת שמספקת את הגישה הנדרשת למשימה הזו. הרשת צריכה להיות רשת VPC בפרויקט הנוכחי או רשת VPC משותפת שמארחת את הפרויקט הנוכחי או משותפת איתו.
  • REGION: האזור שבו נמצאים תת-הרשת והמכונות הווירטואליות של העבודה:
    • אם כוללים את השדה allowedLocations כדי לציין את המיקום המותר של המכונות הווירטואליות עבור העבודה, צריך לציין כאן את אותו אזור.
    • אחרת, האזור צריך להיות זהה למיקום שבוחרים למשרה (LOCATION).
  • SUBNET: השם של תת-רשת שמהווה חלק מרשת ה-VPC ונמצאת באותו אזור כמו המכונות הווירטואליות של העבודה.

יצירת משימה שחוסמת גישה חיצונית לקונטיינר אחד או יותר

חסימת גישה חיצונית לכל אחד מהמאגדים של משימה כשיוצרים את המשימה.

אתם יכולים לחסום גישה חיצונית לכל אחד מהקונטיינרים של המשימה באמצעות ה-CLI של gcloud או Batch API.

gcloud

כדי ליצור ג'וב שחוסם גישה חיצונית לקונטיינר אחד או יותר באמצעות ה-CLI של gcloud, צריך לבצע את השלבים הבאים:

  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"
  }
}

מחליפים את מה שכתוב בשדות הבאים:

המאמרים הבאים