امنيت SQL Server – قسمت هفتم – مديريت مجوزها با استفاده از روال‌های ذخيره شده

امنيت SQL Server – قسمت هفتم – مديريت مجوزها با استفاده از روال‌های ذخيره شده

تاریخ ایجاد

IRCAR201406222
تاريخ: 9/4/93

1- مقدمه
SQL Server ويژگي‌هاي زيادي دارد كه ايجاد برنامه‌هايي با پايگاه داده امن را پشتيباني مي‌كند. صرفنظر از نسخه SQL Server، ملاحظات امنيتي معمول مانندسرقت داده‌ها و جامعيت داده‌ها در اين نرم‌افزار در نظر گرفته مي‎شود. درصورتي‌كه داده‌ها محافظت نگردند، ممكن است به علت دستكاري و تغييرات غيرعمدي يا خرابكارانه پاك شوند يا تغيير يابند و ارزش خود را از دست بدهند. بعلاوه، اغلب بايد مسائلي مانند ذخيره‌سازي صحيح اطلاعات محرمانه نيز مورد توجه قرار گيرد.
هر نسخه از SQL Server مانند هر نسخه از ويندوز، ويژگي‌هاي امنيتي متفاوتي نسبت به نسخه‌هاي پيشين خود دارد و نسخه‌هاي جديدتر، عملكرد بهتري نسبت به نسخه‌هاي پيشين دارند.
اين مهم است كه درك كنيم كه ويژگي‌هاي امنيتي به تنهايي قادر به تضمين يك برنامه پايگاه داده امن نيستند. هر برنامه پايگاه داده از جهت ملزومات، محيط اجرا، مدل اجرا، موقعيت فيزيكي و تعداد كاربران منحصر به فرد است. ممكن است برخي برنامه‌هاي محلي نيازمند امنيت حداقلي باشند، درحالي‌كه ساير برنامه‌هاي محلي و يا برنامه‌هايي كه بر روي اينترنت به كار گرفته مي‌شوند ممكن است به معيارهاي امنيتي قوي‌تر و مانيتورينگ و ارزيابي دائم نياز داشته باشند.
ملزومات امنيتي يك برنامه پايگاه داده SQL Server بايد در زمان طراحي در نظر گرفته شود نه پس از آن. ارزيابي تهديدات در ابتداي چرخه توسعه برنامه اين فرصت را در اختيار شما قرار مي‌دهد كه خسارت بالقوه را در هرجايي كه يك آسيب‌پذيري شناسايي مي‌شود، كاهش دهيد.
حتي اگر طراحي اوليه يك برنامه بي‌عيب و نقص باشد، باز هم تهديدات جديد ممكن است در زمان بهره‌برداري از سيستم رونمايي كنند. با ايجاد خطوط دفاعي مختلف براي پايگاه داده، مي‌توانيد خسارت وارد شده توسط يك نشت امنيتي را به حداقل برسانيد. نخستين خط دفاعي، كاهش سطح حمله با اعطاي مجوزهاي حداقلي و رعايت اصل حداقل دسترسي است.
در قسمت قبلي مجموعه مقالات امنيت SQL Server، به نماي كلي امنيت SQL Server، انواع سناريوهاي احراز هويت در SQL Server، تفويض اختيار و مجوزها در SQL Server، رمزگذاري داده‌ها و امنيت يكپارچه CLR و سناريوهاي امنيت برنامه كاربردي پرداختيم. اين بخش از اين مجموعه مقالات به طور مختصر به مديريت مجوزها با استفاده از روال‌هاي ذخيره شده در SQL Server مي‌پردازد.

