content top
Dynamic Data Masking

Dynamic Data Masking

כלי חדש בגרסת V12 של Azure (כלומר- SQL Databases שהשרת שלהם שודרג לגרסת ההתנסות V12), שנועד לאפשר הסתרה חלקית של המידע.

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

קודם כל יש לאפשר את השימוש ב-DDM (הכלי הנ”ל)- בוחרים ב-(Dynamic Data Masking (Preview,
בצד ימין מאפשרים את השימוש בכלי (Enabled),
וניתן להחליט אם ה-Security Enabled Access (שיטת ההתחברות) בעזרת Connection String תהיה מחוייבת או אופציונלית (הכלי פועל רק בהתחברות בעזרת Connection String).
מתחת לזה ניתן לקבל את ה-Connection String המתאים ורק לשנות את המשתמש או הסיסמה או הדטבייס.

image

לפני שנתחיל להשתמש בכלי ניצור Login מתאים שידמה משתמש שאיננו האדמיניסטרטור וטבלה שאת המידע בה נסתיר בעזרת הכלי, ולשם כך נתחבר לדטבייס בעזרת ה-Connection String. נבחר ב-Options, בלשונית Additional Connection Parameters:

image

, ונעתיק לשם את ה-Connection String:

image

(מחקתי מצילומי המסך את שמות השרתים והאדמיניסטרטורים האמיתיים)
התחברנו בתור האדמיניסטרטורים של השרת. ב-Object Explorer נתחבר באופן דומה, אך נציין ב- connection String את דטבייס master כדי שנוכל לראות את כל האופציות העומדות לרשותנו בשרת.
כעת ניצור Login בשם גרי-

--Use master;

Create Login Geri With Password='123!@#abcDEF';

Go


--Use MyDB;

Create User Geri From Login Geri;

Go


Exec sp_addrolemember 'db_owner','Geri';

Go

הפקודה Use אינה פועלת ב-Azure (אא”כ אנחנו כבר בדטבייס המבוקש..) ויש לעבור על ידי כתיבת שם הדטבייס בקומבו המתאים בראש המסך.

כעת ניצור טבלה מטבלת המערכת sys.messages ונוסיף לה 2 עמודות טכניות רק כדי לראות כיצד המידע שב-message_id וב-text מוסתר:

If Object_ID('T_Messages','U') Is Not Null Drop Table T_Messages;


Select    *,

        message_id Col1,

        [text] Col2

Into    T_Messages

From    sys.messages;


Alter Table T_Messages Add Constraint PK_T_Messages Primary Key Clustered (message_id,language_id);

Go

וכעת נחזור למסך הניהול בפורטל Azure, ובעזרת אופציית Add Mask ניצור DDM לעמודות הטכניות השונות, נשמור הן את כל אחד מהקונפיגורציות, והן את החבילה כולה, וב-Privileged Logins נכתוב את זה איתו התחברנו (האדמיניסטרטור) כדי שהוא יוכל לראות את הנתונים המקוריים:

image

image

בראשון בחרנו שבמקום message_id יופיע מספר אקראי בין 1 ל-99,

ובשני בחרנו שבמקום ה-text יופיעו 2 האותיות משמאל, 5 שמימין, ובמקום כל מה שבאמצע – 5 כוכביות.

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

image

את הבדיקות לא ניתן לעשות בעזרת Execute As, ולכן נתחבר ב-Query (חלון) חדש עם השם והסיסמה של Geri (בעזרת Connection String כנ”ל), ונריץ משם את השליפה:

image

הפעם ניתן לראות שבעמודה Col2 מופיעים מספרים אקראיים בין 1 ל-99 (בכל הרצה נקבל מספרים אחרים), ובעמודה Col2 בתווים מוסתרים כפי שהוגדר.

אם נתחבר שלא בעזרת ה-Connection String:

image

(יש לציין שם שרת, סיסמה, ודרך Options את שם הדטבייס כי ל-master אין לו הרשאות)

הנתונים יופיעו ללא הסתרה.

אופצייה נוספת שמאפשרת דינמיות רבה היא שימוש ב-Mask By Alias. למשל:

image

(במקום Tx יופיע המספר 8)

וכעת משנשלוף מטבלה כלשהיא וניתן לעמודה את השם Tx, יופיע 8 במקום:

image

בדיקות תקינות Col1- השליפות הבאות יחזירו תוצאות נכונות לפי המידע האמיתי ולא לפי זה המוצג:

image

יחד עם זאת- יש בעייה כשמנסים לקבל את ה-Execution Plan וההרצה נופלת.

בדיקת תקינות Col2- עיינו בשליפות ובפלטים:

image

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

image

(הנתונים ל-Col1 & Col2 אמורים היו להישלף מהטבלה המקורית כשהם משובשים)

מחלות ילדות?

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

נכניס שורה, נשלוף אותה, ולבסוף נמחק:

image

מעניין: ה-Output מסתיר את הכל! (השליפה הראשונה והשליפה האחרונה)

ומה תאמרו על זה?

image

ההבדל בין שני ה-Insert-ים הוא השימוש ב-Alias Tx בשני, ובכל זאת- בשני המקרים המערכת מחזירה 0 במקום את הערך האמיתי בראשון ו-8 בשני.

ב-Delete היא מדייקת במקרה הראשון (8 בשל השימוש ב-Tx) אך מפספסת בשני.

האם מדובר בבעייה מקומית או שיטתית? התבוננו בזה:

image

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

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

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

כששולפים ישירות מהטבלאות הנ”ל משתבשות עמודות אחרות..

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

ולקינוח, בדיחה לאתגר את החבר’ה שאינם בעניינים כמונו (והמבין יבין):

image

הערות לסיום:

  1. לי קצת מפריע שב-Col2 המחרוזת ***** מחליפה את כל התווים שאינם גלויים, והייתי מעדיף שכל תו יוחלף בכוכבית אחת, כך שהמידע יוסתר אך תהיה אינדיקציה לגבי אורכו.
  2. כל ההגדרות מתבצעות כרגע דרך הפורטל ולא בעזרת TSQL.
  3. יש כנראה מספר באגים והתנהגויות מוזרות שציינתי בגוף הפוסט.

כתיבת תגובה

האימייל לא יוצג באתר. (*) שדות חובה מסומנים

two × two =