גישה ל-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 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. 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 Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. 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: /root/.ssh
    
    availableSecrets:
      secretManager:
      - versionName: projects/PROJECT_ID/secrets/SECRET_NAME/versions/latest
        env: 'SSH_KEY'
    

מחליפים את ערכי ה-placeholder בפקודות הקודמות בערכים הבאים:

  • GIT_USERNAME: שם המשתמש ב-GitHub של בעל המאגר.
  • GIT_REPOSITORY: השם של מאגר GitHub שרוצים לגשת אליו.
  • PROJECT_ID: המזהה של Google Cloud הפרויקט שבו שמרתם את הסודות.
  • SECRET_NAME: השם של הסוד שיצרתם ב-Secret Manager.

מידע על מחרוזות מרובות שורות ב-YAML שמופיעות בקטע הקוד שלמעלה זמין במאמר בנושא YAML multiline.

שליחת ה-build

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

gcloud builds submit --config=cloudbuild.yaml .

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

Creating temporary tarball archive of 3 file(s) totalling 4.1 KiB before compression.
Uploading tarball of [.] to [gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/[PROJECT-ID]/builds/871b68bc---].
Logs are available at [https://console.cloud.google.com/cloud-build/builds/871b68bc---?project=[PROJECT-ID]].
----------------------------- REMOTE BUILD OUTPUT ------------------------------
starting build "871b68bc-cefc-4411-856c-2a2b7c7d2487"

FETCHSOURCE
Fetching storage object: gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178
Copying gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178...
/ [1 files][  3.9 KiB/  3.9 KiB]
Operation completed over 1 objects/3.9 KiB.
BUILD
Step #0: Already have image (with digest): gcr.io/cloud-builders/gcloud
Starting Step #0
Finished Step #0
Step #1: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #1
Step #1: # github.com SSH-2.0-libssh_0.7.0
Finished Step #1
Step #2: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #2
Step #2: Cloning into '[REPOSITORY-NAME]'...
Step #2: Warning: Permanently added the RSA host key for IP address 'XXX.XXX.XXX.XXX' to the list of known hosts.
Finished Step #2
PUSH
DONE
-----------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE                                                                              IMAGES  STATUS
871b68bc-cefc-4411-856c-2a2b7c7d2487  XXXX-XX-XXT17:57:21+00:00  13S       gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz  -                                 SUCCESS

הסרת המשאבים

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

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

הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך הזה.

כדי למחוק את הפרויקט:

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

    כניסה לדף Manage resources

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

מחיקת מפתח הפריסה מהמאגר

  1. עוברים לדף הראשי של המאגר ב-GitHub.

  2. מתחת לשם המאגר, לוחצים על Settings.

  3. בסרגל הצד הימני, לוחצים על Deploy keys (מפתחות פריסה).

  4. בדף Deploy keys, מחפשים את מפתחות הפריסה שמשויכים למאגר ולוחצים על Delete.

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