הגבלת מפתחות SSH ממכונות וירטואליות

במסמך הזה מוסבר איך למנוע ממשתמשים לגשת למכונות וירטואליות (VM) על ידי הסרה וחסימה של מפתחות SSH מהמכונות הווירטואליות.

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

  • אם עדיין לא עשיתם את זה, תצטרכו להגדיר אימות. אימות הוא תהליך שבו מאמתים את הזהות שלכם כדי לקבל גישה לממשקי API ולשירותים של Google Cloud . כדי להריץ קוד או דוגמאות מסביבת פיתוח מקומית, אפשר לבצע אימות ל-Compute Engine באחת מהדרכים האלה:

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

    המסוף

    כשמשתמשים במסוף Google Cloud כדי לגשת לשירותים Google Cloud ולממשקי ה-API, לא צריך להגדיר אימות.

    gcloud

    1. התקינו את ה-CLI של Google Cloud. אחר כך, מאתחלים את ה-CLI של Google Cloud באמצעות הפקודה הבאה:

      gcloud init

      אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  • הגדרת אזור ותחום כברירת מחדל.
  • REST

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

      התקינו את ה-CLI של Google Cloud.

      אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

    מידע נוסף מופיע במאמר אימות לשימוש ב-REST במסמכי האימות של Google Cloud .

הסרת מפתחות SSH

אפשר להסיר מפתחות SSH ממכונות וירטואליות שמשתמשות ב-OS Login ומממכונות וירטואליות שמשתמשות במפתחות SSH שמבוססים על מטא-נתונים.

הסרת מפתחות SSH ממכונות וירטואליות שמשתמשות ב-OS Login

במכונות וירטואליות שמשתמשות ב-OS Login, אפשר להשתמש במפתחות SSH שמשויכים לחשבון Google. אפשר להסיר מפתח SSH ציבורי מחשבון המשתמש באמצעות Google Cloud CLI או OS Login API. אם אתם אדמינים בארגון, אתם יכולים להסיר מפתחות SSH מחשבונות משתמשים באמצעות Directory API. מערכת Compute Engine מסירה באופן אוטומטי מחשבון Google מפתחות שתוקפם פג.

gcloud

כדי להסיר מפתח SSH ציבורי מהחשבון:

  1. אם אתם לא יודעים איזה מפתח אתם רוצים להסיר, הריצו את הפקודה gcloud compute os-login describe-profile כדי לראות את כל המפתחות שמשויכים לחשבון שלכם:

    gcloud compute os-login describe-profile
    
  2. מעתיקים את הערך fingerprint של המפתח שרוצים למחוק.

  3. מסירים את המפתח מהחשבון באמצעות הפקודה gcloud compute os-login ssh-keys remove:

    gcloud compute os-login ssh-keys remove --key=KEY
    

    מחליפים את הערך KEY במפתח ה-SSH הציבורי שרוצים להסיר, או בטביעת האצבע של OS Login של המפתח שרוצים להסיר.

REST

כדי להסיר מפתח SSH ציבורי מהחשבון:

  1. אם אתם לא יודעים איזה מפתח אתם רוצים להסיר, אתם יכולים להשתמש ב-method users.getLoginProfile כדי לראות את כל המפתחות שמשויכים לחשבון:

    GET https://oslogin.googleapis.com/v1/users/ACCOUNT_EMAIL/loginProfile
    

    מחליפים את ACCOUNT_EMAIL בכתובת האימייל שמשויכת לחשבון.

  2. מעתיקים את הערך fingerprint של המפתח שרוצים למחוק.

  3. מסירים את המפתח מהחשבון באמצעות ה-method‏ users.sshPublicKeys.delete:

    DELETE https://oslogin.googleapis.com/v1/users/ACCOUNT_EMAIL/sshPublicKeys/FINGERPRINT
    

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

    • ‫ACCOUNT_EMAIL: כתובת האימייל שמשויכת לחשבון שלכם
    • ‫FINGERPRINT: טביעת האצבע מסוג SHA-256 של המפתח שרוצים להסיר

הסרת מפתחות SSH ממכונות וירטואליות שמשתמשות במפתחות שמבוססים על מטא-נתונים

אפשר להסיר מפתח SSH ציבורי ממטא-נתונים של פרויקט או של מכונה באמצעות מסוףGoogle Cloud , ה-CLI של gcloud או Compute Engine API.

אחרי שמסירים את המפתח האחרון ממטא-נתונים של משתמש מסוים, או כשפג התוקף של המפתח האחרון במטא-נתונים של משתמש מסוים, מערכת Compute Engine מוחקת ב-VM את הקובץ ~/.ssh/authorized_keys של המשתמש.

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

