פתרון בעיות ב-Cloud Run באמצעות SSH

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

‫SSH for Cloud Run מוסיף אוטומטית את קובצי ה-sshd הנדרשים למערכת הקבצים של הקונטיינר. הקבצים הבינאריים האלה נגישים רק למשך סשן ה-SSH, והם מוסרים בסיום הסשן. המערכת מתעלמת מהגדרות SSH קיימות, כולל רשומות /etc/passwd, לטובת הגדרות שמנוהלות על ידי Google.

הודעות זכויות יוצרים של קוד פתוח מצד שלישי עבור תלות SSH שמנוהלות על ידי Google מועלות בתוך הקונטיינר כשמתבצעת הפעלה של SSH בנתיב הבא: /usr/share/licenses/google_ssh/THIRD_PARTY_NOTICES.

מגבלות

ההגבלות הבאות חלות על SSH:

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

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

  1. נכנסים לחשבון Google Cloud . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. מפעילים את Cloud Run Admin API,‏ Cloud Resource Manager API,‏ Identity-Aware Proxy API ו-Cloud OS Login API:
      gcloud services enable run.googleapis.com \
          iap.googleapis.com \
          oslogin.googleapis.com
      
  7. מתקינים ומפעילים את ה-CLI של gcloud.
  8. מעדכנים את הרכיבים:
    gcloud components update
  9. Windows: מוודאים שמותקן לקוח OpenSSH.

    בדרך כלל לקוח OpenSSH מותקן כברירת מחדל ב-Windows 10 ובגרסאות חדשות יותר. אם הוא לא מותקן, אפשר להתקין אותו על ידי הפעלת הפקודה הבאה ב-PowerShell כאדמין:

    Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

    מידע נוסף זמין במאמר בנושא התקנת OpenSSH.

  10. מעיינים בדף המחירון של Cloud Run. כדי ליצור הערכת עלויות בהתאם לשימוש החזוי, אתם יכולים להיעזר במחשבון התמחור. חיוב על SSH לפי בייטים של תעבורת נתונים יוצאת (egress) ברשת.
  11. אם בפרויקט שלכם נעשה שימוש ב-VPC Service Controls‏ (VPC-SC), חשוב לדעת שתהליך המנהור בודק את iaptunnel.googleapis.com כשם השירות, ולא את run.googleapis.com.

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

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

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

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

אם אתם לא חברים בארגון שהפרויקט שייך אליו, Cloud Run חוסם את גישת ה-SSH. כדי לקבל גישת SSH, צריך להוסיף את התפקיד roles/compute.osLoginExternalUser או להשתמש בתפקיד מותאם אישית עם ההרשאה compute.oslogin.updateExternalUser.

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

לשירות ספציפי

gcloud beta iap tcp add-iam-policy-binding \
    --resource-type=cloud-run \
    --service=SERVICE \
    --region=REGION \
    --member=MEMBER \
    --role=roles/iap.tunnelResourceAccessor

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

  • ‫SERVICE: השם של השירות.
  • ‫REGION: האזור שבו השירות שלכם נפרס.
  • ‫MEMBER: הזהות שרוצים להעניק לה גישה.

למופע ספציפי

gcloud beta iap tcp add-iam-policy-binding \
    --resource-type=cloud-run \
    --instance=INSTANCE \
    --region=REGION \
    --member=MEMBER \
    --role=roles/iap.tunnelResourceAccessor

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

  • ‫INSTANCE: השם של המכונה.
  • ‫REGION: האזור שבו השירות שלכם נפרס.
  • ‫MEMBER: הזהות שרוצים להעניק לה גישה.

במאמר הגדרת מדיניות גישה ל-IAP מוסבר איך להעניק את ההרשאה roles/iap.tunnelResourceAccessor ברמת הפרויקט והאזור.

שימוש ב-SSH עם שירותי Cloud Run

מגדירים גישת SSH ברמת השירות ומתחברים לשירות באמצעות SSH.

הגדרת גישת SSH ברמת השירות

אפשר לאפשר גישת בדיקה לשירות ספציפי באמצעות ה-CLI של gcloud או YAML:

gcloud

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

gcloud beta run services update SERVICE --ssh

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

YAML

  1. אם אתם יוצרים שירות חדש, דלגו על השלב הזה. אם אתם מעדכנים שירות קיים, מורידים את הגדרות ה-YAML שלו:

    gcloud run services describe SERVICE --format export > service.yaml
  2. בדוגמה הבאה מופיעה הגדרת ה-YAML:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "true"
        run.googleapis.com/launch-stage: BETA
    spec:
      template:
        spec:
          containers:
            image: IMAGE_URL
    

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

    • ‫SERVICE: השם של שירות Cloud Run.
    • ‫REGION: האזור Google Cloud , לדוגמה, us-central1.
    • ‫IMAGE_URL: הפניה לקובץ אימג' בקונטיינר, לדוגמה, us-docker.pkg.dev/cloudrun/container/hello:latest. אם אתם משתמשים ב-Artifact Registry, צריך ליצור מראש את המאגר REPO_NAME. כתובת ה-URL היא בפורמט LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  3. יוצרים או מעדכנים את השירות באמצעות הפקודה הבאה:

    gcloud run services replace service.yaml

    אם קיים קובץ service.yaml, הפקודה gcloud run services replace משתמשת בו כברירת מחדל.

