גישה מרחוק לאשכול GKE עם מישור הבקרה שחשוף רק בנקודת הקצה הפנימית באמצעות מארח Bastion

במדריך הזה נסביר איך לגשת לאשכול GKE שהוגדר כך שרמת הבקרה שלו חשופה רק בנקודת הקצה הפנימית ב-Google Kubernetes Engine ‏ (GKE) דרך האינטרנט באמצעות מארח Bastion.

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

במדריך הזה מוסבר איך להגדיר מארח bastion, שהוא מכונת מארח למטרה מיוחדת שנועדה לעמוד בפני מתקפות. מארח ה-bastion משתמש ב-Tinyproxy כדי להעביר את תעבורת הלקוח לאשכול. אתם משתמשים בשרת proxy לאימות זהויות (IAP) כדי לגשת בצורה מאובטחת למארח הבסטיון מהלקוח המרוחק.

מטרות

  • יוצרים אשכול GKE עם מישור בקרה שחשוף רק בנקודת הקצה הפנימית.
  • פריסת מכונה וירטואלית (VM) של Compute Engine שתפעל כמארח Bastion ברשת המשנה של האשכול.
  • משתמשים ב-IAP כדי לחבר לקוח מרוחק לאשכול דרך האינטרנט.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

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

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

  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. Enable the GKE, Compute Engine, Identity-Aware Proxy APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

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

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

  7. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  8. אחרי שתאתחלו את ה-CLI של gcloud, עדכנו אותו והתקינו את הרכיבים הנדרשים:

    gcloud components update
    gcloud components install alpha beta
  9. 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

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

  11. Enable the GKE, Compute Engine, Identity-Aware Proxy APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

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

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

  14. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  15. אחרי שתאתחלו את ה-CLI של gcloud, עדכנו אותו והתקינו את הרכיבים הנדרשים:

    gcloud components update
    gcloud components install alpha beta

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

יוצרים אשכול GKE חדש עם מישור בקרה שחשוף רק בנקודת הקצה הפנימית. ממקמים את האשכול ברשת משנה משלו. אפשר לעשות את זה באמצעות Google Cloud CLI או מסוף Google Cloud .

gcloud

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

gcloud container clusters create-auto CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --create-subnetwork=name=SUBNET_NAME \
    --enable-master-authorized-networks \
    --enable-private-nodes \
    --enable-private-endpoint

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

  • CLUSTER_NAME: השם של האשכול החדש.
  • CONTROL_PLANE_LOCATION: האזור של Compute Engine במישור הבקרה של האשכול.
  • SUBNET_NAME: השם של רשת המשנה החדשה שבה רוצים למקם את האשכול.

המסוף

יצירת רשת משנה של ענן וירטואלי פרטי (VPC)

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

    מעבר לרשתות VPC

  2. לוחצים על רשת ברירת המחדל.

  3. בקטע Subnets (רשתות משנה), לוחצים על Add subnet (הוספת רשת משנה).

  4. בתיבת הדו-שיח Add a subnet (הוספת רשת משנה), מציינים את הפרטים הבאים:

    1. שם: שם לתת-הרשת החדשה.
    2. אזור: אזור לתת-הרשת. האזור הזה צריך להיות זהה לאזור של האשכול.
    3. טווח כתובות IP: מציינים את 10.2.204.0/22 או טווח אחר שלא מתנגש עם טווחים אחרים ברשת ה-VPC.
    4. בשדה Private Google Access, בוחרים באפשרות On.
  5. לוחצים על הוספה.

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

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

    מעבר אל Google Kubernetes Engine

  2. לוחצים על יצירה.

  3. לוחצים על Configure (הגדרה) ליד GKE Autopilot.

  4. מציינים שם ואזור לאשכול החדש. האזור צריך להיות זהה לזה של רשת המשנה.

  5. בקטע Networking, בוחרים באפשרות Private cluster.

  6. מבטלים את הסימון של התיבה מישור בקרת הגישה באמצעות כתובת ה-IP החיצונית שלו.

  7. מהרשימה הנפתחת Node subnet, בוחרים את רשת המשנה שיצרתם.

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

  9. לוחצים על יצירה.

אפשר גם להשתמש באשכול GKE רגיל עם הדגל --master-ipv4-cidr.

יצירת מכונה וירטואלית של יעד מבוצר (bastion host)

יוצרים מכונה וירטואלית ב-Compute Engine ברשת הפנימית של האשכול הפרטי, שתשמש כמארח יעד מבוצר (bastion host) לניהול האשכול.

