|
מאמר Net. מספר 2: Code Access Security חלק ראשון
הקדמה
במסגרת סביבת ה-.Net Framework קיים לו מנגנון אבטחה מתקדם ועשיר הקרוי Code Access Security (CAS בקיצור). המנגנון מיועד לאפשר שליטה מדוייקת בהרשאות שמקבל כל קוד שרץ בסביבה. בסדרת המאמרים הקרובה נתמקד ב-CAS ונראה איך הוא פועל ומה ניתן להשיג באמצעותו. לפני מאמר זה רצוי לקרוא את המאמר הקודם העוסק ב-AppDomains.
בחלק הראשון נסקור את ה-CAS מגבוה ונדבר על מדיניות האבטחה (Security Policy) שיוצרים באמצעותו. לצורך כך נשתמש בתוסף הקונפיגורציה של ה-Framework Control Panel ->) Administrative Tools -> Microsoft .Net Framework XX Configuration -> Runtime Security Policy) ובכלי שורת-הפקודה caspol.exe. בחלקים עתידיים נראה איך עושים שימוש במדיניות האבטחה מתוך קוד.
CAS מגובה 10,000 רגל
מטרתו של ה-CAS, כפי שנכתב לעיל, היא למעשה פיקוח ובקרה על גישה למשאבי המערכת. רק קוד שקיבל הרשאות מפורשות יהיה רשאי להשתמש במשאבים כלשהם. המושג 'שימוש במשאב' בהקשר הזה הוא רחב מאוד – בין היתר הוא כולל גישות לרשת, גישות ל-Event Log, קריאה/כתיבה של קבצים וספריות, קריאה/כתיבה ל-Registry, נגישות לבסיסי נתונים ודברים רבים נוספים. לכל תוכנית ניתן להגדיר בצורה מדוייקת לאלו משאבים היא רשאית לגשת ומה היא רשאית לעשות איתם. לדוגמא, לא נרצה שתוכנית .Net שרצה בתור בקר (control) תחת Internet Explorer תוכל לקרוא באופן חופשי כל קובץ על המחשב או מפתחות ב-registry ולשדר אותן באינטרנט.
הדרך בה עובד ה-CAS היא ע'י מתן הרשאות לכל assembly בתוכנית בנפרד ברגע שהתוכנית עולה ולפני שהיא מתחילה לרוץ. הרשאות הן בדיוק אותן 'זכויות שימוש במשאב' שהוזכרו קודם: לדוגמא, assembly מסויים עשוי לקבל הרשאות קריאה בלבד מספריית C:\Temp. אם הוא ינסה לקרוא ממקום אחר – או לכתוב ל-C:\Temp – אז יזרק SecurityException. אם הוא יקבל גם הרשאות כתיבה או את הרשאות קריאה הנוספות אז התוכנית תרוץ כרגיל.
לאחר שה-CLR יודע בדיוק אלו הרשאות יש לכל assembly התוכנית יכולה להתחיל לרוץ. קוד כלשהוא יכול לדרוש שמי שקורא לו יהיה בעל הרשאות כלשהן ולסרב לעבוד (כלומר, לזרוק exception) במידה ודרישות אלה לא מתקיימות. במאמר עתידי נראה בדיוק איך ניתן לכתוב את הדרישות הללו ואלו אפשרויות קיימות.
מדיניות האבטחה ב-CAS והוכחות
הזכרנו קודם את העובדה שכל assembly מקבל הרשאות שמתאימות לו. הדרך שבה ניתן לדעת אלו הרשאות מתאימות ל-assembly כלשהוא היא ע'י בדיקת מדיניות האבטחה שהוגדרה ואיתור התנאים שאותם מקיים ה-assembly. כאשר assembly מקיים תנאי מסויים, אזי ניתן להעניק לו את ההרשאות שקשורות באותו תנאי. לצורך כך, נדרש כל assembly להציג הוכחות (evidence) שישמשו את ה-CLR לבדיקת התנאים. 'הוכחה' כזו היא בעצם הצהרה של assembly לגבי זהותו ומקורו. הוכחות לזהות ה-assembly עשויות לכלול strong name (חתימה דיגיטלית) או hash קריפטוגרפי, והוכחות למקור ה-assembly עשויות לכלול publisher (לשימוש עם טכנולוגית Microsoft Authenticode), את ה-zone (מחשב מקומי, אינטרא-נט, אינטרנט) ו/או את המיקום (בצורת URL או מסלול) ממנו מגיע ה-assembly. ככל שיש יותר הוכחות כאלה וככל שההוכחות חזקות יותר ניתן לסמוך על ה-assembly יותר ובהתאם לתת לו הרשאות רבות יותר – לדוגמא, ניתן בקלות לזייף אתר או מסלול בקלות יחסית בעוד שהרבה יותר קשה לזייף את החתימה ב-strong name.
כעת, לאחר שהבנו את מושג ההוכחה, ניתן להגדיר את מדיניות האבטחה באופן פשוט בתור מיפוי של הוכחה לקבוצת הרשאות (permission set). או במילים פשוטות – אם הוכחת שאתה מקיים את תנאים X ו-Y, תוכל לקבל קבוצת הרשאות שהוגדרה עבור תנאים אלו. אם נפתח את כלי הקונפיגורציה שהוזכר לעיל, נוכל לראות 3 רמות של מדיניות אבטחה: Enterprise (לרמת הארגון), Machine (לרמת המכונה הבודדת על כל משתמשיה) ו-User (לרמת המשתמש הבודד). תחת כל אחד מאלה נוכל לראות אוסף של permission sets. בהקלקה על אחד האיברים באוסף ובחירת ‘View Permissions’ אפשר לראות את ההרשאות השונות, ולצלול לפרטים השונים שלהם.
שיוך הוכחות להרשאות ומושג ה-Code Group
השאלה הבאה שנשאלת היא כמובן איך מתבצע המיפוי בין ההוכחות לקבוצת ההרשאות. לצורך כך קיימים code groups. באופן פשוט, code group מורכב מתנאי חברות (membership condition) ומקבוצת ההרשאות שכבר ראינו. אם ה-assembly מקיים את תנאי החברות ב-code group – כלומר, מציג את ההוכחות הנדרשות בתנאי החברות – אזי הוא מקבל את ההרשאות שמשויכות לאותו code group.
כפי שניתן לראות בכלי הקונפיגורציה (תחת מדיניות ה-machine), מדיניות האבטחה היא בעצם עץ של code groups: במקרה ש-assembly כלשהוא מקיים את תנאי החברות ב-code group שהוא צומת פנימי בעץ, אז בודקים גם את ה-code groups שהם הילדים של אותו עץ. למשל, אם assembly כלשהוא עונה לתנאי החברות של ה-code group בשם ‘all code’, אז בודקים גם את כל הילדים: My_Computer_Zone, LocalIntranet_Zone וכך הלאה, עד Trusted_Zone. אם ה-assembly עונה לתנאי החברות של My_Computer_Zone אז בודקים גם את הילדים שלו: Microsoft_Strong_Name ו-ECMA_Strong_Name. קבוצת ההרשאות הסופית שמתקבלת היא איחוד של כל ההרשאות שנובעות מכל ה-code groups שה-assembly עונה להם. למשל, אם ה-assembly ענה לתנאי החברות של Microsoft_Strong_Name, אז הוא מקבל את איחוד ההרשאות של Microsoft_Strong_Name, My_Computer_Zone (האבא הישיר) ו-All_Code (הסבא).
אם נסתכל ב-code group של Microsoft_Strong_Name (קליק ימני ובחירת ‘properties’ נראה שההוכחה הנדרשת היא strong name (קשה לזיוף) והגמול לסוג כזה של הוכחה הוא קבוצת ההרשאות FullTrust (כלומר, כל ההרשאות). באופן דומה, אם נסתכל על My_Computer_Zone, נראה שההוכחה הנדרשת היא zone של המחשב המקומי (כלומר, התוכנית רצה ממסלול שיושב במחשב המקומי). גם כאן, קבוצת ההרשאות היא FullTrust והתוכנית רשאית לעשות הכל. מנגד, אם נסתכל על ה-code group של LocalIntranet_Zone נראה שתנאי החברות הוא zone של האינטרא-נט המקומי אבל כאן קבוצת ההרשאות היא מצומצמת יותר – רק LocalIntranet. תוכנית כזו לא תוכל למשל לגשת ל-registry.
סדר בדיקת ה-code groups הוא מלמעלה-למטה: כלומר, קודם בודקים האם ה-assembly מגיע מהמחשב המקומי, אח'כ האם הוא מגיע מהרשת המקומית, וכך הלאה.
רמות מדיניות
כפי שניתן לראות בכלי, קיימות שלוש רמות של מדיניות אבטחה, שכבר מנינו: Enterprise, Machine ו-User. באמצעות רמת ה-Enterprise יכול מנהל הרשת לקבוע מדיניות אבטחה כלל-ארגונית שחלה על כל המחשבים בארגון. רמת ה-Machine מיועדת למדיניות שחלה על המכונה המקומית ותקפה לכל המשתמשים בה. לבסוף, ישנה מדיניות ה-User שכל משתמש יכול לקבוע לעצמו. המדיניות הסופית, זו שבה יעשה שימוש ה-CAS, היא חיתוך של כל הרמות. כלומר, אם מנהל הרשת קבע מדיניות ברמת ה-Enterprise שמרשה קריאת קבצים רק ל-assemblies בעלי strong name והמשתמש קבע מדיניות שבה כל ה-assemblies יכולים לקרוא קבצים, הרי שהתוצאה הסופית תהיה החיתוך בין הרמות, קרי, קריאה רק עבור strong-names assemblies.
קיימת רמת מדיניות רביעית שאיננה זמינה בכלי הקונפיגורציה. זוהי רמת מדיניות שחלה על AppDomains בודדים. בעת יצירה של AppDomain חדש ניתן להגדיר את המדיניות שתהיה פעילה בו. יש לשים לב שמדיניות ב-AppDomain ניתנת להגדרה פעם אחת בלבד, בעת יצירתו.
כלים להגדרת מדיניות אבטחה
כפי שראינו, תוסף הקונפיגורציה של ה-Framework מאפשר הגדרה של קבוצות הרשאה ושיוכן להירארכיית code groups. יש לשים לב שהחל מגרסא 2.0, הכלי הגרפי נמצא רק בסביבת הפיתוח של ה-Framework. כאשר אנחנו עובדים על מחשב שעליו מותקנת רק סביבת הריצה, יש להשתמש בכלי המקביל בשורת הפקודה שנקרא caspol.exe.
דוגמאות לשימוש ב-caspol:
הצגת כל ה-code groups ו-permission sets:
caspol –l
הצגת כל ה-code groups ברמת ה-:user
caspol –u –lg
הצגת כל ה-permission sets ברמת ה-machine:
caspol –m –lp
עדכון ה-permission set של ה-code group בשם TestGroup:
caspol –cg TestGroup FullTrust
הצגת כל ה-code groups עבור assembly כלשהוא:
caspol –rsg MyAssembly
הצגת כל ההרשאות עבור assembly כלשהוא:
caspol –rsp MyAssembly
איפוס מדיניות האבטחה לברירת המחדל:
caspol -reset
סיכום חלק ראשון
בחלק זה ראינו כיצד מגדירים מדיניות אבטחה עבור assemblies שונים בסביבת ה-.Net. הגדרת מדיניות האבטחה על רמותיה השונות היא הבסיס לשימוש נכון ב-Code Access Security. בחלקים הבאים נראה כיצד כותבים קוד בעל דרישות אבטחה.
|