עדכון מפתח ה RSA של גיטהאב

27/03/2023

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

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s.
Please contact your system administrator.
Add correct host key in /Users/ynonp/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/ynonp/.ssh/known_hosts:13
Host key for github.com has changed and you have requested strict checking.
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

בואו נראה מה קרה ואיך מתקנים

1. מה זה מפתח RSA

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

בפעם הראשונה שאנחנו מתחברים לגיטהאב בפרוטוקול גיט המחשב שלנו שומר את החלק "הציבורי" של המפתח, או את נעל הזכוכית בקובץ (ביוניקס זה קובץ שנקרא ~/.ssh/known_hosts). בפעם הבאה שננסה להתחבר המחשב מתחיל את החיבור באימות זהות של גיטהאב - האם הרגל עדיין מתאימה לנעל הזכוכית ששמורה אצלי בקובץ. אם כן הכל טוב, אם לא עוצרים הכל ומציגים שגיאה.

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

2. מה קרה בגיטהאב

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

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

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

3. למה ואיך העדכון משפיע עליי?

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

אנחנו צריכים לעדכן את המפתח הציבורי ששמור אצלנו במחשב כדי שיתאים למפתחות החדשים של גיטהאב.

בשביל זה עלינו למחוק את המפתח הקיים של גיטהאב עם הפקודה:

$ ssh-keygen -R github.com

או למחוק את השורה מהקובץ known_hosts.

לאחר מכן אפשר להשתמש בפקודה הבאה כדי להוסיף את המפתח החדש לסוף קובץ ה known_hosts:

curl -L https://api.github.com/meta | jq -r '.ssh_keys | .[]' | sed -e 's/^/github.com /' >> ~/.ssh/known_hosts

פרטים מלאים על השינוי תוכלו למצוא בהודעה של גיטהאב בקישור: https://github.blog/2023-03-23-we-updated-our-rsa-ssh-host-key/