שימוש ב-SSH ל-Cloud Run

בדף הזה מוסבר איך להשתמש ב-SSH כדי להתחבר לשירותי Cloud Run באמצעות העברת TCP של Identity-Aware Proxy ‏ (IAP).

אבטחת חיבורי SSH באמצעות IAP מאפשרת לכם לנפות באגים במקרים ספציפיים של מכולות בסביבה מאובטחת.

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

  1. חשוב לוודא ששירות Cloud Run פועל בסביבת הפעלה מהדור השני וכולל את כל כלי הניפוי באגים שצריך כדי להריץ פקודות אחרי ההתחברות. מידע נוסף זמין במאמר בנושא סביבות הפעלה.
  2. כדי לוודא שאתם משתמשים בגרסה העדכנית ביותר של Google Cloud CLI, מריצים את הפקודה הבאה:

    gcloud components update
    
  3. מפעילים בפרויקט את Cloud Run,‏ Cloud Resource Manager API,‏ Cloud OS Login API ו-Identity-Aware Proxy APIs.

    כדי להפעיל את ממשקי ה-API, מריצים את הפקודה הבאה:

    gcloud services enable \
        cloudresourcemanager.googleapis.com \
        oslogin.googleapis.com \
        iap.googleapis.com \
        run.googleapis.com
    

התפקידים הנדרשים

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

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

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

מגבלות

ל-SSH ל-Cloud Run יש את המגבלות הבאות:

  • יש תמיכה רק בשירותים ובמופעים של Cloud Run.
  • בשירותים, יש תמיכה רק בסביבת ההפעלה מהדור השני.
  • אין תמיכה במשימות של Cloud Run.
  • אין תמיכה במאגרי עובדים.
  • כשמשתמשים ב-SSH, מפתחות המארח בתמונה נמחקים. המפתחות יישארו דרוסים גם אחרי שהסשן של SSH יסתיים, עד להפעלה מחדש של השירות.
  • ‫Windows: אין תמיכה ב-PuTTY. משתמשים בלקוח OpenSSH.

הגדרת מדיניות הרשאות גישה ב-IAP

אפשר לנהל את הגישה למשאבי Cloud Run ברמת הפרויקט, האזור או השירות באמצעות ה-CLI של gcloud או API בארכיטקטורת REST של IAP.

אפשר להגדיר כללי מדיניות למזהי Cloud Identity API הבאים:

  • ‫Cloud Identity: לדוגמה, user:EMAIL@example.com
  • איחוד שירותי אימות הזהות של כוח עבודה: לדוגמה: principal://iam.googleapis.com/locations/global/workforcePools/ <var>POOL_ID</var>/subject/<var>SUBJECT_ATTRIBUTE_VALUE</var>

מידע נוסף ודוגמאות לסוגי חשבונות משתמשים מופיעים ברשימת מזהי חשבונות משתמשים.

עדכון שירות Cloud Run קיים

כדי לעדכן את השירות ולהפעיל SSH, מריצים את הפקודה הבאה:

gcloud beta run services update \
    SERVICE_NAME \
    --ssh

מחליפים את SERVICE_NAME בשם של שירות Cloud Run. אפשר לפרוס שירות Cloud Run על ידי הוספת --ssh אל gcloud beta run deploy.

איך נותנים גישה לכל המשאבים של Cloud Run בפרויקט

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

gcloud

מריצים את הפקודה הבאה:

gcloud beta iap tcp add-iam-policy-binding \
    --member='USER' \
    --role='roles/iap.tunnelResourceAccessor' \
    --resource-type=cloud-run

מחליפים את USER במזהה החשבון הראשי של המשתמש, לדוגמה, user:user@example.com או החשבון הראשי של איחוד הזהויות של כוח העבודה.

‫API בארכיטקטורת REST

שליחת בקשת POST לנקודת הקצה של מדיניות הפרויקט:

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d '{
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["USER"]
          }
        ]
      }
    }' \
    "https://iap.googleapis.com/v1/projects/\
PROJECT_NUMBER/iap_tunnel/cloudRun:setIamPolicy"

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

  • ‫USER: מזהה חשבון המשתמש של המשתמש.
  • ‫PROJECT_NUMBER: מספר הפרויקט Google Cloudשבו מתארחים המשאבים.

מתן גישה לכל משאבי Cloud Run במיקום ספציפי

כדי להגביל את הגישה לכל המשאבים באזור מסוים (לדוגמה, us-central1), צריך להחיל את הקישור של מדיניות ההרשאות ברמת המיקום.

gcloud

מריצים את הפקודה הבאה:

