הנחיות Oracle לאבטחת MySQL
אמ;לק
מדריך מקיף מאורקל על איך לנהל חשבונות, הרשאות וחיבורים מאובטחים ל-MySQL. חיוני כדי למנוע פרצות שכיחות בניהול השרת.
סיכום בעברית: מערכת VibeSec · מדיניות המקורות
נוסף ל-VibeSec:
כותרת מקורית: MySQL Security Guidelines
>מדריך מקיף מאורקל על איך לנהל חשבונות, הרשאות וחיבורים מאובטחים ל-MySQL. חיוני כדי למנוע פרצות שכיחות בניהול השרת.
התוכן המלא בעברית
תרגום אוטומטי מהמקור; מונחים טכניים נשארו באנגלית. לנוסח המחייב — הכתבה המקורית.
8.1.1 הנחיות אבטחה
כל מי שמשתמש ב-MySQL במחשב המחובר ל-Internet צריך לקרוא את הסעיף הזה כדי למנוע את טעויות האבטחה הנפוצות ביותר.
בדיון על אבטחה, יש לתת את הדעת על הגנה מלאה על מארח השרת כולו (ולא רק על שרת ה-MySQL) מפני כל סוגי ההתקפות הרלוונטיות: האזנה, שינוי, השמעה (playback) ומניעת שירות. אנחנו לא מכסים כאן את כל היבטי הזמינות ועמידות בתקלות.
MySQL משתמש באבטחה מבוססת רשימות בקרת גישה (ACLs) עבור כל החיבורים, השאילתות ופעולות אחרות שמשתמשים עשויים לנסות לבצע. כמו כן, קיימת תמיכה בחיבורים מוצפני SSL בין לקוחות ושרתי MySQL. רבים מהמושגים הנידונים כאן אינם ספציפיים ל-MySQL כלל; אותם רעיונות כלליים חלים על כמעט כל היישומים.
בעת הפעלת MySQL, פעל לפי ההנחיות הבאות:
• לעולם אל תיתן לאף אחד (למעט חשבונות root של MySQL) גישה לטבלת המשתמשים (user table) במסד הנתונים של מערכת ה-mysql! זה קריטי.
• למד כיצד פועלת מערכת הרשאות הגישה של MySQL (ראה Section 8.2, "Access Control and Account Management"). השתמש בהצהרות GRANT ו-REVOKE כדי לשלוט בגישה ל-MySQL. אל תעניק הרשאות מעבר לנדרש. לעולם אל תעניק הרשאות לכל המארחים (all hosts). רשימת תיוג: נסה להריץ mysql -u root. אם אתה מסוגל להתחבר בהצלחה לשרת מבלי שהתבקשת להזין סיסמה, כל אחד יכול להתחבר לשרת ה-MySQL שלך בתור משתמש ה-root של MySQL עם הרשאות מלאות! עיין בהוראות ההתקנה של MySQL והקדש תשומת לב מיוחדת למידע על הגדרת סיסמת root. ראה Section 2.9.4, "Securing the Initial MySQL Account".
• השתמש בהצהרה SHOW GRANTS כדי לבדוק לאילו חשבונות יש גישה למה. לאחר מכן השתמש בהצהרה REVOKE כדי להסיר את ההרשאות שאינן נחוצות.
• אל תאחסן סיסמאות בטקסט גלוי (cleartext) במסד הנתונים שלך. אם המחשב שלך ייפרץ, הפורץ יוכל לקחת את הרשימה המלאה של הסיסמאות ולהשתמש בהן. במקום זאת, השתמש ב-SHA2() או בפונקציית גיבוב (hashing) חד-כיוונית אחרת ואחסן את ערך ה-hash. כדי למנוע שחזור סיסמה באמצעות טבלאות קשת (rainbow tables), אל תשתמש בפונקציות אלו על סיסמה פשוטה; במקום זאת, בחר מחרוזת כלשהי שתשמש כ-salt, והשתמש בערכי hash(hash(password)+salt).
• נניח שכל הסיסמאות יהיו חשופות לניסיונות פיצוח אוטומטיים באמצעות רשימות של סיסמאות ידועות, וגם לניחוש ממוקד באמצעות מידע זמין לציבור אודותיך, כגון פוסטים ברשתות חברתיות. אל תבחר סיסמאות המורכבות מפריטים שקל לפצח או לנחש, כגון מילה מהמילון, שם פרטי, שם קבוצת ספורט, ראשי תיבות או ביטוי ידוע, במיוחד אם הם רלוונטיים עבורך. השימוש באותיות גדולות, החלפות מספרים ותוספות ותווים מיוחדים לא עוזר אם נעשה בהם שימוש בדרכים צפויות. כמו כן, אל תבחר בסיסמה שראית בשימוש כדוגמה בשום מקום, או וריאציה עליה, גם אם היא הוצגה כדוגמה לסיסמה חזקה. במקום זאת, בחר סיסמאות ארוכות ובלתי צפויות ככל האפשר. זה לא אומר שהשילוב צריך להיות מחרוזת אקראית של תווים שקשה לזכור ולשחזר, אם כי זו גישה טובה אם יש לך, למשל, מנהל סיסמאות שיכול ליצור ולמלא סיסמאות כאלה ולאחסן אותן בצורה מאובטחת. קל ליצור, לזכור ולשחזר ביטוי סיסמה (passphrase) המכיל מילים מרובות, והוא הרבה יותר בטוח מסיסמה טיפוסית שנבחרה על ידי משתמש ומורכבת ממילה אחת ששונתה או מרצף תווים צפוי. כדי ליצור ביטוי סיסמה מאובטח, ודא שהמילים והפריטים האחרים שבו אינם ביטוי או ציטוט ידועים, אינם מופיעים בסדר צפוי, ורצוי שלא יהיה ביניהם שום קשר קודם.
• השקע בחומת אש (firewall). זה מגן עליך מלפחות 50% מכל סוגי הניצולים בכל תוכנה. מקם את MySQL מאחורי חומת האש או באזור מפורז (DMZ). רשימת תיוג: נסה לסרוק את היציאות (ports) שלך מה-Internet באמצעות כלי כגון nmap. MySQL משתמש ביציאה 3306 כברירת מחדל. יציאה זו לא אמורה להיות נגישה ממארחים לא מהימנים. כדרך פשוטה לבדוק אם יציאת ה-MySQL שלך פתוחה, נסה את הפקודה הבאה ממחשב מרוחק כלשהו, כאשר server_host הוא שם המארח או כתובת ה-IP של המארח שעליו פועל שרת ה-MySQL שלך: $> telnet server_host 3306 אם ה-telnet נתקע או שהחיבור נדחה, היציאה חסומה, וכך זה צריך להיות. אם אתה מקבל חיבור ותווים ג'יבריש, היציאה פתוחה ויש לסגור אותה בחומת האש או בנתב שלך, אלא אם כן יש לך סיבה טובה להשאיר אותה פתוחה.
• אפליקציות שניגשות ל-MySQL לא אמורות לסמוך על נתונים שהוזנו על ידי משתמשים, ויש לכתוב אותן באמצעות טכניקות תכנות הגנתיות מתאימות. ראה Section 8.1.7, "Client Programming Security Guidelines" .
• אל תשדר נתונים רגילים (לא מוצפנים) דרך Internet. מידע זה נגיש לכל מי שיש לו את הזמן והיכולת ליירט אותו ולהשתמש בו למטרותיו. במקום זאת, השתמש בפרוטוקול מוצפן כגון SSL או SSH. MySQL תומך בחיבורים פנימיים של SSL. טכניקה נוספת היא להשתמש בהעברת יציאות SSH כדי ליצור מנהרה מוצפנת (ודחוסה) עבור התקשורת.
• למד להשתמש בכלי השירות tcpdump ו-strings. ברוב המקרים, אתה יכול לבדוק אם זרמי הנתונים של MySQL אינם מוצפנים על ידי הרצת פקודה כמו הבאה: $> tcpdump -l -i eth0 -w - src or dst port 3306 | strings זה עובד תחת Linux וצריך לעבוד עם שינויים קלים במערכות אחרות. אזהרה: אם אינך רואה נתונים בטקסט גלוי, זה לא תמיד אומר שהמידע אכן מוצפן. אם אתה זקוק לאבטחה גבוהה, התייעץ עם מומחה אבטחה.
קריאה וכלים קשורים
אבטחת MySQL / MariaDB- MariaDB Audit Plugin — תוסף ביקורת קהילתי לרישום חיבורים, שאילתות ופעילות במסד הנתונים.
- MySQL Enterprise Audit — ביקורת חיבורים ושאילתות וסינון אירועים; דורש MySQL Enterprise Edition מסחרי.
- Percona Toolkit pt-show-grants — הפקה, מיון והשוואת הרשאות MySQL לצורך סקירה ובקרת שינויים.
- הקשחה ראשונית של MySQL
- מדריך אבטחה רשמי ל-MariaDB
- מניעת הזרקת SQL בשרתי SQL Server