PDA

View Full Version : بهترین روش برای پیاده سازی Database همراه با SSL



r0ot$harp
پنج شنبه 25 خرداد 1391, 15:52 عصر
سلام دوستان عزیز

قبلا تو قسمت C#‎ در این رابطه تاپیک ایجاد کردم و سوالاتی پرسیدم و دوستان جواب هایی دادند. اما هنوز مشکل حل نشده. یه برنامه دارم که برای یک سازمان بزرگ هست. قسمت کوچکی از این برنامه باید برروی سیستم های کلاینت ها نصب بشه. تعداد این کلاینت ها حدود 20 هزار نفر هست. تا به امروز ما از یک وب سرویس استفاده می کردیم که تمام کارها از طریق اون انجام می شه. به طور مثال برای ورود کاربر نام کاربری رمزعبور با استفاده از الگوریتم TripleDes-Aes256 و در آخر با RSA 2048 کد می شن. در نهایت هم رشته اطلاعاتی ما امضاء شده و به سرور ارسال می شود. همین روال برای همه کار ها از قبیل Datagrid Bind انجام می شود. خوب تا به امروز تنها مشکلی که برخوردیم سرعت پایین Web Service بوده. حالا به فکر استفاده از SQL Server به صورت مستقیم همراه با SSL هستیم. اما مشکلی که داریم امنیت هست. حساب های هر کلاینت به طور وحشت ناکی امنیتی و محرمانه هست. به طور واضح بگم انگار پول نقد جابه جا می شود.

به این فکر هستم که برای هر کلاینت نام کاربری استفاده کنیم. هر کلاینت یه نام کاربری. ولی مشکل اینجاست که می خوام هر کاربر به اطلاعات وارد شده خودش دسترسی داشته باشه. مثلا ما تو هر جدول یه Field داریم به نام IdUser که ID جدول User هست. می خوام از این طریق ایجاد محدودیت کنم. این کار امکام پذیر هست؟؟؟؟ واسه اینکه واسه همچنین Solution شما راهی بهتر سراغ دارین؟؟؟

در آخر می خوام بدونم توی بسیاری از بانک ها یا موسسات قرض الحسنه از نرم افزار های .net برای کارهای روزمره استفاده می کنند. اون ها به چه صورت هستند؟؟؟ آیا مستقیم به Database وصل هستند یا از طریق Web Service.????

آدرس تاپیک قبلی:
http://barnamenevis.org/showthread.php?345681-%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86-%D8%B1%D9%88%D8%B4-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7-%D8%A8%D8%A7-%D8%A8%D8%A7%D9%86%DA%A9-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA%DB%8C&p=1524487#post1524487

دوستان پاسخ های شما واقعا برای من اهمیت زیادی داره.

باتشکر احسان

r0ot$harp
شنبه 27 خرداد 1391, 11:22 صبح
سلام دوستان عزیز

این مشکل رو من به ساخت یک SP و دادن سطح دسترسی به یک کاربر خاص حل کردم. اما یه مشکل جدیدتر. داخل SP من کد کاربر وصل شده به سرور رو میگیرم. سپس داخل SP به Query ارسالی از برنامه اضافه می کنم. اما مشکلی که هست اینه که دوباره باید دسترسی هر Table رو به کاربر بدم که این کارهم اصلا اصولی نیست و دوباره اطلاعات جدول برای همه باز هست. حالا چی کار کنم که فقط کاربر به SP دسترسی داشته باشه و خود SP زمان اجرا دستور رو با sa اجرا کنه؟؟؟؟

باتشکر احسان

baktash.n81@gmail.com
شنبه 27 خرداد 1391, 13:59 عصر
سلام

با توجه به اینکه امنیت براتون خیلی مهمه ... سعی کنید همون روش قبلی رو بهتر کنید ... مایکروسافت راه حل جدیدی برای سیستم های سرویس گرا ارائه کرده به اسم WCF که به نظر می آد برای کار شما راه حل بهتری هست ...

