לדלג לתוכן

מה זה SSH ולמה הוא בטוח - הכלי שכל מפתח משתמש בו בלי לחשוב פעמיים

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

מה זו הבעיה שSSH פותר

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

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

איך ההצפנה עובדת בפועל

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

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

אימות בסיסמה מול אימות במפתחות

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

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

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

למה SSH נחשב בטוח, לא רק "מוצפן"

הצפנה היא רק חלק מהתמונה. SSH נותן לכם גם:

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

איפה נתקלים בSSH בפועל

  • התחברות לשרתים בענן - AWS, Google Cloud, כל שירות ענן, כמעט תמיד ההתחברות הראשונית לשרת היא דרך SSH.
  • Git - כשאתם עושים git push עם כתובת שמתחילה ב-git@github.com, אתם משתמשים ב-SSH מאחורי הקלעים, מאומתים באמצעות המפתח הפרטי שלכם.
  • העברת קבצים מאובטחת - פרוטוקולים כמו SCP ו-SFTP רצים מעל SSH, ומאפשרים להעביר קבצים באותה שכבת הצפנה.
  • מנהור לגישה מרחוק - כמו שראינו, שימושי לגשת בבטחה למסדי נתונים או שירותים פנימיים בלי לחשוף אותם לאינטרנט הרחב.

טעות נפוצה שכדאי להימנע ממנה

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

למה שווה להבין את זה לעומק, לא רק "להעתיק פקודה"

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

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

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

הצטרפו לקהילה בדיסקורד

לסיכום

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