במדריך הזה נדגים איך להשתמש ב-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 . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
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 theserviceusage.services.enablepermission. Learn how to grant roles.-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
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 theserviceusage.services.enablepermission. Learn how to grant roles.-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init - זה שינוי אופציונלי. כדי להכיר את המוצר הזה, כדאי לעבור על המדריך למתחילים של Secret Manager.
יצירת מפתח SSH
פותחים חלון טרמינל.
יוצרים ספרייה חדשה בשם
workingdirועוברים אליה:mkdir workingdir cd workingdirיוצרים מפתח 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, מבצעים את הפעולות הבאות:
נכנסים לדף Secret Manager במסוף Google Cloud :
בדף Secret Manager, לוחצים על Create Secret (יצירת סוד).
בדף יצירת Secret, בשדה שם, מזינים שם ל-Secret.
בשדה Secret value (ערך סודי), לוחצים על Upload (העלאה) ומעלים את הקובץ
workingdir/id_github.משאירים את הקטע אזורים ללא שינוי.
לוחצים על הלחצן Create secret.
הפעולה הזו תעלה את קובץ id_github אל Secret Manager.
הוספת מפתח ציבורי SSH למפתחות הפריסה של המאגר הפרטי
מתחברים ל-GitHub.
בפינה השמאלית העליונה, לוחצים על תמונת הפרופיל ואז על הפרופיל שלך.
בדף הפרופיל, לוחצים על Repositories ואז על שם המאגר.
במאגר, לוחצים על Settings (הגדרות).
בסרגל הצד, לוחצים על Deploy Keys (מפתחות פריסה) ואז על Add deploy key (הוספת מפתח פריסה).
מזינים כותרת ומדביקים את מפתח ה-SSH הציבורי מ-
workingdir/id_github.pub.בוחרים באפשרות Allow write access (מתן הרשאת כתיבה) אם רוצים שלמפתח הזה תהיה הרשאת כתיבה למאגר. מפתח פריסה עם גישת כתיבה מאפשר לפריסה לשלוח אל מאגר המידע.
לוחצים על הוספת מפתח.
מוחקים את מפתח ה-SSH מהדיסק:
rm id_github*
מתן הרשאות
צריך להעניק הרשאה לגישה ל-Secret Manager לחשבון השירות שבו משתמשים בשביל הבנייה.
-
במסוף Google Cloud , נכנסים לדף settings Cloud Build Permissions:
בתפריט הנפתח, בוחרים את חשבון השירות שרוצים לשנות את התפקידים שלו.
מגדירים את הסטטוס של התפקיד
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
כדי להגדיר את הגרסה:
יוצרים קובץ הגדרות 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 בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
מחיקת הפרויקט
הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך הזה.
כדי למחוק את הפרויקט:
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
מחיקת מפתח הפריסה מהמאגר
עוברים לדף הראשי של המאגר ב-GitHub.
מתחת לשם המאגר, לוחצים על Settings.
בסרגל הצד הימני, לוחצים על Deploy keys (מפתחות פריסה).
בדף Deploy keys, מחפשים את מפתחות הפריסה שמשויכים למאגר ולוחצים על Delete.