اما چرا نباید از SQL مستقیم استفاده کنید . (البته از نظر من)

1- خوب کاربران شما باید مستقیم سرور بانک اطلاعاتی رو ببینند که این یعنی افزایش ریسک حمله به سرور بانک اطلاعاتی که خیلی خطرناک هست ... و در صورت وجود یه حفره ساده کل اطلاعاتتون به خطر می افته ...
2- مدیریت 20 هزار تا کاربر تو SQL اگه غیر ممکن نباشه کار خیلی سختیه ...
3- و اینکه معمولا هیچ نرم افزاری در این ابعاد از ارتباط مستقیم استفاده نمی کنه ... در گذشته نرم افزارها راه حل های مختلفی رو استفاده می کردند ... مثلا خودشون یه نرم افزار می نوشتن که کاری شبیه وب سرویس شما ارائه کنه ... بعد که وب سرویس اومد با مشکلاتش ... و سال 2010 هم مایکروسافت windows communication foundation رو ریلیز کرد که مشکلات وب سرویس ها رو رفع کرده بود ...

baktash.n81@gmail.com
شنبه 27 خرداد 1391, 14:03 عصر
اما در مورد سئوال آخرت ... Query مورد نظر رو به صورت یه رشته بساز بریز توی متغیرمثل QueryStr@
بعد

exec (@QueryStr) as login='sa'

r0ot$harp
شنبه 27 خرداد 1391, 15:33 عصر
اما در مورد سئوال آخرت ... Query مورد نظر رو به صورت یه رشته بساز بریز توی متغیرمثل QueryStr@
بعد

exec (@QueryStr) as login='sa'


تشکر دوست عزیز بابت پاسخ شما. این روش کار ساز نیست چرا؟؟؟؟

مثلا کاربری که من باهاش وارد شده ام 8750 هست. این کار تنها سطح دسترسی به SP رو داره. خوب زمانی که SP می خوام Query یک جدول رو اجرا کنه به دلیل نداشتن سطح دسترسی کاربر 8750 این کار امکان پذیر نیست. می خوام تو SP قبل از اجرا Query بیاد و با کاربر sa متصل بشه.این شدنی هست؟؟؟

باتشکر احسان

r0ot$harp
شنبه 27 خرداد 1391, 15:35 عصر
سلام

با توجه به اینکه امنیت براتون خیلی مهمه ... سعی کنید همون روش قبلی رو بهتر کنید ... مایکروسافت راه حل جدیدی برای سیستم های سرویس گرا ارائه کرده به اسم WCF که به نظر می آد برای کار شما راه حل بهتری هست ...

اما چرا نباید از SQL مستقیم استفاده کنید . (البته از نظر من)

1- خوب کاربران شما باید مستقیم سرور بانک اطلاعاتی رو ببینند که این یعنی افزایش ریسک حمله به سرور بانک اطلاعاتی که خیلی خطرناک هست ... و در صورت وجود یه حفره ساده کل اطلاعاتتون به خطر می افته ...
2- مدیریت 20 هزار تا کاربر تو SQL اگه غیر ممکن نباشه کار خیلی سختیه ...
3- و اینکه معمولا هیچ نرم افزاری در این ابعاد از ارتباط مستقیم استفاده نمی کنه ... در گذشته نرم افزارها راه حل های مختلفی رو استفاده می کردند ... مثلا خودشون یه نرم افزار می نوشتن که کاری شبیه وب سرویس شما ارائه کنه ... بعد که وب سرویس اومد با مشکلاتش ... و سال 2010 هم مایکروسافت windows communication foundation رو ریلیز کرد که مشکلات وب سرویس ها رو رفع کرده بود ...

ممنون دوست عزیز. والا روش وب سرویس عالی بود برای ما. اما مشکل سرعت دیوانه کنندست. برای یک لوگین ساده 20 ثانیه تو بعضی از زمان های شلوغی زمان می بره.

باتشکر احسان

r0ot$harp
یک شنبه 28 خرداد 1391, 19:28 عصر
سلام دوستان عزیز