הסרת מפתח ציבורי ממטא-נתונים של פרויקט

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

כשמסירים מפתח ממטא-נתונים באמצעות ה-CLI של gcloud ו-Compute Engine API, צריך לאחזר את רשימת המפתחות הקיימים, לערוך את רשימת המפתחות כדי להסיר את המפתחות הלא רצויים, ולהחליף את המפתחות הישנים ברשימת המפתחות שרוצים לשמור, כמו שמוסבר בקטע הבא.

המסוף

כדי להסיר מפתח SSH ציבורי ממטא-נתוני הפרויקט באמצעות מסוףGoogle Cloud , מבצעים את השלבים הבאים:

  1. נכנסים לדף Metadata במסוף Google Cloud .

    מעבר אל Metadata

  2. לוחצים על הכרטיסייה מפתחות SSH.

  3. לוחצים על עריכה בחלק העליון של הדף.

  4. עוברים אל מפתח ה-SSH שרוצים להסיר ולוחצים על לחצן המחיקה לצד מפתח ה-SSH.

    חוזרים על השלב הזה לכל מפתח SSH שרוצים להסיר.

  5. לוחצים על Save.

gcloud

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

  1. מריצים את הפקודה gcloud compute project-info describe כדי לקבל את המטא-נתונים של הפרויקט:

    gcloud compute project-info describe
    

    הפלט אמור להיראות כך:

    ...
    metadata:
      ...
      - key: ssh-keys
        value: |-
          cloudysanfrancisco:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF
          baklavainthebalkans:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQDx3FNVC8 google-ssh {"userName":"baklavainthebalkans","expireOn":"2021-06-14T16:59:03+0000"}
    ...
    
  2. מעתיקים את ערך המטא-נתונים ssh-keys.

  3. יוצרים ופותחים קובץ טקסט חדש בתחנת העבודה.

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

  5. שומרים את הקובץ וסוגרים אותו.

  6. מריצים את הפקודה gcloud compute project-info add-metadata כדי להגדיר את הערך ssh-keys ברמת הפרויקט:

    gcloud compute project-info add-metadata --metadata-from-file=ssh-keys=KEY_FILE
    

    מחליפים את KEY_FILE באחד מהערכים הבאים:

    • הנתיב לקובץ שיצרתם בשלב הקודם, אם בפרויקט היו מפתחות SSH קיימים
    • הנתיב לקובץ של מפתח ה-SSH הציבורי החדש, אם בפרויקט לא היו מפתחות SSH קיימים

REST

כדי להסיר מפתח SSH ציבורי ממטא-נתונים של פרויקט באמצעות Compute Engine API:

  1. משתמשים בשיטה projects.get כדי לקבל את הערכים fingerprint ו-ssh-keys ממטא-נתונים.

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID
    

    מחליפים את PROJECT_ID במזהה הפרויקט.

    התגובה אמורה להיראות כך:

    ...
    "fingerprint": "utgYE_XWtE8=",
    "items": [
     {
      "key": "ssh-keys",
      "value": "cloudysanfrancisco:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF\nbaklavainthebalkans:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQDx3FNVC8 google-ssh {"userName":"baklavainthebalkans","expireOn":"2021-06-14T16:59:03+0000"}"
     }
    ]
    ...
    
  2. מעתיקים את רשימת הערכים של מפתחות ה-SSH ומוחקים את המפתחות שרוצים להסיר.

  3. משתמשים ב-projects.setCommonInstanceMetadata כדי להסיר את מפתחות ה-SSH.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/setCommonInstanceMetadata
    
    {
    "items": [
     {
      "key": "ssh-keys",
      "value": "EXISTING_SSH_KEYS"
     }
    ]
    "fingerprint": "FINGERPRINT"
    }
    

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

    • ‫PROJECT_ID: מזהה הפרויקט
    • ‫EXISTING_SSH_KEYS: רשימת מפתחות ה-SSH שרוצים לשמור
    • ‫FINGERPRINT: הערך של fingerprint מהתגובה לבקשה projects.get

הסרת מפתח SSH ציבורי ממטא-נתונים של מכונה

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

כשמסירים מפתח ממטא-נתונים באמצעות ה-CLI של gcloud ו-Compute Engine API, צריך לאחזר את רשימת המפתחות הקיימים, לערוך את רשימת המפתחות כדי להסיר את המפתחות הלא רצויים, ולהחליף את המפתחות הישנים ברשימת המפתחות שרוצים לשמור, כמו שמוסבר בקטע הבא.

