PDA

View Full Version : ذخیره کردن IP و اطلاعات دیگر مربوط به کلاینت ها بخاطر مقاصد Logging و Security و غیره



eshpilen
دوشنبه 09 دی 1392, 08:03 صبح
امنیت مبحث گسترده و پیچیده و ظریفی بید! :لبخند:

طراحی کردن یک سیستم اصولی که از لحاظ تمام پارامترها بهینه باشه، یا اینطور بگیم که در بهینه ترین تعادل ممکن باشه، کار راحتی نیست و نیاز به دانش و کار زیادی داره.

حالا من توی فکر بودم که مثلا میایم IP کاربران رو سمت سرور Log میکنیم. خب این مقاصد امنیتی و غیره داره. ولی همین ذخیره کردن IP کاربر خودش از نظر امنیتی و Privacy میتونه مشکل داشته باشه. فکر کنید مثلا هکری که به سایت و برنامهء ما نفوذ بکنه، IP های مورد استفادهء کاربران ما رو هم بدست میاره؛ و خب این چیز جالبی نیست! نه؟
پس چه باید کرد؟
همینطور ممکنه اطلاعات دیگری رو هم به دلایل امنیتی و غیره ذخیره کنیم. مثلا نام کاربری های وارد شده در لاگین های اشتباه! اینطوری میتونیم بعدا لاگ ها رو بررسی کنیم ببینیم به کدام اکانت ها میخواستن نفوذ کنن، روبات بوده یا آدم و غیره. البته پسوردها رو که فکر نمیکنم به هیچ وجه مجاز باشیم Log کنیم؛ این کار بیش از حد خطرناکه! ولی شاید هم راهی براش باشه.

خب من یه چندتا ایده داره.
یه ایده اینه که ما اینطور اطلاعات رو بصورت رمز شده در دیتابیس ذخیره میکنیم. مثلا IP و نامهای کاربری و اینا رو با AES128 رمز میکنیم.
طبیعتا کلید رمزگذاری باید در خود برنامه در زمان اجرا موجود باشه. بنابراین مثلا اون رو در کد منبع میذاریم.
خب این کارها حداقل یک مقدار امنیت و مانع در سر راه هکرها یا افراد فضول دیگر ایجاد میکنن، ولی مسئله رو بطور اساسی حل نمیکنن، چون بهرحال کلید و داده های رمز شده هردو زیرمجموعهء یک محیط و سرور هستن و هردو میتونن سرقت بشن. ولی مواردی هست که بهرحال این روش مفید باشه. مثلا مواقعی که دیتابیس رو خوندن ولی نتونستن به فایلهای کدمنبع برنامه دسترسی پیدا کنن. یا همچنین از طریق نسخه های بکاپ دیتابیس که معلوم نیست چه زمانی سر از کجا دربیاره.

اما بازم من یه ایده دارم برای موارد خاص با امنیتی از این هم بیشتر.
اون ایده اینه که اطلاعات رو با یک رمزنگاری نامتقارن رمز میکنیم؛ یعنی کلید عمومی روی سرور و در دسترس برنامه ذخیره میشه، بعد باهاش اطلاعات لاگ ها رو قبل از ذخیره رمز میکنیم. کلید خصوصی هم اصلا روی سرور نیست و دست ادمینه. موقعی که ادمین میخواد لاگ ها رو بررسی کنه، این کلید رو به سرور ارسال میکنه (مثلا از طریق آپلود فایل در فرم مخصوصش) و این کلید برای رمزگشایی اطلاعات و دادن اونا به ادمین استفاده میشه، اما هیچوقت بصورت دائمی در سمت سرور ذخیره نمیشه.
خب ما به این شکل امنیت بیشتری بدست میاریم، ولی بازهم امنیت کاملی نیست. باید توجه داشت که ممکنه هکرها مثلا با کار گذاشتن کد مخفی در کدهای ما، موقعی که ادمین به سایت لاگین میکنه و لاگ ها رو میخونه این کلید رو سرقت کنن. ضمنا این کلید احتمالا از کانالهای ناامن عبور میکنه. بنابراین بهتره یا لازمه این کلید فقط برای همین کارها در برنامه باشه و ازش در کاربردهای جدی تری استفاده نشه.
ضمنا یک محدودیتی که این روش داره اینه که فقط برای کاربردهای لاگ و مشاهده توسط ادمین کاربرد داره و نمیشه از این اطلاعات رمز شده در خود برنامه استفاده کرد (مثلا استفاده برای بررسی و تصمیمات امنیتی توسط برنامه) یا برای خود کاربران نمایش داد، چون نمیتونیم کلید رمزگشایی (کلید خصوصی) رو در سمت سرور ذخیره کنیم.
راستی برای امن تر شدن این سیستم میتونیم اصلا بجای اینکه کلید خصوصی رو به سرور ارسال کنیم، لاگ ها رو توسط یک برنامهء دسکتاپ از سرور دریافت کنیم و عملیات رمزگشایی در سمت کلاینت انجام بشه. به این شکل دیگه نیازی نیست که کلید خصوصی از رایانه شخصی ادمین خارج بشه.

نمیدونم شایدم من زیادی حساس باشم! واقعا چرا اینقدر به خودمون زحمت بدیم بخاطر چندرغاز IP هایی که بیشترشون موقتی هستن یا نامهای کاربری وارد شده؟ آیا اونقدر اهمیت داره که بخاطرش این همه پیچیدگی و حجم و کار اضافی برای خودمون و برنامه درست کنیم؟