אפשר להשבית את הגישה ל-SSH לפי שירות באמצעות ה-CLI של gcloud או YAML:

gcloud

כדי להשבית את הגישה לשירות, משתמשים בפקודה הבאה:

gcloud beta run services update SERVICE --no-ssh

YAML

  1. אם אתם יוצרים שירות חדש, דלגו על השלב הזה. אם אתם מעדכנים שירות קיים, מורידים את הגדרות ה-YAML שלו:

    gcloud run services describe SERVICE --format export > service.yaml
  2. בדוגמה הבאה מופיעה הגדרת ה-YAML:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "false"
        run.googleapis.com/launch-stage: BETA
    spec:
      template:
        spec:
          containers:
            image: IMAGE_URL
    

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

    • ‫SERVICE: השם של שירות Cloud Run.
    • ‫REGION: האזור Google Cloud , לדוגמה, us-central1.
    • ‫IMAGE_URL: הפניה לקובץ אימג' בקונטיינר, לדוגמה, us-docker.pkg.dev/cloudrun/container/hello:latest. אם אתם משתמשים ב-Artifact Registry, צריך ליצור מראש את המאגר REPO_NAME. כתובת ה-URL היא בפורמט LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  3. יוצרים או מעדכנים את השירות באמצעות הפקודה הבאה:

    gcloud run services replace service.yaml

    אם קיים קובץ service.yaml, הפקודה gcloud run services replace משתמשת בו כברירת מחדל.

התחברות לשירות באמצעות SSH

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

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

  gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID

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

  • ‫SERVICE: השם של השירות.
  • ‫REGION: האזור שבו השירות שלכם נפרס.
  • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud .

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

    אם סיימתם את סשן ה-SSH בהצלחה, תוצג ב-Cloud Run ההודעה הבאה:

    Project: my-project
    Region: REGION
    Service: busybox
    Revision: busybox-REVISION
    Instance:
    INSTANCE-ID
    Container: busybox-1
    Image: IMAGE
    

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

ציון מופע שירות

כדי להתחבר למופע שירות ספציפי באמצעות SSH, משתמשים ב-Google Cloud CLI.

כדי להתחבר למופע של שירות Cloud Run באמצעות SSH, משתמשים בפקודה הבאה של Google Cloud CLI:

  gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID --instance=INSTANCE_ID

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

  • ‫SERVICE: השם של השירות.
  • ‫REGION: האזור שבו השירות שלכם נפרס.
  • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
  • ‫INSTANCE_ID: מזהה המכונה. כדי למצוא את מזהה מופע השירות, עוברים לדף Logs בקטע Observability. מזהה המכונה מופיע בשדה labels של רשומה ביומן. לא ניתן למצוא את מזהה המופע אם מסיימים את המופע הספציפי לפני שמתחברים אליו.

ציון שינוי

כדי להתחבר לגרסה ספציפית באמצעות SSH, משתמשים ב-Google Cloud CLI.

כדי להתחבר לגרסה של שירות Cloud Run באמצעות SSH, משתמשים בפקודה הבאה של Google Cloud CLI:

  gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID --revision=REVISION

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

  • ‫SERVICE: השם של השירות.
  • ‫REGION: האזור שבו השירות שלכם נפרס.
  • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
  • ‫REVISION: השם של הגרסה.

שימוש ב-SSH עם מכונות Cloud Run

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

הגדרת גישת SSH ברמת המכונה

ה-SSH מופעל כברירת מחדל במופעים.

אפשר להשבית את הגישה באמצעות SSH לכל מכונה וירטואלית בנפרד באמצעות ה-CLI של gcloud או YAML:

gcloud

כדי להשבית את הגישה למופע, משתמשים בפקודה הבאה:

gcloud beta run instances update INSTANCE --no-ssh

YAML

  1. אם אתם יוצרים מופע חדש, דלגו על השלב הזה. אם אתם מעדכנים מופע קיים, אתם צריכים להוריד את הגדרת ה-YAML שלו:

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. בדוגמה הבאה מופיעה הגדרת ה-YAML:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "false"
        run.googleapis.com/launch-stage: BETA
    spec:
      containers:
        image: IMAGE_URL
    

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

    • ‫INSTANCE: השם של מופע Cloud Run.
    • ‫REGION: האזור Google Cloud , לדוגמה, us-central1.
    • ‫IMAGE_URL: הפניה לקובץ האימג' של הקונטיינר, למשל us-docker.pkg.dev/cloudrun/container/hello:latest.
  3. יוצרים או מעדכנים את המכונה באמצעות הפקודה הבאה:

    gcloud beta run instances replace instance.yaml

