גישה ל-GitHub מ-build באמצעות מפתחות SSH

במדריך הזה נדגים איך להשתמש ב-Secret Manager עם Cloud Build כדי לגשת למאגרי GitHub פרטיים מתוך build. ‫Secret Manager הוא Google Cloud שירות שמאחסן בצורה מאובטחת מפתחות API, סיסמאות ומידע אישי רגיש אחר.

מטרות

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

עלויות

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

  • Secret Manager
  • Cloud Build

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

משתמשים חדשים של 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 Cloud Build and Secret Manager APIs.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

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

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

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

    gcloud init
  8. 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

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

  10. Enable the Cloud Build and Secret Manager APIs.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

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

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

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

    gcloud init
  14. זה שינוי אופציונלי. כדי להכיר את המוצר הזה, כדאי לעבור על המדריך למתחילים של Secret Manager.

יצירת מפתח SSH

  1. פותחים חלון טרמינל.

  2. יוצרים ספרייה חדשה בשם workingdir ועוברים אליה:

    mkdir workingdir
    cd workingdir
    
  3. יוצרים מפתח SSH חדש ב-GitHub, כאשר github-email היא כתובת האימייל שלכם ב-GitHub:

    ssh-keygen -t rsa -b 4096 -N '' -f id_github -C github-email
    

    הפקודה הזו יוצרת מפתח SSH חדש workingdir/id_github בלי ביטוי סיסמה למפתח ה-SSH. ‫Cloud Build לא יכול להשתמש במפתח ה-SSH אם הוא מוגן באמצעות סיסמה.

אחסון מפתח SSH פרטי ב-Secret Manager

כשיוצרים מפתח SSH, נוצר קובץ id_github בסביבה שלכם. כל אחד יכול לאמת את החשבון שלכם באמצעות הקובץ הזה, ולכן אתם צריכים לאחסן אותו ב-Secret Manager לפני שמשתמשים בו ב-build.

כדי לאחסן את מפתח ה-SSH ב-Secret Manager, מבצעים את הפעולות הבאות:

  1. נכנסים לדף Secret Manager במסוף Google Cloud :

    מעבר לדף Secret Manager

  2. בדף Secret Manager, לוחצים על Create Secret (יצירת סוד).

  3. בדף יצירת Secret, בשדה שם, מזינים שם ל-Secret.

  4. בשדה Secret value (ערך סודי), לוחצים על Upload (העלאה) ומעלים את הקובץ workingdir/id_github.

  5. משאירים את הקטע אזורים ללא שינוי.

  6. לוחצים על הלחצן Create secret.

הפעולה הזו תעלה את קובץ id_github אל Secret Manager.

הוספת מפתח ציבורי SSH למפתחות הפריסה של המאגר הפרטי

  1. מתחברים ל-GitHub.

  2. בפינה השמאלית העליונה, לוחצים על תמונת הפרופיל ואז על הפרופיל שלך.

  3. בדף הפרופיל, לוחצים על Repositories ואז על שם המאגר.

  4. במאגר, לוחצים על Settings (הגדרות).

  5. בסרגל הצד, לוחצים על Deploy Keys (מפתחות פריסה) ואז על Add deploy key (הוספת מפתח פריסה).

  6. מזינים כותרת ומדביקים את מפתח ה-SSH הציבורי מ-workingdir/id_github.pub.

  7. בוחרים באפשרות Allow write access (מתן הרשאת כתיבה) אם רוצים שלמפתח הזה תהיה הרשאת כתיבה למאגר. מפתח פריסה עם גישת כתיבה מאפשר לפריסה לשלוח אל מאגר המידע.

  8. לוחצים על הוספת מפתח.

  9. מוחקים את מפתח ה-SSH מהדיסק:

    rm id_github*
    

מתן הרשאות

צריך להעניק הרשאה לגישה ל-Secret Manager לחשבון השירות שבו משתמשים בשביל הבנייה.

  1. במסוף Google Cloud , נכנסים לדף Cloud Build Permissions:

    עוברים אל הרשאות

  2. בתפריט הנפתח, בוחרים את חשבון השירות שרוצים לשנות את התפקידים שלו.

  3. מגדירים את הסטטוס של התפקיד Secret Manager Secret Accessor להפעלה.

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

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

כדי ש-Cloud Build יוכל להתחבר ל-GitHub, צריך להוסיף את מפתח ה-SSH הציבורי לקובץ known_hosts בסביבת build של Cloud Build. כדי לעשות את זה, אפשר להוסיף את המפתח לקובץ known_hosts.github זמני, ואז להעתיק את התוכן של known_hosts.github לקובץ known_hosts בסביבת build של Cloud Build.

בספרייה workingdir (אותה ספרייה שבה נמצא הקובץ cloudbuild.yaml), יוצרים קובץ בשם known_hosts.github. צריך לכלול את הקובץ הזה בקוד המקור ששולחים ל-Cloud Build כדי שהוא יהיה זמין במהלך ההרצה של ה-build. אם אתם משתמשים במאגר Git עם טריגר, אתם צריכים לבצע commit של הקובץ הזה למאגר. מוסיפים את המפתח הציבורי של SSH לקובץ הזה:

ssh-keyscan -t rsa github.com > known_hosts.github

בקטע הבא, כשמגדירים את ה-build, מוסיפים הוראות בקובץ התצורה של Cloud Build כדי להעתיק את התוכן של known_hosts.github לקובץ known_hosts בסביבת ה-build של Cloud Build.

הגדרת ה-build

כדי להגדיר את הגרסה:

  1. יוצרים קובץ הגדרות build בשם cloudbuild.yaml עם שני שלבים: בשלב הראשון gcloud ניגשים למפתח ה-SSH ב-Secret Manager ושומרים אותו כ-id_rsa בווליום בשם ssh, יחד עם עותק של known_hosts.github. הנפח משמש להתמדה של קבצים בשלבי ה-build. בשלב השני git משתמשים במפתח ב-id_rsa כדי להתחבר למאגר ב-git@github.com:git-username/git-repository.

    # Access the id_github file from Secret Manager, and setup SSH
    steps:
    - name: 'gcr.io/cloud-builders/git'
      secretEnv: ['SSH_KEY']
      entrypoint: 'bash'
      args:
      - -c
      - |
        echo "$$SSH_KEY" >> /root/.ssh/id_rsa
        chmod 400 /root/.ssh/id_rsa
        cp known_hosts.github /root/.ssh/known_hosts
      volumes:
      - name: 'ssh'
        path: /root/.ssh
    
    # Clone the repository
    - name: 'gcr.io/cloud-builders/git'
      args:
      - clone
      - --recurse-submodules
      - git@github.com:GIT_USERNAME/GIT_REPOSITORY
      volumes:
      - name: 'ssh'
        path