מבוא ל- Java SecurityManager

ג'אווה טופ

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

1. סקירה כללית

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

2. מנהל אבטחה בִּפְעוּלָה

זו אולי הפתעה, אבל בְּרִירַת מֶחדָל מנהל אבטחה הגדרות לא מאפשרותפעולות סטנדרטיות רבות:

System.setSecurityManager (SecurityManager חדש ()); כתובת אתר חדשה ("// www.google.com"). openConnection (). connect ();

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

אז נקבל את החריג הבא:

java.security.AccessControlException: גישה נדחתה ("java.net.SocketPermission" "www.google.com:80" "התחבר, פתור")

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

3. שימוש במקרה

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

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

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

4. עיצוב

4.1. מנהל אבטחה

אחד המרכיבים העיקריים בתשתית האבטחה המובנית הוא java.lang SecurityManager. יש בו כמה checkXxx שיטות כמו checkConnect, אשר אישר את הניסיון שלנו להתחבר לגוגל במבחן לעיל. כל הנציגים ל checkPermission (java.security.Permission) שיטה.

4.2. רְשׁוּת

java.security.Permission מקרים מייצגים בקשות הרשאה. שיעורי JDK רגילים יוצרים אותם לכל הפעולות שעלולות להיות מסוכנות (כמו קריאה / כתיבת קובץ, פתיחת שקע וכו ') ומעבירים אותם ל מנהל אבטחה לאישור מתאים.

4.3. תְצוּרָה

אנו מגדירים הרשאות בתבנית מדיניות מיוחדת. הרשאות אלה לובשות צורה של מענק ערכים:

הענק codeBase "file: $ {{java.ext.dirs}} / *" {הרשאה java.security.AllPermission; };

ה codeBase הכלל שלמעלה הוא אופציונלי. אנחנו לא יכולים לציין שום שדה שם או להשתמש בו נחתם על ידי (משולב בתעודות המתאימות בחנות המפתחות) או קֶרֶן (java.security.Principal מחובר לשרשור הנוכחי באמצעות javax.security.auth.Subject). אנו יכולים להשתמש בכל שילוב של כללים אלה.

כברירת מחדל, ה- JVM טוען את קובץ מדיניות המערכת הנפוץ הממוקם ב <java.home> /lib/security/java.policy. אם הגדרנו מדיניות מקומית כלשהי של משתמשים ב- /.java.policy, ה- JVM מצרף אותו למדיניות המערכת.

אפשר גם לציין קובץ מדיניות באמצעות שורת פקודה: -Djava.security.policy = / קובץ המדיניות שלי. בדרך זו אנו יכולים לצרף מדיניות למדיניות המערכת והמשתמשים שהוטענו.

יש תחביר מיוחד להחלפת כל מדיניות המערכת והמשתמשים (אם בכלל) - סימן כפול שווה: -Djava.security.policy == / my / file-file

5. דוגמא

בואו נגדיר הרשאה מותאמת אישית:

מחלקה ציבורית CustomPermission מרחיב את BasicPermission {public CustomPermission (שם מחרוזת) {סופר (שם); } PublicPermission ציבורי (שם מחרוזת, פעולות מחרוזת) {super (שם, פעולות); }}

ושירות משותף שיש להגן עליו:

שירות בכיתה ציבורית {גמר סטטי ציבורי מחרוזת OPERATION = "הפעולה שלי"; פעולת חלל ציבורית () {SecurityManager securityManager = System.getSecurityManager (); אם (securityManager! = null) {securityManager.checkPermission (CustomPermission חדש (OPERATION)); } System.out.println ("הפעולה מבוצעת"); }}

אם ננסה להריץ אותו עם מנהל אבטחה מופעל, יוצא מהכלל חריג:

java.security.AccessControlException: גישה נדחתה ("com.baeldung.security.manager.CustomPermission" "my-operation") ב- java.security.AccessControlContext.checkPermission (AccessControlContext.java:472) ב java.security.AccessController. AccessController.java:884) ב- java.lang.SecurityManager.checkPermission (SecurityManager.java:549) ב com.baeldung.security.manager.Service.operation (Service.java:10)

אנחנו יכולים ליצור את שלנו /.java.policy קובץ עם התוכן הבא ונסה להפעיל מחדש את היישום:

הענק codeBase "file:" {הרשאות com.baeldung.security.manager.CustomPermission "הפעולה שלי"; };

זה עובד בסדר גמור עכשיו.

6. מסקנה

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

כרגיל, קוד המקור השלם למאמר זה זמין באתר GitHub.

תחתית Java

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

$config[zx-auto] not found$config[zx-overlay] not found