היסודות של אבטחת Java

ג'אווה טופ

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

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

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

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

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

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

2. תכונות שפה

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

  • הקלדת נתונים סטטיים: Java היא שפה שהוקלדה באופן סטטי, אשר מצמצם את האפשרויות לזיהוי זמן ריצה של שגיאות הקשורות לסוג
  • משתני גישה: Java מאפשרת לנו להשתמש משתני גישה שונים כמו ציבוריים ופרטיים כדי לשלוט בגישה לשדות, שיטות ושיעורים
  • ניהול זיכרון אוטומטי: ל- Java יש ניהול זיכרון מבוסס איסוף אשפה, שמשחרר מפתחים מניהול זה באופן ידני
  • אימות Bytecode: ג'אווה היא שפה מורכבת, מה שאומר שהיא ממירה קוד לפונקציה בייט-אגנוסטית של פלטפורמה, ו זמן ריצה מאמת כל קוד בתים שהוא טוען לצורך ביצוע

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

3. אדריכלות אבטחה בג'אווה

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

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

לדוגמא, חלק מהשירותים האופייניים א ספק עשויים ליישם הם:

  • אלגוריתמים קריפטוגרפיים (כגון DSA, RSA או SHA-256)
  • מתקני ייצור, המרה וניהול מפתחות (כגון למפתחות ספציפיים לאלגוריתם)

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

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

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

4. קריפטוגרפיה

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

4.1. קריפטוגרפיה של Java

אדריכלות הקריפטוגרפיה של Java (JCA) מספקת מסגרת לגישה וליישום פונקציות קריפטוגרפיות ב- Java, כולל:

  • חתימה דיגיטלית
  • מעכל הודעות
  • צופנים סימטריים ואסימטריים
  • קודי אימות הודעה
  • מחוללי מפתח ומפעלי מפתח

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

יתר על כן, Java כוללת ספקים מובנים עבור אלגוריתמי הצפנה נפוצים כמו RSA, DSA ו- AES, עד כמה שם. אנחנו יכולים השתמש באלגוריתמים אלה כדי להוסיף אבטחה לנתונים במנוחה, בשימוש או בתנועה.

4.2. קריפטוגרפיה בפועל

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

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

אז בואו נראה איך נוכל לעשות זאת ב- Java:

MessageDigest md = MessageDigest.getInstance ("SHA-1"); בתא [] hashedPassword = md.digest ("סיסמה" .getBytes ());

פה, MessageDigest הוא שירות הצפנה שאנחנו מעוניינים בו. אנחנו באמצעות השיטה getInstance() לבקש שירות זה מכל ספקי האבטחה הזמינים.

5. תשתיות מפתח ציבורי

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

5.1. תמיכה ב- PKI בג'אווה

לפלטפורמת Java יש ממשקי API המאפשרים יצירה, אחסון ואימות של אישורים דיגיטליים:

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

לג'אווה יש חנות אמון מובנית בשם "cacerts" המכיל אישורים עבור אישורי תעודה ידועים.

5.2. כלי Java עבור PKI

ל- Java יש כמה כלים שימושיים באמת כדי להקל על תקשורת מהימנה:

  • יש כלי מובנה בשם "keytool" ליצירה וניהול של חנות מפתחות וחנות אמון
  • יש גם כלי נוסף "jarsigner" שבו אנו יכולים להשתמש כדי לחתום ולאמת קבצי JAR

5.3. עבודה עם אישורים בג'אווה

בואו נראה כיצד נוכל לעבוד עם אישורים ב- Java כדי ליצור חיבור מאובטח באמצעות SSL. חיבור SSL מאומת הדורש מאיתנו לעשות שני דברים:

  • תעודה נוכחית - עלינו להציג אישור תקף לצד אחר בתקשורת. לשם כך עלינו לטעון את קובץ מאגר המפתחות, שם עלינו להחזיק את המפתחות הציבוריים שלנו:
