הצפנה ב-MySQL: שימוש במפתח הראשי

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

הצפנה ב-MySQL: שימוש במפתח הראשי

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

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

הצפנה ב-MySQL: שימוש במפתח הראשי

המפתח הראשי ממוקם במחזיק המפתחות, ומפתחות ה- tablespace נמצאים בכותרות ה- tablespace המוצפנות (בעמוד 0 של ה- tablespace). 

בתמונה למעלה:

  • טבלה א' מוצפנת עם מפתח 1 (מפתח 1). מפתח 1 מוצפן באמצעות מפתח הראשי ומאוחסן מוצפן בכותרת של טבלה א'.

  • טבלה ב' מוצפנת עם מפתח 2. מפתח 2 מוצפן באמצעות מפתח המאסטר (מפתח מסיכה) ומאוחסן מוצפן בכותרת של טבלה ב'.

  • וכן הלאה.

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

InnoDB

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

ב-InnoDB, ההצפנה פועלת רק ברמת השולחן. וכברירת מחדל, כל הטבלאות נוצרות במרחבי טבלאות נפרדים (מרחב השולחן של קובץ לכל שולחן). במילים אחרות, נוצר מרחב טבלאות שיכול להכיל רק טבלה אחת. למרות שאתה יכול ליצור טבלאות גם במרחב השולחן הראשי (שטח שולחן כללי). אבל בכל מקרה, השולחן תמיד ממוקם בחלל שולחן כלשהו. ומכיוון שההצפנה מתבצעת ברמת מרחב השולחן, היא מוצפנת לחלוטין או שלא. כלומר, אי אפשר להצפין רק חלק מהטבלאות בחלל הטבלה הראשי. 

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

לפני שנמשיך, עלינו להסתכל על המבנה של מזהה מפתח הראשי. הוא מורכב מ-UUID, KEYמזהה וקידומת "INNODBKey". זה נראה כך: INNODBKey-UUID-KEYתעודת זהות.

UUID הוא ה-uuid של השרת עם מרחב הטבלה המוצפן. מַפְתֵחַתעודת זהות היא פשוט ערך הולך וגדל. בעת יצירת מפתח הראשי KEY בפעם הראשונההמזהה הוא 1. במהלך סיבוב מפתח, כאשר נוצר מפתח ראשי חדש, KEYמזהה = 2 וכן הלאה. נדבר יותר על סיבוב מפתח ראשי במאמרים הבאים בסדרה זו.

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

הצפנה ב-MySQL: שימוש במפתח הראשי

KEY ID הוא KEYמזהה ממזהה מפתח הראשי שכבר דנו בו. UUID הוא ה-uuid של השרת, המשמש גם במזהה מפתח הראשי. TABLESPACE KEY - מפתח מרחב טבלה, המורכב מ-256 סיביות שנוצרו באופן אקראי על ידי השרת. וקטור האתחול (IV) מורכב גם מ-256 סיביות שנוצרו באופן אקראי (אם כי זה צריך להיות 128 סיביות). IV משמש לאתחול הצפנה ופענוח AES (מתוך 256 סיביות, רק 128 משמשים). בסוף יש סכום ביקורת CRC32 עבור TABLESPACE KEY ו-IV.

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

מדוע יש צורך ב-CRC32?

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

אפשר לשאול: באיזה שלב מתבצע אימות המפתח? התשובה היא מתי השרת מתחיל. שרת עם טבלאות/מרחבי טבלאות מוצפנים קורא UUID, KEY בעת ההפעלהמזהה מהכותרת ומייצר את מזהה מפתח הראשי. לאחר מכן הוא משיג את מפתח המאסטר הנדרש ממחזיק המפתחות, מפענח את מפתח ה- tablespace ומאמת את סכום הבדיקה. שוב, אם סכום הבדיקה תואם, אז הכל בסדר, אם לא, שטח הטבלה מסומן כחסר.

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

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

עם זאת, להצפנת מפתח ראשי יש חסרון אחד גדול: ברגע שמרחב שולחן מוצפן עם tablespace_key, הוא תמיד נשאר מוצפן עם אותו מפתח. סיבוב המפתח הראשי לא עוזר כאן. למה זה חיסרון? אנו יודעים שב-MySQL יש באגים שיכולים להוביל לקריסה פתאומית וליצירת קובץ ליבה. מכיוון שקובץ הליבה מכיל dump של זיכרון שרת, יכול לקרות שה-dump מכיל את מפתח ה- tablespace המפוענח. כדי להחמיר את המצב, מפתחות השולחן המפוענחים מאוחסנים בזיכרון, שניתן להחליף לדיסק. אתה יכול לומר שזה לא חיסרון מכיוון שאתה צריך זכויות שורש כדי לגשת לקבצים האלה ולמחיצת ההחלפה. כן. אבל שורש נחוץ רק לזמן מה. ברגע שלמישהו יש גישה למפתח ה- tablespace המפוענח, הוא/היא יכולים להמשיך להשתמש בו כדי לפענח נתונים, אפילו ללא הרשאות שורש. בנוסף, ניתן לגנוב את הדיסק, וניתן לקרוא את קבצי המחיצה/הליבה להחלפה באמצעות כלים של צד שלישי. המטרה של TDE היא להפוך אותו לבלתי קריא גם אם הדיסק נגנב. IN שרת Percona עבור MySQL אפשר להצפין מחדש את שטח הטבלה בעזרת מפתחות חדשים שנוצרו. תכונה זו נקראת שרשורי הצפנה והיא עדיין ניסיונית בזמן הכתיבה.

למידע נוסף על הקורס

קרא עוד:

מקור: www.habr.com

קנה אירוח אמין לאתרים עם הגנת DDoS, שרתי VPS VDS 🔥 קנה אחסון אתרים אמין עם הגנת DDoS, שרתי VPS VDS | ProHoster