البته بنده اینکه باید اطلاعات شخصی و حساس کاربران در سمت سرور رو ذخیره نکرده، اگر هم ذخیره میکنیم حتی الامکان بصورت هش شده، و اگر نمیشه حداقل رمز شده، در منبع امنیتی نسبتا معتبری قبلا خونده بودم.
در اون منبع آمده بود که مثلا سوال و پاسخهای امنیتی که مواقعی مثل فراموش کردن پسورد کاربرد دارن رو بصورت Plain text در سرور ذخیره نکنید و بصورت هش شده ذخیره کنید. یعنی دقیقا مثل کاری که برای پسورد میکنیم!
ولی هش کردن اطلاعاتی که بعدا میخوایم خودمون بررسیشون کنیم یا در برنامه دانستن مقدار واقعی اونا نیاز ممکن نیست، بنابراین میشه بجای هش حداقل از رمزگذاری استفاده کرد. تازه هش کردن در بعضی موارد مثل هش کردن چیزهایی مثل IP چندان امن بنظر نمیرسه، چون تعداد IP های ممکن کمه و بنابراین هش اونها باید براحتی قابل Brute-force باشه. البته میتونیم اول هش کنیم و بعد هش رو هم بصورت رمز شده ذخیره کنیم!! یعنی دیگه نهایت محکم کاری که میتونیم بکنیم.

abolfazl-z
دوشنبه 09 دی 1392, 09:50 صبح
البته دیگه ما نباید امنیت همه جا را تامین کنیم ! درسته میتونیم جلوشونو تا حدودی بگیریم ولی در کل باز هم غیر ممکن هست !

حملات Brute-force هر کی نمیتونه انجام بده که ! درضمن این نوع حملات هم باید توسط سرور شناخته و بلاک بشه . ولی باز با اسکریپت میتونیم تا حدودی جلوشو بگیریم.

eshpilen
دوشنبه 09 دی 1392, 11:11 صبح
البته دیگه ما نباید امنیت همه جا را تامین کنیم ! درسته میتونیم جلوشونو تا حدودی بگیریم ولی در کل باز هم غیر ممکن هست !
تامین تمام پارامترها به میزان مطلق یا حداکثری بله در خیلی موارد تقریبا یا دقیقا غیرممکنه یا صرف نمیکنه بهرصورت. ولی باید سعی کرد یک تعادل عاقلانه بین پارامترها ایجاد کرد، نه اینکه با این بهانه از زیر این حجم و سختی کار شونه خالی بشه و همه چیز رو ول کنیم به امان خدا و شانس و حدس و تصورات سطحی.

در این راه باید توجه داشت به میزان اهمیت هر جنبه و در نتیجه میزان ضریبی که در فرمول کلی بهش تعلق میگیره.
مثلا امنیت خب اکثرا یکی از اولویت های اصلی و در بالاترین سطح است.
پس یه جایی مثلا خیلی هم واجب نیست خب چرا بیایم ریسک بکنیم در این زمینه؟ مثلا IP کاربران اهمیت زیادی نداره، و برنامه و اطلاعات اونقدری مهم نیست اصلا، خب اصلا لاگ نکنید!

البته این کار و ایجاد تعادل و امنیت حرفه ای و اصولی دانش و بینش و توان کافی هم میخواد که خیلی ها ندارن. طرف باید تخصصش رو داشته باشه بدونه داستان ها چیه منطق و اصولش چیه.


حملات Brute-force هر کی نمیتونه انجام بده که ! درضمن این نوع حملات هم باید توسط سرور شناخته و بلاک بشه . ولی باز با اسکریپت میتونیم تا حدودی جلوشو بگیریم. درمورد Brute-force صحبت خاصی کردم؟
متوجه ربطش نشدم!

eshpilen
دوشنبه 09 دی 1392, 12:08 عصر
عالی بود.
لاگ کردن اطلاعات در برخی از سیستم ها درجه اهمیت بسیار زیادی داره. مثلا داخل یک سیستم مالی وقتی یک رکوردی اضافه یا حذف یا ویرایش میشه باید مشخص باشه که کی و از چه آیپی این کارو انجام داده. برای اینکه بعدا بشه پیگیری کرد و حداقل ها رو برای پیگیری داشته باشیم. یا کسایی که به یوزر ادمین وارد میشن و اشتباه رمز رو میزنن از چه رمزهایی استفاده می کنن؟ اینجوری در زمان حمله مثلا داره حمله brute force میشه زمانی که داره به پسورد شما نزدیک میشه رو میشه تشخیص داد. در کل هرچقدر اهمیت دزدیده شده اطلاعات مهمه ثبت رویدادهای در موارد مهم هم ضروری هست.

یا کسایی که به یوزر ادمین وارد میشن و اشتباه رمز رو میزنن از چه رمزهایی استفاده می کنن؟
البته اگر پسورد رو در سمت کلاینت قبل از ارسال به سرور هش کنیم، دیگه رمز در سمت سرور مشخص نیست که بخوایم لاگ کنیمش.
کلا هم بنظر من بهتره حتی الامکان از ذخیرهء اصل پسورد حتی بصورت رمزشده در سمت سرور خودداری کنیم. حالا اگر خیلی اصرار بودش میشه از همون ایدهء رمزنگاری نامتقارن استفاده کرد. ترجیحا هم با همون روش نرم افزار دسکتاپ که کلید خصوصی به سمت سرور ارسال نشه.
بهرحال ممکنه ادمین یوقت خودش اشتباه رمز رو زده یجایی (حالا یا یجاش اشتباه تایپی داشته یا یکی از پسوردهای دیگر خودش رو اشتباها وارد کرده).

abolfazl-z
دوشنبه 09 دی 1392, 17:07 عصر
درمورد Brute-force صحبت خاصی کردم؟
متوجه ربطش نشدم! نه منظورم این بود که کلا حملات brute-force خالص انجام اش با سیستم های بزرگ هست و فکر کنم برای هر هکری با این سیستم های معمولی مقدور نباشد.