gcloud beta iap tcp add-iam-policy-binding \
    --member='USER' \
    --role='roles/iap.tunnelResourceAccessor' \
    --resource-type=cloud-run \
    --region=LOCATION

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

  • ‫USER: מזהה חשבון המשתמש של המשתמש.
  • ‫LOCATION: Google Cloud האזור שבו המשאבים נפרסים (לדוגמה, us-central1).

‫API בארכיטקטורת REST

שליחת בקשת POST לנקודת הקצה של מדיניות המיקום:

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d '{
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["USER"]
          }
        ]
      }
    }' \
    "https://iap.googleapis.com/v1/projects/\
PROJECT_NUMBER/iap_tunnel/cloudRun/locations/\
LOCATION:setIamPolicy"

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

  • ‫USER: מזהה חשבון המשתמש של המשתמש
  • ‫PROJECT_NUMBER: מספר הפרויקט Google Cloud
  • ‫LOCATION: האזור Google Cloud

הענקת גישה לשירות ספציפי של Cloud Run

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

gcloud

מריצים את הפקודה הבאה:

gcloud beta iap tcp add-iam-policy-binding \
    --member='USER' \
    --role='roles/iap.tunnelResourceAccessor' \
    --resource-type=cloud-run \
    --service=SERVICE_NAME \
    --region=LOCATION

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

  • ‫USER: מזהה חשבון המשתמש של המשתמש
  • SERVICE_NAME: השם של הלוגיקה של השירות שאליו רוצים להתחבר
  • ‫LOCATION: האזור Google Cloud שבו השירות נפרס

‫API בארכיטקטורת REST

שליחת בקשת POST לנקודת הקצה של מדיניות השירות:

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d '{
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["USER"]
          }
        ]
      }
    }' \
    "https://iap.googleapis.com/v1/projects/\
    PROJECT_NUMBER/iap_tunnel/cloudRun/locations/\
    LOCATION/services/\
    SERVICE_NAME:setIamPolicy"

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

  • ‫USER: מזהה חשבון המשתמש של המשתמש
  • ‫PROJECT_NUMBER: מספר Google Cloud הפרויקט
  • ‫LOCATION: האזור Google Cloud
  • SERVICE_NAME: שם השירות

התחברות באמצעות SSH

כדי ליצור מנהרת SSH למשאב Cloud Run, צריך להשתמש ב-CLI של gcloud.

התחברות לשירות

מריצים את הפקודה הבאה:

gcloud beta run services ssh SERVICE_NAME \
    --region=LOCATION \
    --project=PROJECT_ID

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

  • SERVICE_NAME: השם של השירות שאליו רוצים להתחבר
  • ‫LOCATION: Google Cloud האזור שבו נמצא השירות
  • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud

יציאה מהסשן

כדי לסיים את סשן ה-SSH, מקלידים exit.

כל השינויים שתבצעו בקונטיינר יישארו בתוקף רק כל עוד הקונטיינר פעיל. יציאה מהסשן לא מפסיקה או מפעילה מחדש את הקונטיינר באופן אוטומטי.

שימוש בלקוח OpenSSH מקומי

כדי להשתמש בלקוח OpenSSH מקומי לחיבורים:

  1. כדי ליצור את מנהרת ה-SSH וליצור את האישור הנדרש, מריצים את הפקודה הבאה:

    gcloud beta run services ssh SERVICE_NAME \
        --region=LOCATION \
        --project=PROJECT_ID
    

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

    • SERVICE_NAME: שם השירות
    • ‫LOCATION: האזור Google Cloud
    • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud
  2. מוסיפים את קוד ההגדרה הבא לקובץ ~/.ssh/config המקומי:

    Host cloud-run-ssh
        HostName cloud-run-default
        User root
        IdentityFile ~/.ssh/google_compute_engine
        CertificateFile ~/.ssh/google_compute_engine_cert/PROJECT_ID_LOCATION_SERVICE_NAME-cert.pub
        CheckHostIP no
        HashKnownHosts no
        HostKeyAlias cloud-run-default
        IdentitiesOnly yes
        StrictHostKeyChecking no
        UserKnownHostsFile /dev/null
        ProxyUseFdpass no
        ProxyCommand /usr/local/bin/python3 -S ~/google-cloud-sdk/lib/gcloud.py beta run start-iap-tunnel --project_number=PROJECT_NUMBER --project_id=PROJECT_ID --workload_type=service --deployment_name=SERVICE_NAME --region=LOCATION
    

    אם נתיב ההתקנה של gcloud שונה, צריך לעדכן את הקידומת בנתיב ProxyCommand.

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

    • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud
    • ‫LOCATION: האזור Google Cloud
    • SERVICE_NAME: שם השירות
    • ‫PROJECT_NUMBER: מספר הפרויקט ב- Google Cloud
  3. מתחברים לשירות באמצעות OpenSSH:

    ssh cloud-run-ssh