BinaryVision

SSL as ACL

מאת בתאריך 28/04/12, תחת כללי

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

תחילה נבאר מספר מושגים. SSL וממשיכו TLS הינם פרוטוקולים לשם הצפנת הדו-שיח בין צדדים שונים (שרתים וקלינטים). ההצפנה מורכבת מתהליך של החלפת מפתחות (Key Exchange), שימוש במפתחות בכדי להצפין את המידע (Encryption), וחתימה של מידע בכדי לאשר את שלמותו וכי אף אחד אחר לא התעסק עם המידע (Signing). בעזרת היישומים השונים (OpenSSL, GnuTLS, ואחרים) התמיכה בהצפנה הורחבה לאפלקציות רבות כאשר במרכז המאמר של היום יהיו שרת הוואב (Apache) והדפדפן (Firefox).

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

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

בכדי ליצור את התעודות בחרתי לעשות שימוש ב-Easy-RSA  שמגיע עם OpenVPN. לא מצאתי את הרשיון של הכלים הללו, אז בחרתי שלא לספק קישור אליהם, ניתן למצוא עוד מידע על הכלים הללו כאן. השלב הראשון הוא יצירה של Certificate Authority, לאחר שנכנסו לספריה של Easy-RSA נריץ את הפקודות (ערוך ראשית את הקובץ vars שיתאים לצרכים שלך):

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

source ./vars
./build-ca

על-ידי פקודות אלו יצרנו את ה-CA (הקבצים ימצאו בספריה keys). השלב הבא הוא ליצור תעודה לשרת שלנו:

./build-key-server admin.itk98.net

וכמו-כן, ניצור תעודת קלינט אחת (בסוף התהליך תתבקש להכניס סיסמה בכדי להגן על הקובץ [p12] שכן הוא מכיל גם את ה-CRT וגם את ה-KEY יחדיו ואפשר לייבא אותו אל תוך הדפדפן):

./build-key-pkcs12 admin@itk98.net

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

...
SSLCertificateFile admin.itk98.net.crt
SSLCertificateKeyFile admin.itk98.net.key
SSLCertificateChainFile ca.crt
SSLCACertificateFile ca.crt
...

כמו כן, אני רוצה שרק הגישה לספריה admin-console תבקש לאשר את זהות הלקוח (אני יכול גם לעשות שימוש ב-htaccess):

...
<Directory /admin-console>
SSLVerifyClient require
SSLVerifyDepth 1
</Directory>
...

בדפדפן שלי אני אצטרך לבצע שתי פעולות, אחת היא לייבא את הca.crt כדי למנוע מהדפדפן להזהיר בדבר תעודות שחתומות באופן עצמאי, ולייבא את תעודת הקלינט (הקובץ עם הסיומת p12). על-ידי ההגדרות האלה, בפעם הבא שאני אגש ל-https://admin.itk98.net/admin-console יוצג בפני בקשה להציג תעודת קלינט, ואם היא תואמת ל-CA בשימוש השרת, אז הלחיצת יד (SSL) תושלם.

לקריאה נוספת:

1. Apache mod_ssl.

2. CACert.org.

:, , , , , , ,
2 תגובות:
  1. iTK98

    הערה,
    אפשר לעשות שימוש בתעודה שהונפקה על-ידי ישות שנמצאת ב-Root Certificate, ועדיין להיות בעלי שליטה על תעודות הקלינטים. בכל מקרה תצטרכו ליצור CA משל עצמכם, SSLCACertificateFile תצטרכו להגדיר עם ה-CA שלכם.

  2. דביר

    תודה רבה על המידע! פוסט מעולה!

השאר תגובה

מחפש משהו?

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