در SQL Server سرویسهای شبکه مانند TCP/IP به صورت پیش فرض غیر فعال هستند ، که در صورت لزوم میتوان آنها را فعال نمود . و توصیه میشود بعد از فعال سازی شماره پورتهای پیشفرض را تغییر داد چرا که این پورت ها برای هکر ها شناخته شده هستند و میتوانند با استفاده از نقاط ضعف سیستم از پورتها جهت Attack استفاده نمایند
SQL Server به عنوان نرم افزار مدیریت پایگاه داده از سیستم های ایمن محسوب میشود ، با توجه به نسبی بودن مسئله امنیت میزان قابل اعتماد بودن SqlServer به توانایی های مدیر (Administrator)سیستم بستگی دارد
استفاده از ابزار درست ، سیاستهای مناسب ، بازرسی از سیستم ، پروتوکل ها ، گزارشگیری و دسترسی های مناسب میتوان تا حدود زیادی امنیت بالایی را در SQL سرور تامین نمود
استفاده از تکنیک های ایمن سازی مانند عدم ذخیره سازی رشته اتصال (Connection String) بدون رمز نگاری توسط Applications، یا رمزنگاری اطلاعات حساس با استفاده از certificate ها میتوان امنیت داده ها را به خوبی تامین نمود
Xp_cmdshell با اینکه این قابلیت در حالت پیش فرض غیر فعال نمیباشد ، ولی در صورت فعال بودن میتواند
توسط هکر ها شناسایی و مورد استفاده سوء قرار گیرند ، هر چند نمیتوان این مورد را از نقاط ضعف بالقوه SQL شمرد .
Sql Injection
تزریق کد یا SqlInjection نوعی فن تزریق کد است که نقص امنیتی نرمافزار وبسایت را اکسپلویت میکند به این صورت که نفوذگر با یک سری دستورهای اسکیوال عملیاتی را (متفاوت با عملیات عادی موردنظر طراح وبسایت) در پایگاه داده وبسایت آسیبپذیر انجام میدهد.
این آسیبپذیری جزو ده آسیبپذیری رایج نرمافزارهای وب در سال ۲۰۰۷ و ۲۰۱۰ برشمرده شدهاست.
تزریق SQL یک روش حمله است که هدف آن داده های ساکن در یک پایگاه داده می باشد که از طریق FireWall محافظت می شود. حمله معمولا به علت مدیریت ضعیف در اعتبار سنجی کدها و یا ورودیهای برنامه (وب سایت) اتفاق می افتد. حمله تزریق SQL زمانی اتفاق می افتد که یک مهاجم قادر به قرار دادن یک سری از عبارتهای SQL در یک Query (پرس و جو) با دستکاری داده های ورودی کاربر در یک برنامه مبتنی بر وب می باشد. البته این مساله نیز مستقیما با نحوه مدیریت کدها و ورودیهای وب سایت رابطه مستقیم دارد. یک حمله کننده می تواند از نقصهای برنامه نویسی و یا حفره های امنیتی وب سایت و یا نرم افزار به راحتی برای دستیابی به اطلاعات یک پایگاه داده استفاده نماید.
*پرس و جوی معمول دارای چند بخش مختلف به شرح ذیل می باشد:
دستور Select: با استفاده از این دستور ستونهایی که مورد نظرمان است را انتخاب می نمائیم.
From : که مشخص می نماید که ستونهای مورد نظر ما از کدام جدول انتخاب شوند
Where: که در آن شروطی را مشخص می نمائیم.
و یک سری دستورات و عبارها و متدهای دیگر . . .
حملات تزریق از طریق SQL فقط در بخش شرطی Where اتفاق می افتند. در ادامه توضیح خواهیم داد که این مساله چگونه رخ می دهد.
این آسیبپذیری از راههای گوناگونی پدید میآید. یک طریق فیلترنشدن Escape characterها (" و ') است. برای مثال:
statement = "SELECT * FROM users WHERE name = '" + userName + "';"
کار این کد استخراج اطلاعات یک نام کاربری (که به متغیر داده میشود) از جدول users است. اما نفوذگر میتواند با دادن مقدارهایی هوشمندانه به متغیر userName، سبب اجرای دستورهایی متفاوت از آنچه موردنظر کدنویس بودهاست بشود. برای مثال با وارد کردن این کد به عنوان ورودی:
' OR 'a'='a
کد نهایی اینچنین رندر میشود:
SELECT * FROM users WHERE name = '' OR 'a'='a';
همچنین میتوان با یکی از این سه روش، ادامهٔ کد را کامنت گرفت:
' OR 'a'='a' -- ' ' OR 'a'='a' ({ ' ' OR 'a'='a' /* '
که نتیجه چنین است:
SELECT * FROM users WHERE name = '' OR 'a'='a' -- ';
مثلاً ممکن است در کدی، ادامهٔ کد مربوط به بررسی گذرواژه باشد، در آن حالت با این کار آن بخش از کد کامنت گرفته میشود و پردازش نمیشود، و نفوذگر بدون واردکردن گذرواژه از مانع میگذرد.
یا مثلاً واردشدن چنین عبارتی:
a'; DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't
سبب حذف جدول users و نیز استخراج تمام اطلاعات جدول userinfo میشود.
در ژوئیهٔ ۲۰۱۲ گروهی تحت عنوان D33D با نفوذ به زیردامنهای از یاهو، Yahoo Voices، به همین شیوه، گواهینامههای لاگین بیش از ۴۵۰۰۰۰ کاربر این وبگاه را ربودند.
جلوگیری از SqlInjection
در واقع این آسیب پذیری از نقاط ضعف SqlServer به حساب نمیاید زیرا SQLServer روشهای مختلفی را جهت جلوگیری از این آسیب پذیری پیش روی کاربران و توسعه دهندگان نرم افزاری قرار داده است
1- استفاده از رویه های ذخیره شده یا Stored Procedures
2- دقت در کد نویسی لایه کاربری
3- کنترل تراکنش ها بر روی سرور
4- لایه بندی و استفاده از روشهای امن تراکنش اطلاعات
Data Backup
بخشی از امنیت اطلاعات در دسترس بودن Avalibility همیشگی اطلاعات برای افراد مجاز میباشد
از آنجا که دیتابیس SqlServer به ندرت دچار خرابی فایل میشود ولی احتمالات کم را نیز باید برای اطمینان مخصوصا در موارد اطلاعات مهم در نظر گرفت از این رو یکی از اصول نگهداری اطلاعات تهیه نسخه های پشتیبان به صورت مرتب و روزانه میباشد
در SqlServer مانند موارد قبلی به دو روش تهیه بکاپ از طریق GUI و تهیه بکاپ به روشTsql میتوان اقدام به بکاپ گیری کرد
همچنین در قسمت وظایف میتوان Task را جهت بکاپ گیری منظم تنظیم نمود تا به صورت روزانه یا هفتگی یا .... سیستم به صورت خودکار از یک یا چند بانک اطلاعاتی بکاپ گیری نماید .
جهت گرفتن پشتیبان از اطلاعات حساس و محرمانه قابلیت رمز گذاری بر روی بکاپ وجود دارد که هنگام باز گردانی اطلاعات باید رمز صحیح وارد شود و همچنین میتوان فایل ها را فشرده کرد.
TSQL BackUp
• USE AdventureWorks2012;
• GO BACKUP DATABASE AdventureWorks2012 TO DISK = 'Z:\SQLServerBackups\AdventureWorks2012.Bak' WITH FORMAT,
• MEDIANAME = 'Z_SQLServerBackups',
• NAME = 'Full Backup of AdventureWorks2012'; GO
• در این دستور ابتدا فایل جاری به AdventureWorks2012 تنظیم میشود
• بکاپ پایگاه داده در مسیر 'Z:\SQLServerBackups\AdventureWorks2012.Bak
• ذخیره میگردد
• و با نام Full Backup of AdventureWorks2012
Restoring Backup
نمونه ای از اسکریپت برگردان کردن بکاپ
USE master;
GO
-- First determine the number and names of the files in the backup.
-- AdventureWorks2012_Backup is the name of the backup device.
RESTORE FILELISTONLY FROM AdventureWorks2012_Backup;
-- Restore the files for MyAdvWorks.
RESTORE DATABASE MyAdvWorks FROM AdventureWorks2012_Backup WITH RECOVERY, MOVE 'AdventureWorks2012_Data' TO 'D:\MyData\MyAdvWorks_Data.mdf',
MOVE 'AdventureWorks2012_Log' TO 'F:\MyLog\MyAdvWorks_Log.ldf';
GO