הבנת הקידוד ותהליך החיבור ב־SSH

הקדמה

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

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

הבנת הצפנה סימטרית, צפנה אסימטרית ופונקציות גיבוב

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

הצפנה סימטרית

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

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

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

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

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

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

ניתן להגדיר את SSH להשתמש במגוון של מערכות שפעולת הצפנה סימטריות שונות, כולל Advanced Encryption Standard (AES), Blowfish, 3DES, CAST128 ו-Arcfour. השרת והלקוח יכולים להחליט על רשימה של הצפנים התומכים שלהם, מסודרים לפי עדיפות. האפשרות הראשונה מרשימת הלקוח שזמינה בשרת משמשת כאלגוריתם הצפנה בשתי הכיוונים.

ב־Ubuntu 20.04, השרת והלקוח מוגדרים כך כברירת מחדל:

זה אומר שאם שני מחשבים Ubuntu 20.04 מתחברים אחד לשני (בלי לדרוס את הצפיפות המוגדרת כברירת מחדל דרך אפשרויות התצורה), הם תמיד ישתמשו בצפיפות [email protected] כדי להצפין את החיבור שלהם.

הצפיפות אסימטרית

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

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

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

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

שימוש נפוץ יותר בהצפנה אסימטרית ב־SSH הוא עם אימות מבוסס על מפתחות SSH. זוגות מפתחות SSH יכולים לשמש לאימות מטופל לשרת. הלקוח יוצר זוג מפתחות ואז מעלה את המפתח הציבורי לשרת רחוק שבו הוא רוצה לגשת. מפתח זה מתוך בקובץ בשם authorized_keys בתיקיית ~/.ssh בתיקיית הבית של חשבון המשתמש בשרת רחוק.

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

גיבוב

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

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

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

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

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

הַMAC נשלח באופן חיצוני מחוץ לאזור המוצפן סימטרית כחלק מסיום החבילה. חוקרים ממליצים בדרך כלל על שיטה זו של הצפנת הנתונים תחילה ואז חישוב הַMAC.

הבנת כיצד פרוטוקול SSH פועל

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

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

הלקוח אחראי להתחיל את המשלוח הראשוני של פרוטוקול בקרת התקשורת (TCP) עם השרת, למוּשך על יחס חיבור מאובטח, לאמת כי זהות השרת מתאימה למידע שנרשם מראש, ולספק אישורים לאימות.

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

מנהל התקשרות להצפנה בסשן

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

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

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

הבסיס של הליך זה עבור דיפי-הלמן קלסי הם:

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

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

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

לאחר שהצפנת הסשן מוכנה, מתחיל שלב אימות המשתמש.

אימות גישת המשתמש לשרת

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

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

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

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

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

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

  • הלקוח מתחיל על ידי שליחת זיהוי עבור זוג המפתחות שברצונו לאמת עם השרת.
  • השרת בודק את קובץ authorized_keys של החשבון שהלקוח מנסה להתחבר אליו עבור המזהה המפתח.
  • אם מצוי מפתח ציבורי עם מזהה תואם בקובץ, השרת מייצר מספר אקראי ומשתמש במפתח הציבורי כדי להצפין את המספר.
  • השרת שולח ללקוח את ההודעה המוצפנת הזו.
  • אם ללקוח יש באמת את המפתח הפרטי המתאים, הוא יהיה מסוגל לפענח את ההודעה באמצעות המפתח הזה, חושף את המספר המקורי.
  • הלקוח משלב את המספר שפענח עם מפתח המשיכה המשותף המשמש להצפנת התקשורת, ומחשב את ערך גבול ה-MD5 של הערך הזה. MD5 הוא אלגוריתם גיבוב המשמש בפועל כדי ליצור ערך גיבוב של 128 ביטים.
  • הלקוח משלח זאת את ערך גבול ה- MD5 הזה חזרה לשרת כתשובה להודעת המספר המוצפנת.
  • השרת משתמש באותו מפתח המשיכה המשותף והמספר המקורי ששלח ללקוח כדי לחשב את ערך גבול ה- MD5 בעצמו. הוא משווה את החישוב שלו לאחד שהלקוח שלח חזרה. אם שני הערכים הללו תואמים, זה מוכיח שהלקוח היה בבעלות של המפתח הפרטי והלקוח מאומת.

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

מסקנה

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

Source:
https://www.digitalocean.com/community/tutorials/understanding-the-ssh-encryption-and-connection-process