הבלוג של גרי רשף

31/01/2011

עבודתי כל כך סודית שאני עצמי אינני יודע מה אני עושה

Filed under: Uncategorized — תגיות: , , , , , , — גרי רשף @ 21:54

סטיקר מלפני הרבה שנים שנזכרתי בו לאחר שקראתי את המאמר Understanding SQL Server 2008 R2 Fixed Database Level Roles של Satnam Singh, שהוא מסוג המאמרים הטכניים שאני אוהב לקרוא ומשתדל לכתוב: הכל מוסבר בפרוטרוט בצירוף צילום מסכים, בהנחה שהקורא (כלומר- אני) אינו חכם במיוחד; או אם להיות יותר רציניים- אני משתדל לכתוב כך שזה מה שהייתי רוצה לקרוא לפני שהתעמקתי בנושא וכשלא שלטתי בחומר.

המאמר מציין שניתן לתת ל-User (ברמת הדטבייס) הרשאות קריאה בלבד DB_DataReader, או לחילופין הרשאות כתיבה בלבד – DB_DataWriter (קצת מזכיר את הבדיחה על שני השוטרים- זה שקורא וזה שכותב); ובמקרה השני המשתמש יכול להכניס נתונים לטבלאות, אך לא לקרוא מתוכן. קצת משונה, אבל מי יודע? יש עת לכל דבר וזמן לכל חפץ: הנה, באחת ההרצאות של ISUG, שמעתי את הטענה של-DBA-ים צריך לתת הרשאות מלאות על הסכימה, אך ללא יכולת לקרוא את הנתונים שיכולים להיות סודיים.. הגיוני אבל נשמע לא כל כך מעשי.

בכל מקרה: ניסיתי לבדוק את הגבולות והעמידות של הרשאות ה-DB_DataWriter ומתברר שזה אמיתי וזה עובד.

ניצור Login + User עם הרשאות DB_DataWriter,

וכן שתי טבלאות- אחת עם נתונים אותם יש לנסות ולקרוא, ואחת ריקה שלתוכה יש להכניס נתונים:

USE tempdb;

Go


Create Login DWL With Password='1234';

Go


Create User DWU for LOGIN DWL;

Go


Exec SP_AddroleMember 'DB_DataWriter',DWU;

Go


Create Table Tbl1(I Int, S Varchar(50));

Go


Insert Into Tbl1 Values(1,'A');

Insert Into Tbl1 Values(2,'B');

Insert Into Tbl1 Values(3,'C');

Go


Create Table Tbl2(S Varchar(50));

Go

וכעת ננסה לבצע פעולות שונות תחת הזהות של DWU:

Execute As User='DWU';

Go


Select * From Tbl1;

Go


Select * From sys.objects;

Go


Select * From sys.columns Where object_Name(Object_id)='Tbl1';

Go


Insert Into TBL2 Select '1';

Go


Insert Into TBL2 Select Cast(I As Varchar)+','+S From Tbl1;

Go


Insert Into TBL2 Select '1' Where Exists (Select * From Tbl1);

Go


Update TBL1

Set I=10*I;

Go


Delete From Tbl1 Output deleted.*;

Go


Delete From Tbl1;

Go


Revert;

Go

clip_image002

(הערה- אני הרצתי את הקוד בדטבייס בשם MyDB ולא ב-tempdb, אך זה לא משנה)

1. פקודת ה-Select נכשלה בשל היעדר הרשאות.

2. פקודת Select מטבלת מערכת דווקא מצליחה: די הגיוני לאור העובדה שלא מדובר בנתונים אלא באובייקטים שלמשתמש DWU יש הרשאה להכניס לתוכם נתונים.

3. כנ"ל: ניתן לקרוא מטבלאות המערכת גם את המבנה של הטבלאות (כלומר- שמות העמודות בטבלה הראשונה).

4. ניתן להכניס נתונים לטבלה השניה.

5. לא ניתן להעביר נתונים מהטבלה הראשונה לשניה על ידי Insert + Select, למרות שפעולה זו אינה מאפשרת לראות את הנתונים באופן ישיר.

6. גם פעולה שרק בודקת מה יש בטבלה הראשונה (על ידי Exist) נכשלת.

7. פעולת Update נכשלת- יש הרשאות רק ל-Insert!

8. פעולת Delete בצירוף האופרטור Output המאפשר צפייה בנתונים ללא שימוש ב-Select מפורש – אסורה (גם אם הנתונים מופנים לטבלה אחרת ולא למסך).

9. פעולת Delete ללא התחכמויות – מותרת.

לסיכום: מותר לבצע Insert & Delete, מבלי לצפות בנתונים בשום דרך (כלומר- הנתונים חייבים להיות חדשים ולא ממוחזרים..);

ויש ב-SQL Server תשתית המאפשרת להגדיר משתמשים בעלי הרשאות נדיבות שאינן כוללות צפיה בנתונים (למשל- משתמש עם הרשאות dbo המשוייך ל-DB_DenyReader ולכן לא יכול לקרוא כלל מהטבלאות). אני משער שכך לא ניתן לפתח, אלא רק לטפל בסביבת ה-Production.

לסיום- ננקה את כל מה שעשינו:

Drop User DWU;

Drop Login DWL;

Drop Table Tbl1;

Drop Table Tbl2;

Go

מודעות פרסומת

להגיב »

עדיין אין תגובות.

RSS feed for comments on this post. TrackBack URI

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

יצירה של אתר חינמי או בלוג ב־WordPress.com.

%d בלוגרים אהבו את זה: