شماره :IRCAR201408229
تاريخ: 22/5/93
1- مقدمه
SQL Server ويژگيهاي زيادي دارد كه ايجاد برنامههايي با پايگاه داده امن را پشتيباني ميكند. صرفنظر از نسخه SQL Server، ملاحظات امنيتي معمول مانندسرقت دادهها و جامعيت دادهها در اين نرمافزار در نظر گرفته ميشود. درصورتيكه دادهها محافظت نگردند، ممكن است به علت دستكاري و تغييرات غيرعمدي يا خرابكارانه پاك شوند يا تغيير يابند و ارزش خود را از دست بدهند. بعلاوه، اغلب بايد مسائلي مانند ذخيرهسازي صحيح اطلاعات محرمانه نيز مورد توجه قرار گيرد.
هر نسخه از SQL Server مانند هر نسخه از ويندوز، ويژگيهاي امنيتي متفاوتي نسبت به نسخههاي پيشين خود دارد و نسخههاي جديدتر، عملكرد بهتري نسبت به نسخههاي پيشين دارند.
اين مهم است كه درك كنيم كه ويژگيهاي امنيتي به تنهايي قادر به تضمين يك برنامه پايگاه داده امن نيستند. هر برنامه پايگاه داده از جهت ملزومات، محيط اجرا، مدل اجرا، موقعيت فيزيكي و تعداد كاربران منحصر به فرد است. ممكن است برخي برنامههاي محلي نيازمند امنيت حداقلي باشند، درحاليكه ساير برنامههاي محلي و يا برنامههايي كه بر روي اينترنت به كار گرفته ميشوند ممكن است به معيارهاي امنيتي قويتر و مانيتورينگ و ارزيابي دائم نياز داشته باشند.
ملزومات امنيتي يك برنامه پايگاه داده SQL Server بايد در زمان طراحي در نظر گرفته شود نه پس از آن. ارزيابي تهديدات در ابتداي چرخه توسعه برنامه اين فرصت را در اختيار شما قرار ميدهد كه خسارت بالقوه را در هرجايي كه يك آسيبپذيري شناسايي ميشود، كاهش دهيد.
حتي اگر طراحي اوليه يك برنامه بيعيب و نقص باشد، باز هم تهديدات جديد ممكن است در زمان بهرهبرداري از سيستم رونمايي كنند. با ايجاد خطوط دفاعي مختلف براي پايگاه داده، ميتوانيد خسارت وارد شده توسط يك نشت امنيتي را به حداقل برسانيد. نخستين خط دفاعي، كاهش سطح حمله با اعطاي مجوزهاي حداقلي و رعايت اصل حداقل دسترسي است.
در قسمت قبلي مجموعه مقالات امنيت SQL Server، به نماي كلي امنيت SQL Server، انواع سناريوهاي احراز هويت در SQL Server، تفويض اختيار و مجوزها در SQL Server، رمزگذاري دادهها و امنيت يكپارچه CLR، سناريوهاي امنيت برنامه كاربردي، مديريت مجوزها با استفاده از روالهاي ذخيره شده و نوشتن SQL پوياي امن پرداختيم. اين بخش از اين مجموعه مقالات به طور مختصر به امضاي روالهاي ذخيره شده و جعل هويت در SQL Server ميپردازد.
2- امضاي روالهاي ذخيره شده در SQL Server
شما ميتوانيد روال ذخيره شده را با استفاده از گواهينامه يا يك كليد غيرمتقارن امضاء نماييد. اين كار براي سناريوهايي طراحي شده است كه در آنها مجوزها نميتوانند از طريق زنجيره مالكيت به ارث برده شوند و يا اينكه زنجيره مالكيت در آنها پاره شده است (مانند SQL پويا). سپس ميتوانيد يك كاربر منطبق بر آن گواهينامه ايجاد كنيد و مجوزهاي كاربري را براي شيئي كه روال ذخيره شده نياز به دسترسي به آن دارد، به آن گواهينامه تخصيص دهيد.
هنگاميكه روال ذخيره شده اجرا ميگردد، SQL Server مجوزهاي كاربر گواهينامه را با مجوزهاي فراخواننده ادغام ميكند. بر خلاف عبارت EXECUTE AS، اين كار بستر اجراي روال را تغيير نميدهد. توابع دروني كه نام لاگين و نام كاربري را بازميگردانند، نام فراخواننده را بازميگردانند نه نام كاربر گواهينامه را.
امضاي ديجيتالي، يك داده رمز شده با كليد خصوصي امضا كننده است. اين كليد خصوصي اين اطمينان را ايجاد ميكند كه امضاي ديجيتالي منحصر به مالك آن است. شما ميتوانيد روالهاي ذخيره شده، توابع يا تريگرها را امضا كنيد.
توجه:
شما ميتوانيد يك گواهينامه در پايگاه داده اصلي ايجاد كنيد تا مجوزهاي سطح سرور را تخصيص دهيد.
2-1- ايجاد گواهينامهها
هنگاميكه يك روال ذخيره شده را با استفاده از گواهينامه امضاء ميكنيد، يك خلاصه داده شامل كد روال ذخيره شده بصورت درهم سازي شده و رمز شده با استفاده از كليد خصوصي ايجاد ميشود. اين خلاصه داده در زمان اجرا توسط كليد عمومي رمزگشايي ميشود و با مقدار درهم سازي شده روال ذخيره شده مقايسه ميگردد. اين كار از تغيير كد روال ذخيره شده توسط كسي كه به كليد خصوصي دسترسي ندارد جلوگيري ميكند. در نتيجه شما بايد اين روال را هر بار كه آن را تغيير ميدهيد، مجدداً امضا نماييد.
چهار گام در امضاي يك ماژول وجود دارد كه به شرح زير است:
- ايجاد يك گواهينامه با استفاده از دستور CREATE CERTIFICATE [certificateName] در Transact-SQL. اين دستور چندين گزينه براي تنظيم تاريخ شروع و پايان و كلمه عبور دارد. تاريخ انقضاي پيشفرض يك سال است.
- ايجاد يك كاربر پايگاه داده مرتبط با اين گواهينامه با استفاده از دستور CREATE USER [userName] FROM CERTIFICATE [certificateName] در Transact-SQL. اين كاربر فقط در پايگاه داده وجود دارد و با هيچ لاگيني در ارتباط نيست.
- تخصيص مجوزهاي مورد نياز به كاربر گواهينامه بر روي اشياي پايگاه داده.
توجه:
گواهينامه نميتواند مجوزها را به كاربري كه مجوزهاي وي توسط دستور DENY ابطال شدهاند تخصيص دهد. دستور DENY همواره بر GRANT تقدم دارد و از ارث بردن مجوزهاي تخصيص داده شده به كاربر گواهينامه توسط فراخواننده جلوگيري ميكند. - امضاي روال با گواهينامه با استفاده از دستور SIGNATURE TO [procedureName] BY CERTIFICATE [certificateName] در Transact-SQL.
3- تغيير مجوزها با استفاده از جعل هويت در SQL Server
بسياري از برنامهها براي دسترسي به دادهها، از روالهاي ذخيره شده با تكيه بر زنجيره مالكيت براي محدودسازي دسترسي به جداول پايه استفاده ميكنند. شما ميتوانيد مجوزهاي EXECUTE را بر روي روالهاي ذخيره شده تخصيص دهيد و در عين حال مجوزهاي جداول پايه را رد كرده يا ابطال نماييد. SQL Server درصورتيكه روال ذخيره شده و جداول داراي مالك يكسان باشند، مجوزهاي فراخواننده را بررسي نميكند. البته اگر اشياء داراي مالكهاي متفاوت باشند يا در مورد SQL پويا، زنجيره مالكيت كار نميكند.
شما ميتوانيد هنگامي كه فراخواننده مجوزي بر روي اشياي مورد ارجاع ندارد، عبارت EXECUTE AS را در يك روال ذخيره شده مورد استفاده قرار دهيد. تأثير عبارت EXECUTE AS اين است كه بستر اجرا به كاربر پراكسي منتقل ميگردد. تمامي كد و تمامي فراخوانيها به روالهاي ذخيره شده تودرتو يا تريگرها، تحت بستر امنيتي كاربر پراكسي اجرا ميگردد. بستر اجرا فقط پس از اجراي روال يا هنگامي كه عبارت REVERT مورد استفاده قرار گيرد، به فراخواننده اصلي بازميگردد.
3-1- تغيير بستر با استفاده از عبارت EXECUTE AS
عبارت EXECUTE AS در Transact-SQL به شما اجازه ميدهد كه بستر اجراي يك دستور را با جعل هويت يك login يا يك كاربر ديگر پايگاه داده تغيير دهيد. اين يك تكنيك پيشفرض براي تست پرس و جوها و روالها به عنوان يك كاربر ديگر است.
EXECUTE AS LOGIN = 'loginName';
EXECUTE AS USER = 'userName';
شما بايد مجوزهاي IMPERSONATE را بر روي لاگين يا كاربري كه در حال جعل هويت وي هستيد داشته باشيد. اين مجوز براي sysadmin براي تمامي پايگاههاي داده و براي اعضاي نقش db_owner در پايگاههاي دادهاي كه مالك آن هستند معنا دارد.
3-2- تخصيص مجوزها با استفاده از عبارت EXECUTE AS
شما ميتوانيد عبارت EXECUTE AS را در بخش هدر يك روال ذخيره شده، تريگر يا تابع تعريف شده توسط كاربر استفاده كنيد. اين عبارت باعث ميشود كه روال در بستر نام كاربر يا كلمه كليدي مشخص شده در عبارت EXECUTE AS اجرا گردد. شما ميتوانيد يك كاربر پراكسي در پايگاه داده ايجاد كنيد كه به هيچ لاگيني نگاشت نشده باشد و صرفاً مجوزهاي لازم بر روي اشياي مورد دسترسي روال را به آن تخصيص دهيد. صرفاً كاربر پراكسي مشخص شده در عبارت EXECUTE AS بايد مجوزهايي بر روي تمامي اشياي مورد دسترسي ماژول را داشته باشد.
توجه:
برخي اعمال مانند TRUNCATE TABLE داراي مجوزهاي قابل تخصيص نيستند.
3-3- استفاده از EXECUTE AS به همراه REVERT
شما ميتوانيد از عبارت REVERT در Transact-SQL براي بازگشتن به بستر اصلي اجرا استفاده كنيد. عبارت اختياري WITH NO REVERT COOKIE = @variableName به شما اجازه ميدهد كه درصورت صحيح بودن مقدار متغير @variableName، بستر اجرا را به بستر فراخواننده بازگردانيد. اين به شما اجازه ميدهد كه بستر اجرا را در محيطهايي كه connection pooling مورد استفاده قرار ميگيرد، به بستر فراخواننده بازگردانيد. از آنجايي كه مقدار @variableName صرفاً براي فراخواننده عبارت EXECUTE AS شناخته شده است، فراخواننده ميتواند تضمين نمايد كه بستر اجرا نميتواند توسط كاربر نهايي كه برنامه را اجرا ميكند تغيير يابد. هنگامي كه اين ارتباط بسته ميشود، به pool بازگردانده ميشود.
3-4- مشخص كردن بستر اجرا
شما علاوه بر مشخص كردن يك كاربر، ميتوانيد EXECUTE AS را با هريك از كلمات كليدي زير مورد استفاده قرار دهيد:
- CALLER. پيشفرض، اجرا به عنوان CALLER است. اگر گزينه ديگري مشخص نشده باشد، روال در بستر امنيتي فراخواننده اجرا ميشود.
- OWNER. اجرا به عنوان OWNER، روال را در بستر مالك روال اجرا ميكند. درصورتيكه روال در يك schema كه مالك آن dbo يا مالك پايگاه داده است اجرا شود، اين روال با مجوزهاي بدون محدوديت اجرا ميگردد.
- SELF. اجرا به عنوان SELF، روال را در بستر امنيتي ايجاد كننده روال ذخيره شده اجرا ميكند. اين مسأله معادل اجرا به عنوان يك كاربر خاص است كه در آن، كاربر خاص همان فرد ايجاد كننده روال باشد.
- 7