אפשר לאפשר גישת בדיקה במופע ספציפי באמצעות ה-CLI של gcloud או YAML.

gcloud

כדי להפעיל גישה במכונה קיימת, משתמשים בפקודה הבאה:

gcloud beta run instances update INSTANCE --ssh

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

YAML

  1. אם אתם יוצרים מופע חדש, דלגו על השלב הזה. אם אתם מעדכנים מופע קיים, אתם צריכים להוריד את הגדרת ה-YAML שלו:

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. בדוגמה הבאה מופיעה הגדרת ה-YAML:

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "true"
        run.googleapis.com/launch-stage: BETA
    spec:
      containers:
        image: IMAGE_URL
    

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

    • ‫INSTANCE: השם של מופע Cloud Run.
    • ‫REGION: האזור Google Cloud , לדוגמה, us-central1.
    • ‫IMAGE_URL: הפניה לקובץ האימג' של הקונטיינר, למשל us-docker.pkg.dev/cloudrun/container/hello:latest.
  3. יוצרים או מעדכנים את המכונה באמצעות הפקודה הבאה:

    gcloud beta run instances replace instance.yaml

התחברות למכונה באמצעות SSH

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

  gcloud beta run instances ssh INSTANCE --region=REGION --project=PROJECT_ID

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

  • ‫INSTANCE: השם של המכונה.
  • ‫REGION: האזור שבו השירות שלכם נפרס.
  • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud .

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

אם סיימתם את סשן ה-SSH בהצלחה, תוצג ב-Cloud Run ההודעה הבאה:

  Project: my-project
  Region: REGION
  Instance: INSTANCE
  Revision: REVISION
  Container: CONTAINER
  Image: IMAGE

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

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

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

  1. מריצים את הפקודה gcloud beta run services ssh בשירות היעד.
  2. מתחילים את מנהרת ה-SSH ויוצרים את האישור.
  3. מוסיפים את השורות הבאות להגדרות ה-SSH:

    Host cloud-run-ssh
        HostName cloud-run-default
        User root
        IdentityFile /Users/USER/.ssh/google_compute_engine
        CertificateFile /Users/USER/.ssh/google_compute_engine_cert/PROJECT_ID_REGION_SERVICE-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 /Users/USER/google-cloud-sdk/lib/gcloud.py alpha run start-iap-tunnel --project_number=PROJECT_NUMBER --project_id=PROJECT_ID --workload_type=service --deployment_name=SERVICE --region=REGION
    

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

    • ‫USER: שם המשתמש במחשב המקומי.
    • ‫PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
    • ‫PROJECT_NUMBER: מספר הפרויקט ב- Google Cloud .
    • ‫REGION: האזור שבו השירות שלכם נפרס.
    • ‫SERVICE: השם של השירות.

    אם ה-CLI של gcloud מותקן בתיקייה אחרת, יכול להיות שתצטרכו לעדכן את המיקום בשורה האחרונה.

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

    ssh cloud-run-ssh
    

התוקף של אישור ה-SSH יפוג אחרי חמש דקות. אם תנסו ליצור חיבור SSH עם השירות אחרי חמש דקות, תצטרכו להריץ מחדש את הפקודה gcloud beta run services ssh כדי ליצור מחדש את האישור.

יומני גישה ל-SSH

כדי לתעד יומני ביקורת לניהול מפתחות SSH, צריך להפעיל יומני ביקורת ל-Cloud OS Login API. איך צופים ביומני ביקורת של OS Login כדי לגשת ליומני SSH של משאבי Cloud Run, צריכה להיות לכם גישה ליומני הביקורת ב-Cloud של הפרויקט הזה.

בדוגמה הבאה מוצגת שאילתה לחיפוש בכל שירותי Cloud Run מהיום הקודם:

gcloud logging read '
  logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access" AND
  protoPayload.serviceName="oslogin.googleapis.com" AND
  protoPayload.request.instance:"run.googleapis.com"
' --project=PROJECT_ID \
  --freshness=1d \
  --format="table(timestamp, protoPayload.authenticationInfo.principalSubject:label=USER, protoPayload.request.instance:label=CLOUD_RUN_SERVICE)"

אבטחה ושליטה בגישת SSH

אתם יכולים לקבוע מי יכול להשתמש ב-SSH ואיך הוא מוגבל בסביבה שלכם.

השבתת גישת SSH באמצעות מדיניות ארגונית

כדי להגדיר מדיניות ארגון להשבתת SSH, משתמשים באילוץ מותאם אישית שמגביל את ההפעלה של גישת ניפוי באגים באמצעות SSH בשירותי Cloud Run.

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