واقعا اینجا جای چند نفر از دوستان برای بحث خالی!!!!!!!

یه کارایی تا الان کردیم.

یه SP به نام sp_ExeCmd ساختم. این SP یه پارامتر داره برای گرفتن Query. بعد از گرفتن Query میام و اون رو Exec می کنم. بعد از ایجاد SP اومدم و یه کاربر ساختم و Database Roll Membership کاربر رو به صورت زیر تعریف کردم:
db_datareader
db_denydatareader
این دو گزینه رو تیک زدم.


پس از تنظیمات بالا سطوح دسترسی SP رو به صورت زیر تعریف کردم:
Execute:Grant برای کاربر تعریف شده.

پس از انجام این مراحل با کاربر جدید به دیتابیس وصل شدم. بعد از اجرای SP و پاس دادن پارامتر که Query ما هست، با خطای زیر روبرو شدم:
Msg 229, Level 14, State 5, Line 1

The SELECT permission was denied on the object 'Tbl_Users', database 'YeSd', schema 'dbo'.

خوب تا اینجا که نمی دونم مشکل چی هست؟؟؟؟

تو SP بجای Exec اومدم و یه کوئری ساده به صورت زیر نوشتم:
SELECT * FROM Tbl_Users

و دوباره مراحل بالا رو رفتم و SP رو اجرا کردم. SP به طور کامل اجرا و تمامی اطلاعات جدول بالا رو نمایش داد.

نتیجه: استفاده از دستورات SQL به صورت مستقیم بدون هیچگونه مشکلی هست. اما استفاده از Dynamic SQL و اجرا اون با Exec مشکل داره. چرا؟؟؟؟؟

دوستان خواهش می کنم همکاری کنیم این بحث تمام بشه.


باتشکر احسان

baktash.n81@gmail.com
سه شنبه 30 خرداد 1391, 09:20 صبح
خوب ... یکی از راه حل ها استفاده از Application Role در SQL Server هست ...

یک App Role درست می کنید و دسترسی های لازم رو بهش می دید ... بعد یه کاربر از توی برنامه به SQL وصل می شه شما با sp_setapprole سوییچ می کنید روی AppRole و ...

