نوشته شده توسط
aliarjmandi
مورخه
۱۳۸۹/۳/۸
در ساعت
15:04
یکی از مشکلات همیشه گی در تولید نرم افزارها مبحث ثبت ردپای کاربران (User Log) میباشد . اینکه ما بخواهیم تشخیص دهیم کدام کاربر چه فعالیتی را انجام داده است . بعنوان مثال چه کسی یک رکورد خاص را ایجاد ، ویرایش و حذف نموده است . برای پیدا سازی این مبحث بسته به سلیقه برنامه نویسان راههای متفاوتی وجود دارد . بعضی از برنامه نویسان جداولی برای نگهداری لاگ کاربران ایجاد میکنند و برخی دیگر به تمامی رکوردها آی دی کاربران را اضافه میکنند . اما آیا میدانید که بانک اطلاعاتی Sql Server بصورت خودکار از تمام عملکرد کاربران لاگ گیری میکند و میتوان با استفاده از آن ردپای عملکرد کاربران را استخراج نمود . حتماً در زمان ایجاد یک بانک اطلاعاتی جدید دقت کرده اید که هر بانک اطلاعاتی شامل دو فایل میباشد . فایل mdf که شامل اطلاعات داده ای میباشد و فایل ldf که شامل لاگهای مربوط به تراکنشهای بانک اطلاعاتی میباشد . در این مقاله سعی شده راهکاری برای استخراج لاگ از فایل ldf ارائه شود .
استخراج این اطلاعات علاوه بر اینکه راهکاری برای لاگ کردن عملکرد کاربران ارائه میکند ، به شما در بازیابی اطلاعات از دست رفته شما نیز کمک میکند . برای بازیابی لاگ فایل نرم افزارهای مختلفی ارائه شده است . از جمله این نرم افزارهای نرم افزار Sql Log Rescue میباشد که بصورت رایگان ارائه شده است . البته محدودیت این نرم افزار مربوط به ورژن بانک اطلاعاتی آن میباشد و این برنامه فقط از Ms Sql Server 2000 حمایت میکند . اما نصب آن تجربه جالبی میباشد و شما براحتی میتوانید تمام تراکنشهای قبلی خود را مشاهده کنید . این برنامه به شما امکان میدهد داده های قبلی را بازیابی نمایید .

برنامه دیگر در این رده ApexSQL Log میباشد . این نرم افزار بسیار قدرتمند تر از برنامه فوق میباشد و از تمامی نسخه های موجود sql server حمایت میکند ، اما این نرم افزار رایگان نمیباشد .

اما ما سعی کردیم با توجه به دو برنامه فوق یک پروژه نرم افزار Open source ایجاد کرده و از طریق پروژه خودمان به داده های لاگ دسترسی پیدا کنیم . در اجرای این پروژه چالشهای زیادی وجود داشته و دارد . چرا که دستورات مربوط به بازیابی اطلاعات لاگ کاربران بصورت UnDocument میباشد و در هیچ نقطه ای از شبکه جهانی یافت نگردید. حتی نامه نگاری ما با سازندگان sql server نیز نتیجه ای نداشت .

با این وجود با استفاده از یک مستند نه چندان کامل کامل ما شروع شد . پروژه موجود با استفاده از Visual C# 2008 تهیه شده است . در این پروژه با استفاده از دستورات Sql و رمزگشایی رکورد لاگ فایل اطلاعات مربوطه به عملیات Insert و Delete از بانک اطلاعاتی استخراج میگردد . هر عملی که موجب تغییر داده ها در بانک اطلاعاتی میگردد با یک Transaction همراه است و هر Transaction دارای یک آی دی میباشد . عمده فعالیت ما برای استخراج اطلاعات مربوط به هر تراکنش میباشد و این کار با استفاده از دستور زیر انجام میشود .
SELECT [Begin Time],SPID as Time from::fn_dblog (null, null) where [Transaction ID] = '" + Trans + "' And Operation ='LOP_BEGIN_XACT
بعد از آن بایستی با توجه به اندازه هر ستون داده ها از هگزاد به یونیکد تبدیل نمود . عمده مشکل مربوط فیلدهای Var یا متغیر میباشد . این فیلدها دارای سایز متغیر میباشند و استخراج آنها به سادگی سایر ستونها نمیباشد . برای اجرای برنامه نیاز دارید تنظیمات مربوط به اتصال به بانک اطلاعاتی ، نام دیتا بیس و جدول مورد نظر را تنظیم نمایید .
GetSqlLog _GetSqlLog = new GetSqlLog(@"Data Source=NikSoft\SQLSERVER2008;Initial Catalog=Train;uid=sa;pwd=sa*123", "Train", "Person");
در تصویر زیر نمونه اجرای برنامه را مشاهده میکنید . همانطور که بوسیله رنگها مشخص شده است ما دو رکورد تغییر یافته داشته ایم . رکورد اول که حذف شده است و رکورد دوم که به جدول اضافه شده است . اما نقص کار ما مربوط به عملیات Update بوده که هنوز نتوانسته ایم آنرا استخراج نماییم .

استفاده از این روش برای ذخیره سازی لاگ کاربران مزایای فراوانی داشته که میتوان به سرعت بالا ، اطمینان و عدم موازی کاری اشاره نمود . امیدوارم دوستان علاقه مند با مشارکت در این پروژه نقایص موجود را برطرف نمایند . شما میتوانید سورس این پروژه را به همراه فایل مستند ساختار لاگ از لینکهایی پایینی دانلود نمایید .
Log.zip (13.42 kb)
SQLServerForensics.BlackHat.Aug07.pdf (879.97 kb)