KeyStore keyStore = KeyStore.getInstance (KeyStore.getDefaultType ()); char [] keyStorePassword = "changeit" .toCharArray (); נסה (InputStream keyStoreData = FileInputStream חדש ("keystore.jks")) {keyStore.load (keyStoreData, keyStorePassword); }
  • אמת אישור - עלינו לאמת גם את האישור שהוצג על ידי גורם אחר בתקשורת. לשם כך עלינו לטעון את חנות הנאמנות, שם אנו חייבים להיות אישורים מהימנים בעבר מגורמים אחרים:
KeyStore trustStore = KeyStore.getInstance (KeyStore.getDefaultType ()); // טען את חנות האמון ממערכת הקבצים כמו בעבר

לעיתים נדירות עלינו לעשות זאת באופן פרוגרמטי ובדרך כלל להעביר פרמטרי מערכת לג'אווה בזמן הריצה:

-Djavax.net.ssl.trustStore = truststore.jks -Djavax.net.ssl.keyStore = keystore.jks

6. אימות

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

6.1. אימות בג'אווה

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

בעוד ספקים מרובים מעמידים לרשותם את מודולי הכניסה שלהם, ל- Java יש כמה ברירת מחדל זמינים לשימוש:

  • Krb5LoginModule, לאימות מבוסס Kerberos
  • JndiLoginModule, לאימות מבוסס משתמש וסיסמה המגובים על ידי חנות LDAP
  • KeyStoreLoginModule, לאימות מבוסס-הצפנה

6.2. התחבר לפי דוגמה

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

מודול זה אחראי על קבלת שם המשתמש והסיסמה ממשתמש ואימותם מול שירות ספריות המוגדר ב- JNDI:

LoginContext loginContext = חדש LoginContext ("דוגמא", SampleCallbackHandler חדש ()); loginContext.login ();

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

בואו נסתכל על תצורת הכניסה שלנו:

לדוגמא נדרש {com.sun.security.auth.module.JndiLoginModule; };

די פשוט, זה מצביע על כך שאנחנו משתמשים JndiLoginModule כחובה LoginModule.

7. תקשורת מאובטחת

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

7.1. תמיכה בג'אווה לתקשורת מאובטחת

Java מספקת ממשקי API לאבטחת תקשורת רשת הצפנה, שלמות ההודעה, וגם אימות לקוח ושרת:

  • SSL / TLS: SSL ויורשו, TLS, מספקים אבטחה על פני תקשורת רשת לא מהימנה באמצעות הצפנת נתונים ותשתית מפתח ציבורי. Java מספקת תמיכה ב- SSL / TLS דרך SSLSocket מוגדר בחבילה “java.security.ssl“.
  • SASL: שכבת אימות ואבטחה פשוטה (SASL) הוא תקן לאימות בין לקוח לשרת. Java תומכת ב- SASL כחלק מהחבילה "java.security.sasl“.
  • GGS-API / Kerberos: Generic Security Service API (GSS-API) מציע גישה אחידה לשירותי אבטחה במגוון מנגנוני אבטחה כמו Kerberos v5. Java תומכת ב- GSS-API כחלק מהחבילה "java.security.jgss“.

7.2. תקשורת SSL בפעולה

בואו נראה כעת כיצד נוכל לפתוח חיבור מאובטח עם גורמים אחרים ב- Java באמצעות SSLSocket:

SocketFactory מפעל = SSLSocketFactory.getDefault (); נסה (Socket connection = factory.createSocket (host, port)) {BufferedReader input = new BufferedReader (InputStreamReader new (connection.getInputStream ())); return input.readLine (); }

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

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

8. בקרת גישה

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

8.1. בקרת גישה בג'אווה

אנו יכולים להשיג בקרת גישה בג'אווה באמצעות שיעורים מְדִינִיוּת ו רְשׁוּת מתווך באמצעות מנהל אבטחה מעמד. מנהל אבטחה הוא חלק מה"java.langהחבילה ואחראית על אכיפת בדיקות בקרת הגישה ב- Java.

כאשר מטען המחלקות טוען מחלקה בזמן הריצה, הוא מעניק אוטומטית כמה הרשאות ברירת מחדל למחלקה המצורפת ב- רְשׁוּת לְהִתְנַגֵד. מעבר להרשאות ברירת המחדל הללו, אנו יכולים להעניק מינוף רב יותר למחלקה באמצעות מדיניות אבטחה. אלה מיוצגים על ידי הכיתה מְדִינִיוּת.

