13 כללים לפיתוח יישומי Java מאובטחים

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

החדשות הטובות הן שג'אווה היא פלטפורמת פיתוח ותיקה עם תכונות אבטחה מובנות רבות. חבילת האבטחה של Java עברה בדיקות קרב אינטנסיביות, והיא מתעדכנת לעתים קרובות עבור נקודות תורפה חדשות. ממשק ה- API החדש יותר של Java EE Security, שפורסם בספטמבר 2017, מטפל בפגיעויות בארכיטקטורות בענן ובמיקרו-שירותים. המערכת האקולוגית של Java כוללת גם מגוון רחב של כלים לפרופיל ודיווח על בעיות אבטחה. 

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

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

כלל אבטחה של Java מספר 1: כתוב קוד Java נקי וחזק

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

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

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

כלל אבטחה של Java מספר 2: הימנע מסידור

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

סוף סדרת Java

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

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

כלל אבטחה של Java מס '3: לעולם אל תחשוף אישורים לא מוצפנים או PII

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

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

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

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

קפיצה למטה לכלל מס '4: השתמש תמיד בספריה להצפנה; אל תגלגל בעצמך.

כלל אבטחה של Java מספר 4: השתמש בספריות ידועות ונבדקות

תסתכל על השאלה והתשובה הזו לגבי גלגול אלגוריתם אבטחה משלך. השיעור tl; dr הוא: השתמש בספריות ומסגרות ידועות ואמינות במידת האפשר. זה חל על כל הספקטרום, החל מגיבוב סיסמאות וכלה באישור REST API.

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

האינסטינקט הראשון שלך בהתמודדות עם אבטחה צריך להיות מחקר שלך. חקרו שיטות עבודה מומלצות ואז חקרו איזו ספרייה תיישם עבורכם שיטות עבודה אלו. למשל, אם אתה מסתכל על שימוש ב- JSON Web Tokens לניהול אימות והרשאה, עיין בספריית Java שמקיפה את JWT, ואז למד כיצד לשלב את זה באבטחת Spring.

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

כלל אבטחה ג'אווה מס '5: היו פרנואידים בנוגע לקלט חיצוני

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

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

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

מופע מיוחד וידוע הוא הזרקת SQL, המכוסה בכלל הבא.

כלל אבטחה של Java מספר 6: השתמש תמיד בהצהרות מוכנות לטיפול בפרמטרים של SQL

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

בידיעה זו, נוהג להשתמש תמיד בשיעור java.sql.PreparedStatement ליצירת SQL. מתקנים דומים קיימים עבור חנויות NoSQL כמו MongoDB. אם אתה משתמש בשכבת ORM, היישום ישתמש ב- PreparedStatements בשבילך מתחת למכסה המנוע.

כלל אבטחה של Java מספר 7: אל תחשוף יישום באמצעות הודעות שגיאה

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

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

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

כלל אבטחה של Java מספר 8: עדכן את מהדורות האבטחה

החל משנת 2019, אורקל יישמה תוכנית רישוי חדשה ולוח זמנים לשחרור Java. למרבה הצער למפתחים, קצב המהדורה החדש אינו מקל על העניינים. עם זאת, אתה אחראי לבדוק לעתים קרובות אם קיימים עדכוני אבטחה והחלתם על JRE ו- JDK שלך.

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

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

האם אתה זקוק לכל תיקון אבטחה?

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

כלל אבטחה של Java מס '9: חפש פגיעויות תלותיות

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

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

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

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

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

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

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

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

כלל אבטחה של Java מספר 11: היזהר מהתקפות מניעת שירות (DoS)

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

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

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

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

כלל אבטחה של Java מס '12: שקול להשתמש במנהל האבטחה של Java

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

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

כלל אבטחה של Java מס '13: שקול להשתמש בשירות אימות ענן חיצוני

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

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

סיכום

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

להלן שלושה משאבים טובים ברמה גבוהה כדי להתעדכן בנוף האבטחה המשתנה של Java.

  • OWASP 10 הראשונים
  • CWE המובילים 25
  • הנחיות הקוד המאובטח של אורקל

סיפור זה, "שלוש עשרה כללים לפיתוח יישומי Java מאובטחים" פורסם במקור על ידי JavaWorld.