gcloud

יצירת מכונה וירטואלית ב-Compute Engine:

gcloud compute instances create INSTANCE_NAME \
    --zone=COMPUTE_ZONE \
    --machine-type=e2-micro \
    --network-interface=no-address,network-tier=PREMIUM,subnet=SUBNET_NAME

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

  • INSTANCE_NAME: שם ה-VM.
  • COMPUTE_ZONE: האזור ב-Compute Engine שבו נמצאת המכונה הווירטואלית. צריך למקם את ה-VM באותו אזור שבו נמצא האשכול.
  • SUBNET_NAME: רשת המשנה שבה רוצים למקם את המכונה הווירטואלית.

המסוף

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

    כניסה לדף VM instances

  2. לוחצים על Create instance.

  3. מציינים את הפרטים הבאים:

    1. שם: השם של המכונה הווירטואלית.
    2. Region ו-Zone: האזור והתחום של מכונת ה-VM. צריך להשתמש באותו אזור כמו באשכול.
    3. Machine type (סוג מכונה): סוג מכונה. בוחרים סוג מכונה קטן, כמו e2-micro.
    4. בקטע ממשקי רשת, בוחרים את אותה רשת VPC ואת אותה רשת משנה כמו האשכול.
    5. אופציונלי: מגדירים הגדרות אחרות למופע.
  4. לוחצים על יצירה.

יצירת כלל לחומת האש

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

פריסת שרת ה-Proxy

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

  1. מתחילים סשן במכונה הווירטואלית:

    gcloud compute ssh INSTANCE_NAME --tunnel-through-iap --project=PROJECT_ID
    
  2. מתקינים את Tinyproxy:

    sudo apt install tinyproxy
    
  3. פותחים את קובץ ההגדרות של Tinyproxy:

    sudo vi /etc/tinyproxy/tinyproxy.conf
    
  4. מבצעים את הפעולות הבאות בקובץ:

    1. מוודאים שהיציאה היא 8888.
    2. מחפשים את הקטע Allow:

        /Allow 127
      
    3. מוסיפים את השורה הבאה לקטע Allow:

        Allow localhost
      
  5. שומרים את הקובץ ומפעילים מחדש את Tinyproxy:

    sudo service tinyproxy restart
    
  6. כדי לצאת מהסשן:

    exit
    

התחברות לאשכול מהלקוח המרוחק

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

  1. קבלת פרטי הכניסה לאשכול:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=PROJECT_ID
    

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

    • CLUSTER_NAME: השם של האשכול הפרטי.
    • CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול ב-Compute Engine. מציינים אזור לאשכולות אזוריים או אזור זמין לאשכולות אזוריים.
    • PROJECT_ID: המזהה של Google Cloud הפרויקט של האשכול.
  2. יוצרים מנהרה ליעד המבוצר (bastion host) באמצעות IAP:

    gcloud compute ssh INSTANCE_NAME \
        --tunnel-through-iap \
        --project=PROJECT_ID \
        --zone=COMPUTE_ZONE \
        --ssh-flag="-4 -L8888:localhost:8888 -N -q -f"
    
  3. מציינים את ה-proxy:

    export HTTPS_PROXY=localhost:8888
    kubectl get ns
    

    הפלט הוא רשימה של מרחבי שמות באשכול הפרטי.

הפסקת ההאזנה בלקוח המרוחק

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

netstat -lnpt | grep 8888 | awk '{print $7}' | grep -o '[0-9]\+' | sort -u | xargs sudo kill

פתרון בעיות

הגבלות חומת אש ברשתות ארגוניות

אם אתם מחוברים לרשת ארגונית עם חומת אש מחמירה, יכול להיות שלא תוכלו להשלים את המדריך הזה בלי לבקש חריגה. אם מבקשים חריגה, טווח כתובות ה-IP של המארח המבצר הוא 35.235.240.0/20 כברירת מחדל.

הסרת המשאבים

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

מחיקת הפרויקט

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

מחיקת משאבים בודדים

  1. מוחקים את מארח ה-bastion שפרסתם במדריך הזה:

    gcloud compute instances delete INSTANCE_NAME \
        --zone=COMPUTE_ZONE
    
  2. מחיקת האשכול:

    gcloud container clusters delete CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
    
  3. מוחקים את תת-הרשת:

    gcloud compute networks subnets delete SUBNET_NAME \
        --region=CONTROL_PLANE_LOCATION