שימוש מאובטח ב-Git - חלק א' - חותמת?

מבוא

בסדרת הפוסטים הבאים אסביר איך להשתמש ב-Git באופן מעט יותר מאובטח. למי שלא מכיר, Git הינו מוצר Version Control (ניהול גרסאות) נפוץ בשימוש של ארגונים ופרטיים שמאפשר לעבוד על קוד בשיתוף פעולה. מטרת העל של Git היא לנהל מעקב אחר השינויים שהוכנסו בקוד, לוודא את שלמות הקוד, לאפשר למספר משתתפים רב לעבוד על אותה פיסת קוד מבלי להפריע (יותר מדי) אחד לשני, כל זאת תו"כ מהירות פעולה שמאפשרת לעבור בין גרסאות שונות של הקוד.

למה לחתום (Sign) על העבודה?

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

רוב הארגונים שיש להם מאגרים פרטיים (Private repository), כנראה שלא ידרשו את השימוש בחיתום - אני יכול להבין, כנראה שיש כל כך הרבה אמצעי זיהוי ואימות שלהוסיף את הדרישה הזו גם כן - כנראה שיפריע יותר משיעזור. אבל מה אם יש לנו מאגר פומבי (Public repository), שאנחנו רוצים לוודא שהבקשה לשינויים (Pull request) הגיע באמת ממשתמש מסויים? במקרה הזה נוכל להסתמך על PGP.

אני מאמין שבאופן כללי הפרקטיקה של לחתום על העבודה הוא חיובי, גם אם מדובר במאגרים פרטיים שרק הארגון חשוף אליהם, עכשיו לפורץ יהיה עוד משימה (יעד להשיג), גישה למפתח PGP של הקורבן.

סביבת העבודה שלי

מערכת הפעלה: Debian 11
מאגר מנוהל: Github
גרסה: GnuPG 2.4.0

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

יצירת המפתח

השלב הראשון הוא לייצר מפתח שישמש אותנו לחתימה:

gpg --full-gen-key

תשאלו מספר שאלות לגבי סוג המפתח ומי שיעשה בו שימוש. אני נוטה להשתמש במפתחות RSA בגודל של 4096 סיביות. אני משתמש באימייל יעודי לכל שירות וכן מפתח תואם לו בשם. מומלץ לא להשתמש במפתחות ללא תאריך תוקף, ומומלץ שלא יהיו ארוכים מ-36 חודשים (3 שנים), במיוחד מפתחות שקטנים מ-4096 סיביות.

הוספת המפתח הפומבי ל-Github

לאחר שיצרתם את המפתח, יופיעו פרטיו, העתיקו את ה-ID שלו בכדי להדפיס את התוכן של המפתח הפומבי בעזרת הפקודה (הוסיפו את ה-ID של המפתח שלכם לסופו):

gpg --armor --export [ID]

ב-Github נווטו ל-Settings → SSH and GPG Keys, ולחצו על New GPG key

בתיבה שתפתח, הדביקו את המפתח הפומבי שלכם.

אגב, המפתח שלכם, זה כל התוכן שנמצא בין - כולל:

-----BEGIN PGP PUBLIC KEY BLOCK-----
.
.
.
-----END PGP PUBLIC KEY BLOCK-----

להגדיר את Git להשתמש במפתח

הריצו את הפקודה הבאה בכדי להדפיס את ה-ID של המפתח הפרטי:

gpg --list-secret-keys --keyid-format LONG [EMAIL]

העתיקו את ה-ID לפקודה הבאה (שאומרת לפקודה git באופן כללי, להשתמש במפתח הזה בכדי לחתום על commits):

git config --global user.signingkey [KEY ID]

תמיד לחתום?

אם ברצונכם להגדיר שתמיד תחתם העבודה שלכם, תריצו:

git config --global commit.gpgsign true

אם אתם חותמים ידנית, אז הוסיפו את הפרמטר -S כאשר אתם מבצעים commit:

git commit -S -m 'I hope you are writing useful messages'

קריאה נוספת