2- مديريت مجوزها با استفاده از روال‌هاي ذخيره شده در SQL Server
يك روش ايجاد چندين خط دفاعي در اطراف پايگاه داده شما اين است كه تمامي دسترسي‌هاي داده‌ها را با استفاده از روال‌هاي ذخيره شده (stored procedures) يا توابع تعريف شده توسط كاربر پياده‌سازي نماييد. در اين روش، شما تمامي مجوزها به اشياي لايه زيرين مانند جداول را لغو مي‌كنيد و مجوزهاي اجرا را به روال‌هاي ذخيره شده تخصيص مي‌دهيد. اين كار به شكل مؤثري يك محوطه دفاعي در اطراف داده‌ها و اشياي پايگاه داده شما ايجاد مي‌كند.
2-1- مزاياي روال ذخيره شده
روال‌هاي ذخيره شده از مزاياي زير بهره‌مند هستند:

  • منطق داده‌ها و قوانين كسب و كار مي‌توانند طوري اعمال گردند كه كاربران بتوانند فقط به روش‌هايي كه توسعه دهندگان و مديران پايگاه داده مي‌خواهند، به داده‌ها و اشياء دسترسي پيدا كنند.
  • روال‌هاي ذخيره شده پارامتري كه تمامي ورودي‌هاي كاربر را اعتبارسنجي مي‌كنند مي‌توانند براي خنثي كردن حملات تزريق SQL مورد استفاده قرار گيرند. درصورتي‌كه شما از SQL دايناميك استفاده نماييد، بايد اطمينان حاصل كنيد كه دستورات خود را پارامتري كرده‌ايد و هرگز مقادير پارامترها را به طور مستقيم در يك رشته پرس و جو قرار نمي‌دهيد.
  • پرس و جوهاي اقتضايي و موردي و دستكاري‌هاي داده‌ها مي‌توانند غيرمجاز گردند. اين كار از تخريب عمدي يا ناآگاهانه داده‌ها توسط كاربران يا اجراي پرس و جوهايي كه كارآيي و بازدهي سرور يا شبكه را تحت تأثير قرار مي‌دهند جلوگيري مي‌كند.
  • خطاها مي‌توانند بدون ارسال مستقيم به برنامه‌هاي كلاينت، در كد روال مديريت گردند. اين كار از بازگرداندن پيغام‌هاي خطا كه مي‌تواند به حملات پويش (probing) كمك كند، جلوگيري مي‌نمايد. لاگ خطاها و مديريت آنها را بر روي سرور انجام دهيد.
  • روال‌هاي ذخيره شده مي‌توانند يك‌بار نوشته شده و توسط برنامه‌هاي متعدد مورد دسترسي قرار گيرند.
  • برنامه‌هاي كلاينت نيازي به دانستن هيچ چيز درباره ساختارهاي داده‌هاي زيرين ندارند. تا زماني كه تغييرات بر روي فهرست پارامترها يا انواع داده‌هاي بازگردانده شده تأثير نگذارند، كد روال ذخيره شده مي‌تواند بدون نياز به تغيير در برنامه‌هاي كلاينت تغيير يابد.
  • روال‌هاي ذخيره شده مي‌توانند با تركيب چندين عمليات در يك فراخواني روال، ترافيك شبكه را كاهش دهند.

2-2- اجراي روال ذخيره شده
روال‌هاي ذخيره شده از مزيت زنجيره مالكيت (ownership chaining) براي فراهم كردن دسترسي به داده‌ها برخوردارند، به اين ترتيب كاربران نيازي به داشتن مجوز صريح براي دسترسي به اشياي پايگاه داده ندارند. زنجيره مالكيت زماني ايجاد مي‌شود كه مالك اشيايي كه به صورت متوالي و پي در پي به يكديگر دسترسي دارند، يك كاربر باشد. براي مثال، يك روال ذخيره شده مي‌تواند ساير روال‌هاي ذخيره شده را فراخواني كند يا اينكه يك روال ذخيره شده مي‌تواند به چندين جدول دسترسي پيدا كند. درصورتي‌كه تمامي اشياي موجود در زنجيره اجرا داراي يك مالك يكسان باشند، SQL Server فقط مجوز اجرا را براي فراخواننده چك مي‌كند، اما مجوزهاي فراخواننده را براي ساير اشياء چك نمي‌كند. در نتيجه شما فقط كافي است كه مجوزهاي اجرا را به روال‌هاي ذخيره شده تخصيص دهيد و مي‌توانيد تمامي مجوزها را براي جداول زيرين ابطال يا لغو نماييد.
2-3- تجربيات
فقط نوشتن روال‌هاي ذخيره شده براي امن‌سازي برنامه كافي نيست. شما بايد همچنين حفره‌هاي امنيتي بالقوه زير را نيز در نظر بگيريد:

  • مجوزهاي اجرا را بر روي روال‌هاي ذخيره شده براي آن دسته از نقش‌هاي پايگاه داده كه مايليد قادر به دسترسي به داده‌ها باشند، تخصيص دهيد.
  • تمامي مجوزها به جداول لايه زيرين براي تمامي نقش‌ها و كاربران در پايگاه داده از جمله نقش عمومي را ابطال يا لغو نماييد. تمامي كاربران مجوزها را از نقش عمومي به ارث مي‌برند. بنابراين ابطال مجوزها براي نقش عمومي به اين معناست كه صرفاً مالكان و اعضاي sysadmin داراي دسترسي هستند و هيچ يك از كاربران ديگر قادر به ارث بردن اين مجوزها ار نقش‌هاي ديگر نخواهند بود.
  • كاربران يا نقش‌ها را به نقش‌هاي sysadmin يا db_owner اضافه نكنيد. مديران سيستم و مالكان پايگاه داده مي‌توانند به تمامي اشياي پايگاه داده دسترسي پيدا كنند.
  • حساب كاربري مهمان را غيرفعال نماييد. اين كار از اتصال كاربران ناشناس به پايگاه داده جلوگيري مي‌كند. در پايگاه‌هاي داده جديد حساب كاربري مهمان به‌طور پيش‌فرض غيرفعال است.
  • مديريت خطا و لاگ برداري از خطاها را پياده‌سازي كنيد.
  • روال‌هاي ذخيره شده پارامتري ايجاد كنيد كه تمامي ورودي‌هاي كاربر را اعتبارسنجي مي‌كنند. تمامي ورودي‌هاي كاربر را غير قابل اعتماد در نظر بگيريد.
  • از SQL دايناميك مگر در مواقع لزوم دوري كنيد. از تابع Transact-SQL QUOTENAME() براي محدودسازي يك مقدار رشته‌اي استفاده كنيد و از وقوع هر جداكننده‌اي (delimiter) در رشته ورودي جلوگيري كنيد.                                                                                                                                                  
برچسب‌ها