מידור הרשאות עבור משתמשים במסד הנתונים

כחלק מההתגוננות מפני פריצות חשוב מאוד לדאוג למידור הרשאות. גם במידה והאתר שלכם הוא האתר הכי פריץ בעולם, אם המשתמש שמריץ את השאילתות במסד הנתונים שלכם ממודר, אתם יכולים להיות קצת יותר רגועים. ולמה? כי גם אם מישהו יצליח לנצל את הפרצות באתר שלכם לצורך הרצה של קוד זדוני, הוא לא יוכל לעשות פעולות חמורות במיוחד, שיגרמו לנזק ממשי, כמו מחיקה של נתונים. עם זאת, הוא עדיין יוכל להעמיס על השרת ואף להפיל את ה-DB במקרים קיצוניים, כך שאין להסתמך רק על כך.

פקודות בעלות פוטנציאל הרס גדול

DROP TABLE table;
TRUNCATE TABLE table;
DELETE FROM table;

מה ההבדלים בין הפעולות?

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

בעוד הפקודות Drop ו- Truncate פועלות ברמת טבלה, Delete פועלת ברמת השורה. הפקודה Drop מוחקת טבלה לאלתר (גם את הטבלה עצמה וגם את הערכים שבה), Truncate מוחקת את כל הערכים שבטבלה (אך לא את הטבלה עצמה), ו-Delete נועדה למחוק שורות שעומדות בתנאי WHERE כלשהו, אבל תמחק את כל השורות במידה ולא יצוין תנאי כזה. שימו לב שבעת ביצוע Truncate נאבד גם מידע על מונים, בעוד במחיקה של שורות בעזרת פקודת Delete לא נאבד זאת.

בנוסף, Drop ו- Truncate הן פקודות Data Definition Language (פקודות DDL) ופקודות אלה הן פקודות Autocommit. לעומתן, הפקודה DELETE היא פקודת Data Manipulation Language (פקודות DML). כלומר, ניתן לבצע חזרה לאחור (Roll Back) למצב הטבלה לאחר פקודת Delete, בעוד שלאחר הקשת הפקודות Drop ו-Truncate מתבצע Commit אוטומטי ולכן לא ניתן לחזור אחורה*.

אז כיצד ממדרים את המשתמש?

תמיד חשוב לזכור שאין להריץ אף פעם את האתר בעזרת משתמש עם הרשאות מלאות. זה קורה המון, וזה מוות ידוע מראש שניתן היה למנוע.

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

ניצור משתמש חדש ב-Database כך:

CREATE USER 'site' IDENTIFIED BY 'password';

ניצור תפקיד viewer שירכז את ההרשאות שיינתנו לכל משתמש לקריאה בלבד:

CREATE ROLE 'viewer' IDENTIFIED BY 'password';

הרשאות אך ורק על טבלאות התוכן של האתר, אליהן הוא התפקיד צריך לקבל, בצורה הזו:

GRANT 'access' -- select, execute, all ...
ON 'object_name' -- Table name
TO 'viewer'; -- Role name 

על מנת להסיר לתפקיד הרשאה, נשתמש בפקודה REVOKE:

REVOKE 'access' -- drop, select, execute, all...
ON 'table_name' -- any table
TO 'viewer'; 

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

ALTER TABLE 'table_name'
OWNER TO 'new_owner'

וניתן את התפקיד למשתמש שיצרנו:

GRANT 'viewer' TO 'site' -- Grant the role we created to the user

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

האותיות הקטנות: 

* החל מגרסא 10g מסד הנתונים של Oracle בנוי בארכיטקטורת Flashback. טכנולוגיית Flashback שומרת נקודות זמן שנוצרות לאחר סיום של כל טרנזקציה ומאפשרת לשלוף מידע מנקודת זמן קודמת, לראות את כל השינויים שנעשו בשורות מסוימות בין שתי נקודות זמן וכן לחזור אחורה לנקודות קודמות, על מנת לשחזר טבלאות ו-Indexים מטעויות אנוש או כשלים לוגיים, כמו Drop לא רצוי.

על מנת לשפעל Flashback עליכם להקיש בזמן מצב Archive Log:

ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=2880;
ALTER DATABASE FLASHBACK ON

וכדי לבצע את השחזור עצמו:

FLASHBACK TABLE table TO BEFORE DROP [RENAME TO new_name]
-- or
FLASHBACK DATABASE TO TIMESTAMP(SYSDATE-1/24);

תגובה אחת ל “מידור הרשאות עבור משתמשים במסד הנתונים”

  1. […] חסכו בהרשאות למשתמש שמבצע את השאילתות באתר. צרו משתמש חדש במסד עבור הצגת האתר ותנו לו הרשאות קריאה בלבד על טבלאות ספציפיות מהמסד. שימו לב שניתן להגדיר עבור משתמש הרשאות ספציפיות ושהמשתמש הזה לא נועד להיות מנהל מערכת, כך שאין שום צורך שהמשתמש שמציג את האתר יוכל להקיש את הפקודה DROP TABLE. כמו כן, גם Union (שנשמע תמים), יכול להיות נוראי כשזה מגיע לשליפות SQL. בעזרת Union פשוט ניתן "לחבר" בין הטור בטבלה שאותו העמוד צריך להציג, לבין טור סיסמאות המשתמשים באתר. הערה: כתבתי מדריך מפורט למידור הרשאות במשתמשים במסדי נתונים. […]

הוסף תגובה