המסוף

כדי להסיר מפתח SSH ציבורי מהמטא-נתונים של המכונה באמצעות מסוףGoogle Cloud :

  1. נכנסים לדף VM instances במסוף Google Cloud .

    כניסה לדף VM instances

  2. לוחצים על שם המכונה הווירטואלית שרוצים להסיר ממנה מפתח.

  3. לוחצים על Edit.

  4. בקטע מפתחות SSH, לוחצים על Show and edit. הקטע מתרחב ומוצגים בו כל מפתחות ה-SSH הציבוריים ברמת המכונה.

  5. לוחצים על כפתור המחיקה ליד מפתח ה-SSH שרוצים להסיר.

    חוזרים על השלב הזה לכל מפתח SSH שרוצים להסיר.

  6. לוחצים על Save.

gcloud

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

  1. מריצים את הפקודה gcloud compute instances describe כדי לקבל את המטא-נתונים של המכונה הווירטואלית:

    gcloud compute instances describe VM_NAME
    

    מחליפים את VM_NAME בשם המכונה הווירטואלית שרוצים להוסיף או להסיר ממנה מפתחות SSH ציבוריים.

    הפלט אמור להיראות כך:

    ...
    metadata:
    ...
    - key: ssh-keys
     value: |-
       cloudysanfrancisco:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF
       baklavainthebalkans:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQDx3FNVC8 google-ssh {"userName":"baklavainthebalkans","expireOn":"2021-06-14T16:59:03+0000"}
    ...
    
  2. מעתיקים את ערך המטא-נתונים ssh-keys.

  3. יוצרים ופותחים קובץ טקסט חדש בתחנת העבודה המקומית.

  4. בקובץ, מדביקים את רשימת מפתחות ה-SSH שהעתקתם, ואז מסירים את המפתחות שרוצים למחוק.

  5. שומרים את הקובץ וסוגרים אותו.

  6. מריצים את הפקודה gcloud compute project-info add-metadata כדי להגדיר את הערך של ssh-keys ברמת הפרויקט:

    gcloud compute instances add-metadata VM_NAME --metadata-from-file ssh-keys=KEY_FILE
    

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

    • ‫VM_NAME: המכונה הווירטואלית שממנה רוצים להסיר את מפתח ה-SSH
    • ‫KEY_FILE: הנתיב לקובץ שמכיל את רשימת כל מפתחות ה-SSH של הפרויקט

REST

כדי להסיר מפתח SSH ציבורי ממטא-נתונים של מופע באמצעות Compute Engine API, מבצעים את הפעולות הבאות:

  1. משתמשים ב-method‏ instances.get כדי לאחזר את הערכים fingerprint ו-ssh-keys ממטא-נתונים.

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
    

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

    • ‫PROJECT_ID: מזהה הפרויקט
    • ‫ZONE: האזור של המכונה הווירטואלית שמוסיפים לה מפתח SSH
    • ‫VM_NAME: המכונה הווירטואלית שאליה מוסיפים מפתח SSH

    התגובה אמורה להיראות כך:

    ...
    "fingerprint": "utgYE_XWtE8=",
    "items": [
    {
     "key": "ssh-keys",
     "value": "cloudysanfrancisco:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF\nbaklavainthebalkans:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQDx3FNVC8 google-ssh {"userName":"baklavainthebalkans","expireOn":"2021-06-14T16:59:03+0000"}"
    }
    ]
    ...
    
  2. מעתיקים את רשימת הערכים של מפתחות ה-SSH ומוחקים את המפתחות שרוצים להסיר.

  3. משתמשים ב-instances.setMetadata כדי להסיר את מפתחות ה-SSH.

    
    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMetadata
    
    {
    "items": [
     {
      "key": "ssh-keys",
      "value": "EXISTING_SSH_KEYS
     }
    ]
    "fingerprint": "FINGERPRINT"
    }
    

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

    • ‫PROJECT_ID: מזהה הפרויקט
    • ‫EXISTING_SSH_KEYS: הערך של מפתח ssh-keys מהתגובה לבקשת projects.get
    • ‫FINGERPRINT: הערך של fingerprint מהתגובה לבקשה instances.get

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

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

חסימת מפתחות SSH של פרויקט ממכונה וירטואלית במהלך יצירת המכונה

אתם יכולים לחסום את מפתחות ה-SSH של הפרויקט ממכונות וירטואליות במהלך יצירת המכונה הווירטואלית, באמצעות מסוףGoogle Cloud , ה-CLI של gcloud או Compute Engine API.

המסוף

כדי ליצור מכונה ולחסום אותה מקבלת מפתחות SSH ששמורים במטא-נתונים של הפרויקט באמצעות מסוף Google Cloud :

  1. נכנסים לדף Create an instance במסוף Google Cloud .

    כניסה לדף Create an instance

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

    1. בתפריט הניווט, לוחצים על אבטחה.

    2. מרחיבים את הקטע Manage access.

    3. כדי להשבית את OS Login, מבטלים את הסימון בתיבה Control VM access through IAM permissions.

    4. מסמנים את תיבת הסימון Block project-wide SSH keys (חסימת מפתחות SSH ברמת הפרויקט).

  3. אופציונלי: מציינים אפשרויות הגדרה אחרות. למידע נוסף, ראו אפשרויות הגדרה במהלך יצירת מכונה.

  4. כדי ליצור את המכונה ולהפעיל אותה, לוחצים על Create.

gcloud

כדי ליצור מכונה וירטואלית ולחסום אותה מקבלת מפתחות SSH ששמורים במטא-נתונים של הפרויקט באמצעות ה-CLI של gcloud, משתמשים בפקודה gcloud compute instances create:

gcloud compute instances create VM_NAME \
    --metadata block-project-ssh-keys=TRUE

מחליפים את VM_NAME בשם של המכונה הווירטואלית החדשה.

REST

כדי ליצור מכונה וירטואלית ולחסום אותה מקבלת מפתחות SSH שמאוחסנים במטא-נתונים של הפרויקט באמצעות Compute Engine, צריך ליצור בקשת POST ל-instances.insert method:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

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

  • ‫PROJECT_ID: מזהה הפרויקט
  • ‫ZONE: האזור של המכונה הווירטואלית

בגוף הבקשה, מציינים את שמות המשתמשים ואת מפתחות ה-SSH הציבוריים במאפיין items:

...
{
 "items": [
    {
     "key": "block-project-ssh-keys",
     "value": TRUE
    }
   ]
}
...

חסימת מפתחות SSH של פרויקט ממכונה וירטואלית אחרי יצירת המכונה הווירטואלית

אחרי שיוצרים מכונות וירטואליות, אפשר לחסום את מפתחות ה-SSH של הפרויקט במכונות הווירטואליות באמצעות מסוףGoogle Cloud , ‏ ה-CLI של gcloud או Compute Engine API.

המסוף

כדי לחסום מכונות וירטואליות מלקבל חיבורים ממפתחות SSH ששמורים במטא-נתונים של הפרויקט באמצעות מסוף Google Cloud :

  1. נכנסים לדף VM instances במסוף Google Cloud .

    כניסה לדף VM instances

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

  3. לוחצים על Edit.

  4. בקטע מפתחות SSH, מסמנים את תיבת הסימון חסימת מפתחות SSH ברמת הפרויקט.

  5. כשמסיימים לערוך את הגדרת החיבור למפתחות SSH, לוחצים על שמירה.

gcloud

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

מריצים את הפקודה gcloud compute instances add-metadata:

gcloud compute instances add-metadata VM_NAME --metadata block-project-ssh-keys=TRUE

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

REST

כדי לחסום מכונות וירטואליות מלקבל חיבורים ממפתחות SSH שמאוחסנים במטא-נתונים של הפרויקט באמצעות Compute Engine API:

  1. משתמשים ב-method‏ instances.get כדי לאתר את fingerprint במטא-נתונים.

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
    

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

    • ‫PROJECT_ID: מזהה הפרויקט
    • ‫ZONE: האזור של המכונה הווירטואלית שמוסיפים לה מפתח SSH
    • ‫VM_NAME: המכונה הווירטואלית שאליה מוסיפים מפתח SSH

    התגובה אמורה להיראות כך:

    ...
    "fingerprint": "utgYE_XWtE8="
    ...
    
  2. משתמשים ב-instances.setMetadata method כדי להגדיר את block-project-ssh-keys ל-TRUE:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMetadata
    
    {
    "items": [
     {
      "key": "block-project-ssh-keys",
      "value": TRUE
     }
    ]
    "fingerprint": "FINGERPRINT"
    }
    

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

    • ‫PROJECT_ID הוא מזהה הפרויקט
    • ‫ZONE הוא האזור שבו נמצאת המכונה
    • ‫INSTANCE_NAME היא המכונה שבה רוצים לחסום מפתחות ברמת הפרויקט.
    • ‫FINGERPRINT: הערך של fingerprint מהתגובה של בקשת instances.get.

מה השלב הבא?