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

31/01/2011

סטיקר מלפני הרבה שנים שנזכרתי בו לאחר שקראתי את המאמר 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

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

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