קרברוס (פרוטוקול)

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

היסטוריה והתפתחות

פרוטוקול קרברוס נולד כחלק מפרויקט אתנה (Athena Project), שמו ניתן לו על שם הדמות קרברוס מהמיתולוגיה היוונית, מפלצת דמוית כלב, בעלת שלושה ראשים ששירתה את האדס - "אל השאול", בשמירה על שער הגיהנום.
פרויקט אתנה הוקם על ידי MIT ב-1979 במטרה לספק הגנה על רשת המחשבים הפנימית של המכון. לאפשר גישה למחשבי המכון על ידי המשתמשים המורשים ולמנוע גישה לקבצים פרטיים ממי שלא הוסמך לכך. בשלבים הראשונים פותחו שלוש גרסאות פנימיות של הפרוטוקול שלא פורסמו. גרסה 4 שמפתחיה העיקריים היו סטיב מילר וקליפורד ניומן פורסמה במחצית השנייה של 1980 ונועדה בעיקר לצורך הפרויקט. לאור ליקויים שהתגלו בה, פותחה גרסה 5 של הפרוטוקול על ידי צוות של MIT בראשות קליפורד ניומן וג'ון קול ופורסמה בספטמבר 1993. גרסה זו הורחבה מספר פעמים במטרה לתקן מספר ליקויי בטיחות שהתגלו לאורך השנים בגרסה המקורית. MIT שחררה את גרסה 5 של הפרוטוקול לשימוש חופשי ופרסמה מימוש שלו לחלונות ולמקינטוש תחת היתר שימוש הדומה למערכת ההפעלה BSD וכן פרסמה את ממשק תכנות יישומים (API) עבור קרברוס הנקרא GSS-API המאפשר קריאות לפונקציות קריפטוגרפיות לצורך הפרוטוקול.
מבחינה היסטורית, בשל העובדה שמימוש הפרוטוקול כולל אלגוריתם הצפנה כמו DES שהעיסוק בו נחשב בעבר לפי החוק האמריקאי כעיסוק בנשק או תחמושת (כמו טנק או טיל בליסטי), הוכנס הפרוטוקול לרשימת אמצעי החימוש האסורים ביצוא מחוץ לתחומי ארצות הברית. לפני שינוי תקנות הייצוא הקריפטוגרפיות של ממשלת ארצות הברית, פותחה בשוודיה גרסה חופשית של פרוטוקול קרברוס הנקראת Heimdal על בסיס גרסה מוגבלת של MIT (שממנו הוסרו האלמנטים הקשורים בהצפנה) וכן פותחה גרסה נוספת של הפרוטוקול בשם Shishi תחת רישיון שימוש GPL של GNU.

אלגוריתמים נתמכים

הצפנים הסימטריים שהיו בשימוש הפרוטוקול בעבר הם DES במצב הפעלה CBC וצופן הזרם RC4 והאימות בוצע עם קוד אימות HMAC בשילוב פונקציית הגיבוב MD5. כיום קיימת תמיכה להצפנה מאומתת עם AES בשתי גרסאות: AES128-CTS-HMAC-SHA1-96 וכן AES256-CTS-HMAC-SHA1-96.

שימושים

קרברוס אינו מתאים לשימוש ברשת האינטרנט אלא בעיקר ברמה ארגונית. החל מחלונות 2000 ומעלה, אימצה חברת מיקרוסופט את פרוטוקול קרברוס גרסה 5 כברירת המחדל לביצוע תהליכי אימות זהויות של Active Directory בכל גרסאות מערכות ההפעלה מבית החברה, כולל קונסולות Xbox. מיקרוסופט אינה משתמשת במימוש של MIT אלא תחת זאת בגרסה שונה במעט שהם פיתחו שנקראת SSPI. טכנולוגיות מבית חברת SAP כמו CyberSafe מיישמות את מימוש MIT של קרברוס. מערכות הפעלה רבות תואמי יוניקס תומכות בפרוטוקול קרברוס, בהן Red Hat, מערכת ההפעלה FreeBSD, מערכת ההפעלה Mac OS X של אפל על מחשבי מקינטוש, סולאריס ועוד.

תעודת אימות

קיומו של טיקט שירות תקף (בקיצור טיקט) עדיין אינו משליך בהכרח על אימות הלקוח. היות שמדובר ברשת פתוחה, כל אחד יכול ליירט טיקט ולנסות לעשות בו שימוש מאוחר יותר. קיומה של כתובת IP לא עוזרת במיוחד כיוון שכידוע קל לזייף כתובות. הדבר היחיד שהלקוח ונותן השירות יודעים ואף אחד אחר לא, הוא מפתח השיחה (כמובן בנוסף למנהל הרשת שהכין אותו, אבל הוא בהגדרה נקרא "נאמן"), לכן האסטרטגיה שנוקט פרוטוקול קרברוס היא: יחד עם הטיקט שהלקוח שולח לנותן השירות הוא מצרף תעודת אימות (authenticator) בה מופיעים פרטי הלקוח וחותם זמן כשהם מוצפנים באמצעות מפתח השיחה. נותן השירות מצידו פועל בדרך מאוד פשוטה, תחילה הוא מחלץ את המפתח השיחה מהטיקט המיועד אליו, איתו הוא משתמש כדי לפענח את תעודת האימות. אם הלקוח הוא באמת מי שהוא טוען שהוא, השרת יוכל לפענח את התעודה בהצלחה ולחלץ את פרטי הלקוח ולבדוק שאכן זמן הנפקת התעודה "טרי". תעודה שעבר זמנה כלומר שהזמן המופיע בה רחוק לפחות שתי דקות מהזמן בשעונו של השרת תדחה מיד. כאן רואים מדוע יש חשיבות לסינכרון הזמן בין השעונים של מחשבים השייכים לאותו תחום. 
קיימת אפשרות קלושה שהמתקיף יצליח ליירט טיקט ותעודת אימות ולשלוח אותם בתוך פחות משתי דקות או כל חלון זמן אחר שהוגדר על ידי המערכת. הפתרון שנוסף בגרסה 5 הוא "מטמון שידור חוזר" (Replay cache). בעיקר בשרתים, נוספה אפשרות למעקב אחרי כל התעודות שהתקבלו במשך חלון הזמן שנקבע, והמערכת יודעת לדחות תעודות כפולות ובכך למנוע התקפת שידור חוזר מסוג זה. הבעיה תיפטר בתנאי שהמתקיף המתוחכם לא יצליח לשלוח את התעודה והטיקט הגנובים לפני שהלקוח עצמו הספיק לעשות זאת. זה כמובן יהיה משעשע כי הלקוח הלגיטימי עלול להיות מואשם ב"התחזות".

הרשאות

היות שהלקוח לעולם אינו שומר את סיסמתו במחשב (או לפחות זו ההמלצה), כדי להתאים את המערכת למצב של "אימות יחיד" (בכניסה) הנקרא בקיצור SSO, יש צורך לשמור במקום זמני כלשהו את מפתח השיחה והתעודות לפחות עד שהשיחה מסתיימת. המקום בו מאוחסן המידע הזה נקרא מטמון הרשאות (Credential Cache). מיקום המטמון אינו תלוי בפרוטוקול והוא משתנה מיישום אחד לאחר לפי העדפה. במימוש של MIT לצורך תאימות מטמון ההרשאות נשמר במערכת הקבצים. להגברת הביטחון יש כאלו (כמו Active Directory של מיקרוסופט) שמאחסנים אותו בזיכרון הליבה המוגן מפני גישה ברמת משתמש ואינו מועתק למקום אחר בזמן שהמערכת מדפדפת.

ניהול מפתחות

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

התקפת שימוש חוזר - Replay attack

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

שירות זמן מאובטח

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

צד שלישי

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