במהלך רצף ביצוע הקוד, אם זמן הריצה נתקל בבקשה למשאב מוגן, מנהל אבטחה מאמת את המבוקש רְשׁוּת נגד המותקן מְדִינִיוּת דרך ערימת השיחות. כתוצאה מכך, הוא מעניק אישור או זורק ExceptionException.

8.2. כלי Java למדיניות

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

Java נשלחת עם "policytool", כלי עזר גרפי לחיבור קבצי מדיניות.

8.3. בקרת גישה באמצעות דוגמה

בואו נראה כיצד נוכל להגביל את הגישה למשאב כמו קובץ ב- Java:

SecurityManager securityManager = System.getSecurityManager (); אם (securityManager! = null) {securityManager.checkPermission (FilePermission חדש ("/ var / logs", "read")); }

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

אבל, מנהל אבטחה מאצלת בקשה זו ל AccessController. AccessController באופן פנימי עושה שימוש במותקן מְדִינִיוּת להגיע להחלטה.

בואו נראה דוגמה לקובץ המדיניות:

הענק {הרשאה java.security.FilePermission <>, "קרא"; };

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

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

-Djava.security.manager -Djava.security.policy = / path / to / sample.policy

9. חתימת XML

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

9.1. חתימת XML בג'אווה

Java API תומך ביצירת ואימות חתימות XML בהתאם להנחיות המומלצות. API XML Digital Signature API מוקף בחבילה “java.xml.crypto“.

החתימה עצמה היא רק מסמך XML. חתימות XML יכולות להיות משלושה סוגים:

  • מנותק: חתימה מסוג זה חורגת מהנתונים החיצוניים לאלמנט החתימה
  • עוטף: חתימה מסוג זה היא מעבר לנתונים הפנימיים לרכיב החתימה
  • עטוף: חתימה מסוג זה היא מעבר לנתונים המכילים את אלמנט החתימה עצמו

אין ספק שג'אווה תומכת ביצירה ובאימות של כל סוגי חתימות ה- XML ​​הנ"ל.

9.2. יצירת חתימת XML

כעת, נפשיל שרוולים וניצור חתימת XML לנתונים שלנו. למשל, אנו עשויים להעביר מסמך XML לרשת. לָכֵן, אנו רוצים שהנמען שלנו יוכל לאמת את תקינותו.

אז בואו נראה איך נוכל להשיג זאת בג'אווה:

XMLSignatureFactory xmlSignatureFactory = XMLSignatureFactory.getInstance ("DOM"); DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance (); documentBuilderFactory.setNamespaceAware (נכון); מסמך מסמך = documentBuilderFactory .newDocumentBuilder (). ניתוח (FileInputStream חדש ("data.xml")); DOMSignContext domSignContext = DOMSignContext חדש (keyEntry.getPrivateKey (), document.getDocumentElement ()); XMLSignature xmlSignature = xmlSignatureFactory.newXMLSignature (חתם אינפו, keyInfo); xmlSignature.sign (domSignContext);

לשם הבהרה, אנו יוצרים חתימת XML עבור הנתונים שלנו הקיימים בקובץ "Data.xml". בינתיים, יש לציין כמה דברים לגבי פיסת הקוד הזו:

  • קוֹדֶם כֹּל, XMLSignatureFactory הוא מחלקת המפעל ליצירת חתימות XML
  • XMLSigntaure דורש א SignedInfo אובייקט שעליו הוא מחשב את החתימה
  • XMLSigntaure גם צרכים KeyInfo, המקיף את מפתח החתימה ואת האישור
  • סוף כל סוף, XMLSignature חותם על המסמך באמצעות המפתח הפרטי המצורף כ- DOMSignContext

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

10. אבטחה מעבר לליבה ג'אווה

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

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

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

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

כמובן שאבטחת אביב מכוסה בהרחבה בסדרת הדרכות, וכן באופן מודרך, בקורס אבטחת לימוד אביב.

11. מסקנה

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

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

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

תחתית Java

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

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

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