یه نگاهی به این (http://www.sqlteam.com/article/using-application-roles)بنداز ببین مشکلت رو حل می کنه ؟!

اینجا (http://www.codeproject.com/Articles/63894/Securing-Data-With-Application-Role)هم میتونی یه مثال DL کنی ...

r0ot$harp
سه شنبه 30 خرداد 1391, 16:15 عصر
ببین. مشکل این روش این هست که باید برای هر کاربر تک تک جدول ها رو دسترسی بدی.
دوم: برای من مهم هست که وقتی SP اجرا می شه تنها کاربری که باهاش لوگین کرده رو آیدی اون رو در بیار و به کوئری اضافه کنه و اجرا کنه. که این مشکل هم با تست های مختلف حل کردم. به زودی سورس هم می زارم. با استفاده از این روش می تونیم برای هر کاربر محدودیت بزارین و هر کاربر تنها می تونه اطلاعاتی رو که اسمش تو ردیف هست رو روش کار کنه.

باتشکر احسان

baktash.n81@gmail.com
سه شنبه 30 خرداد 1391, 16:38 عصر
اتفاقا از روش APP Role زمانی استفاده می شه که کاربرا زیاد هستن و نمی خوان به همشون تک تک دسترسی بدن ... در نتیجه فقط برای کاربرها Login می سازن و کاربرها روی هیچ چیز دسترسی مستقیم ندارن ... دسترسی ها فقط به به APP Role داده می شه البته این روش معایبی داره ولی اون چیزی که شما گفتی نیست ...

برای اینکه UserName رو دربیاری می تونی از توابع زیر استفاده کنی ...


select user_name();
select current_user();
select original_login();
select suser_sname();


یه فیلد هم تو جدولت اضافه کن برای UserName بعد با یه شرط Where به راحتی می تونی رکوردهای هر کسیو در بیاری ... البته اگه هر رکورد فقط مربوط به یه نفر می شه ... درغیر اینصورت باید از جدول واسط استفاده کنی ...

r0ot$harp
سه شنبه 30 خرداد 1391, 21:21 عصر
اتفاقا از روش APP Role زمانی استفاده می شه که کاربرا زیاد هستن و نمی خوان به همشون تک تک دسترسی بدن ... در نتیجه فقط برای کاربرها Login می سازن و کاربرها روی هیچ چیز دسترسی مستقیم ندارن ... دسترسی ها فقط به به APP Role داده می شه البته این روش معایبی داره ولی اون چیزی که شما گفتی نیست ...

برای اینکه UserName رو دربیاری می تونی از توابع زیر استفاده کنی ...


select user_name();
select current_user();
select original_login();
select suser_sname();


یه فیلد هم تو جدولت اضافه کن برای UserName بعد با یه شرط Where به راحتی می تونی رکوردهای هر کسیو در بیاری ... البته اگه هر رکورد فقط مربوط به یه نفر می شه ... درغیر اینصورت باید از جدول واسط استفاده کنی ...


باتشکر از پاسخ های شما.
من چندتا سوال می کنم. هم شما متوجه حرف من بشین هم من متوجه حرف شما.

من 20 هزار کاربر دارم. که یه سری از این کاربر فوق العاده باهوش و زرنگ. بعضی وقتا به خاطر امنیتی بودن کار به سرشون می زنه که با برنامه ور برن و خراب کاری کنند. خوب. حالا اگر دسترسی مستقیم بدم یا اینکه تو کوئری های ارسال از طرف کاربرا بیام و محدودیت بزارم برای جداسازی هر کاربر به مشکل بزرگی بر می خورم که نتیجش می شه لو رفتن اطلاعات همه. اما با استفاده از SP و قرار دادن Filter برای کاربرا می تونم نیاز خودم رو به طور عالی برآورده کنم. حالا نمی دونم Application Role قابلیت فیلتر کردن روی هر Field از هر رکوردی رو داره>>؟؟؟؟

باتشکر احسان

baktash.n81@gmail.com
چهارشنبه 31 خرداد 1391, 07:49 صبح
شما سئوالتون در مورد دسترسی دادن به کاربرها تو SQL بود ... منم روشی رو که لازم نیست به کاربرا به صورت تک تک دسترسی بدین رو گفتم ... این هیچ ربطی به اینکه از sp استفاده بشه یا نشه نداره ... شما از اول هم می تونستید با یه کاربر به SQL وصل بشید و امنیت اطلاعات یا همون فیلتر کردن رو با جداول کمکی خودتون انجام بدین ... مثل خیلی دیگه از برنامه ها که از اصلا با کاربر SQL کاری ندارن و کاربرا از SSO یا کاربر خاص اون برنامه استفاده می کنن در این برنامه ها Connection String رمز می شه و یه جایی نگه داری می شه ...

r0ot$harp
سه شنبه 02 آبان 1391, 19:29 عصر
سلام دوستان
قبلا این بحث رو تا به اینجا رسوندیم. من روشی رو بیان کردم و دوستان هم استفاده از Application Role رو پیشنهاد دادن. الان پروژه ای رو تو دست داریم که یه پروژه بزرگ دولتی هست. می خوام کاربران به بانک اطلاعات دسترسی مستقیم نداشته باشند. منظورم این هست که کسی به منظور خرابکاری نیاد سورس برنامه رو در بیار و ببینه Connection String چیه و مستقیم وصل بشه به بانک اطلاعاتی و خراب کاری کنه. از اونجایی هم که سیستم خیلی بزرگ هست استفاده از وب سرویس رو منطقی نمی بینیم. چون زمانمون خیلی خیلی کم هست. حالا دوستان نظر شما چیه ؟؟؟؟ چی کار کنیم؟؟؟

باتشکر احسان