اصول امنيت برنامه های وب

( بخش اول )
اينترنت و به دنبال آن وب ، دنيای نرم افزار را دستخوش تحولات فراوانی نموده است . ظهور نسل جديدی از برنامه های كامپيوتری موسوم به “برنامه های وب ” از جمله اين تحولات عظيم است . پس از ارائه سرويس وب در سال ۱۹۹۱، وب سايت های متعددی ايجاد گرديد . اينگونه سايت ها به منظور ارائه اطلاعات به مخاطبان خود از صفحات وب ايستا استفاده می كردند .

در چنين وب سايت هائی ، امكان تعامل كاربر با برنامه وجود نداشت .
با توجه به اين كه رويكرد فوق با ماهيت و يا روح نرم افزار چندان سازگار نمی باشد ، تلاش های گسترده ای در جهت ايجاد محتويات پويا انجام و متعاقب آن ، فن آوری های متعددی ايجاد گرديد . به عنوان نمونه ، با پياده سازی فن آوری CGI ( برگرفته از Common Gateway Interface ) ، امكان استفاده از برنامه های خارجی به منظور توليد محتويات پويا فراهم گرديد . بدين ترتيب ، كاربران قادر به درج اطلاعات و ارسال آنها برای يك برنامه خارجی و يا اسكريپت سمت سرويس دهنده شدند . برنامه موجود در سمت سرويس دهنده پس از دريافت اطلاعات و انجام پردازش های تعريف شده ، نتايج را توليد و آنها را برای كاربر ارسال می نمود .

رويكرد فوق ،‌ به عنوان نقطه عطفی در برنامه های وب تلقی می گردد چراكه برای اولين مرتبه امكان توليد محتويات پويا در وب سايت ها فراهم گرديد . از آن زمان تاكنون فن آوری های متعددی به منظور توليد برنامه های وب ايجاد شده است . PHP و ASP.NET نمونه هائی در اين زمينه می باشند . صرفنظر از اين كه از كدام فن آوری به منظور ايجاد برنامه های وب استفاده می گردد ، ايمن سازی آنان از جمله اهداف مشترك تمامی پياده كنندگان است .

امنيت برنامه های‌ وب و برداشت های اوليه
زمانی كه در رابطه با امنيت برنامه های وب سخن به ميان می آيد ، تهاجم عليه يك سايت ،‌ سرقت كارت های اعتباری ، بمباران وب سايت ها در جهت مستاصل كردن آنان به منظور ارائه خدمات و سرويس های تعريف شده ، ويروس ها ، تروجان ها ، كرم ها و … در ذهن تداعی می گردد . صرفنظر از نوع برداشت ما در رابطه با موارد فوق ،‌ می بايست بپذيريم كه تهديدات امنيتی متعددی متوجه برنامه های وب با توجه به ماهيت آنان می باشد .

سازمان ها و يا موسساتی كه از اينگونه برنامه ها استفاده می نمايند و يا در صدد طراحی و پياده سازی آنان می باشند ، می بايست به اين نكته مهم توجه نمايند كه ايمن سازی يك برنامه وب ، محدود به بكارگيری يك فن آوری خاص نبوده و فرآيندی است مستمر كه عوامل انسانی و غيرانسانی متعددی می توانند بر روی آن تاثيرگذار باشند .
امنيت برنامه های وب را می بايست با توجه به
نوع معماری و رفتار آنان بررسی نمود .

برداشت های غيرواقعی از امنيت برنامه های وب
متاسفانه به دليل عدم شناخت لازم در خصوص ماهيت برنامه های وب از يك طرف و از سوی ديگر عدم آشنائی لازم با مفاهيم امنيت ،‌ شاهد برداشت های نادرست در خصوص امنيت برنامه های وب می باشيم . اجازه دهيد به چند نمونه در اين خصوص اشاره نمائيم :
• ما ايمن هستيم چون از يك فايروال استفاده می نمائيم . اين تصور كاملا” اشتباه است و به نوع تهديد بستگی خواهد داشت . مثلا” يك فايروال قادر به تشخيص داده ورودی مخرب جهت ارسال به يك برنامه وب نمی باشد .

فايروال ها دارای عملكردی قابل قبول در رابطه با اعمال محدوديت بر روی پورت ها می باشند و برخی از آنان می توانند همزمان با بررسی اطلاعات مبادله شده ،‌ امكانات برجسته حفاظتی را ارائه نمايند . فايروال ها جزء لاينفك در يك فريمورك امنيتی می باشند ولی نمی توان آنان را به عنوان يك راهكار جامع به منظور ايجاد و برپائی يك محيط ايمن در نظر گرفت .
• ما ايمن هستيم چون از SSL ( برگرفته ازSecure Sokets Layer ) استفاده می نمائيم . SSL برای رمزنگاری ترافيك موجود بر روی شبكه يك گزينه ايده آل است ولی قادر به بررسی داده ورودی يك برنامه نمی باشد .

• ما ايمن هستيم چون از سيستم عاملی استفاده می نمائيم كه نسبت به ساير سيستم های عامل دارای امنيت بيشتری است . استدلال فوق با فرض درست بودن اصل قضيه ، نادرست و غيرمنطقی است چراكه امنيت يك فرآيند است نه يك محصول . بنابراين با بكارگيری يك محصول خاص ( به عنوان نمونه يك سيستم عامل ) نمی توان اين ادعا را داشت كه ما به يك محيط ايمن به منظور ايجاد برنامه های وب دست يافته ايم .
با رد امنيت يك سيستم عامل نمی توان امنيت يك سيستم عامل ديگر را تائيد نمود.
( من خوبم چون شما بد هستيد ! )

امنيت چيست ؟
اولين رسالت امنيت ، حفاظت از سرمايه های يك سازمان است كه ممكن است شامل آيتم های ملموسی نظير يك صفحه وب و يا بانك اطلاعاتی مشتريان و يا آيتم های غيرملموسی نظير شهرت و اعتبار يك سازمان باشد. امنيت يك مسير است نه يك مقصد و به موازات تجزيه و تحليل زيرساخت و برنامه های موجود ، می بايست اقدام به شناسائی تهديدات و خطرات ناشی از آنان نمود . در واقع ، امنيت به مديريت خطرات و پياده سازی يك سيستم به منظور پاسخگوئی و مقابله با تهديدات اشاره داشته و در ارتباط با عتاصر كليدی زير است :

• Authentication ، فرآيندی است كه به كمك آن به صورت منحصربفرد سرويس گيرندگان يك برنامه شناسائی می گردند . كاربران ، سرويس ها ، فرآيندها و كامپيوترها ، نمونه هائی از سرويس گيرندگان يك برنامه می باشند . در واقع ، authentication هويت استفاده كنندگان يك برنامه را بررسی می نمايد .
• Authorization ، فرآيندی است كه به كمك آن دستيابی سرويس گيرندگان تائيد شده به منابع و عملياتی كه قصد انجام آن را دارند بررسی و مجوز لازم صادر می گردد.

فايل ها ، بانك های اطلاعاتی ، جداول ، سطرها ، منابع موجود در سطح سيستم نظير كليدهای ريجتسری و داده پيكربندی ، نمونه هائی از منابع مورد درخواست سرويس گيرندگان می باشند . انجام تراكنش هائی خاص نظير خريد يك محصول ، واريز و انتقال پول از يك حساب به حساب ديگر و يا افزايش اعتبار يك كارت اعتباری از جمله عملياتی می باشند كه می بايست مجوز استفاده از آنان برای سرويس گيرندگان صادر گردد . در واقع ، authorization محدوده مجاز عملياتی را كه يك سرويس گيرنده می تواند انجام دهد را مشخص می نمايد .

• Auditing : مميزی موثر و ثبت عمليات انجام شده يكی از اصول مهم در جلوگيری از انجام اعمال خلاف قانون است . بدين ترتيب اين اطمينان ايجاد خواهد شد كه يك كاربر نمی تواند باعث عدم انحام يك كار و يا فعاليت در سيستم گردد و يا يك تراكنش را مقداردهی اوليه نمايد . مثلا” در يك سيستم e-commerce می بايست از مكانيزم هائی استفاده گردد تا اين اطمينان حاصل گردد كه يك مصرف كننده نمی تواند سفارش انجام شده برای خريد يكصد نسخه از يك كتاب را انكار نمايد .

• Confidentiality ، كه از آن با نام privacy نيز نام برده می شود ، فرآيندی است كه به كمك آن اين اطمينان ايجاد می گردد كه حريم خصوصی داده رعايت و امكان مشاهده آن توسط كاربران غيرمجاز و يا ساير افرادی كه قادر به رديابی ترافيك يك شبكه می باشند ، وجود نخواهد داشت .
• Integrity ، فرآيندی است كه به كمك آن اين اطمينان ايجاد می گردد كه داده در مقابل تغييرات تصادفی و يا تعمدی حفاظت خواهد شد . همانند privacy ، يكپارچگی اطلاعات يك فاكتور اساسی در خصوص امنيت داده محسوب می گردد ، خصوصا” در مواردی كه داده در طول شبكه مبادله خواهد شد . يكپارچگی داده در حال حمل ،‌عموما” با استفاده از روش هائی نظير hashing و يا كدهای تائيد پيام انجام می شود .

• Availability ، فرآيندی است كه به كمك آن اين اطمينان ايجاد خواهد شد كه همواره داده برای كاربران مجاز در دسترس و قابل استفاده خواهد بود . در اغلب حملات از نوع DoS ، مهاجمان اين هدف را دنبال می نمايند كه بتوانند امكان استفاده و در دسترس بودن برنامه برای كاربران مجاز را غيرممكن و عملا” آن را از كار بيندازند .

تعاريف اوليه برخی از اصطلاحات امنيتی : تهديدات ، نقاط آسيب پذير و حملات
• تهديد ( threat ) : به هرگونه پتانسيل بروز يك رويداد مخرب و يا ساير موارد ديگر كه می تواند به سرمايه های يك سازمان آسيب برساند ، تهديد گفته می شود . به عبارت ديگر، هر رويدادی كه بتواند به سرمايه های يك سازمان آسيب برساند ، در زمره تهديدات محسوب می گردد .
• نقاط آسيب پذير (vulnerability) : ضعف های موجود در يك سيستم می باشند كه پتانسيل اوليه بروز يك رويداد مخرب را فراهم می نمايند . ضعف در طراحی ، پيكربندی اشتباه ، استفاده از روش های كدينگ غيرايمن مهمترين دلايل ايجاد يك ضعف در سيستم می باشند . ضعف در بررسی صحت داده ورودی توسط كاربر ، نمونه ای از يك لايه آسيب پذير در يك برنامه است كه می تواند زمينه بروز يك تهاجم را فراهم نمايد .

• تهاجم (attack) : عملياتی است كه محوريت آن سوء استفاده از نقاط آسيب پذير و پتانسيل های بروز يك رويداد مخرب می باشد . ارسال ورودی مخرب به يك برنامه و يا flooding يك شبكه به منظور از كار انداختن يك سرويس ، نمونه هائی در اين زمينه می باشد .
يك تهديد پتانسيل بروز يك رويداد مخرب را فراهم می نمايد كه می تواند به سرمايه های يك سازمان آسيب برساند
در حالی كه در يك تهاجم موفقيت آميز از نقاط آسيب پذير موجود در سيستم استفاده می گردد .

چگونه می توان يك برنامه وب ايمن را ايجاد نمود ؟
تا زمانی كه شناخت مناسبی نسبت به تهديدات وجود نداشته باشد ، امكان ايجاد يك برنامه وب ايمن وجود نخواهد داشت . بنابراين قبل از هر چيز لازم است كه با “مدل تهديدات ” موجود آشنا شويم . هدف مدل فوق، آناليز معماری و نحوه طراحی برنامه به منظور شناسائی نقاط آسيب پذيری است كه ممكن است به صورت تصادفی توسط يك كاربر ناآگاه و يا مهاجمان با اهداف مخرب مورد سوء استفاده قرار گرفته تا با استناد به آنان بتوانند موجوديت و امنيت سيستم را با خطر مواجه نمايند .

پس از آسنائی با تهديدات ، می بايست با بكارگيری مجموعه ای از اصول امنيتی اقدام به طراحی سيستم نمود . در ادامه ، پياده كنندگان می بايست از روش های ايمن به منظور نوشتن كدهای مطمئن ، مستحكم و قابل اعتماد استفاده نمايند . پس از طراحی و پياده سازی برنامه ، می بايست از يك شبكه ايمن ، يك host مطمئن و يك پيكربندی مناسب بر روی سرويس دهنده ،‌ استفاده گردد .
ايجاد يك برنامه وب ايمن ، مستلزم اقدامات امنيتی چند جانبه ای است كه موفقيت در تمامی آنان ، ايمن بودن برنامه های‌ وب را تضمين خواهد كرد . ايمن سازی شبكه ، host و برنامه ، رئوس مثلث امنيتی ايجاد برنامه های وب ايمن را تشكيل می دهند .

ايمن سازی شبكه ، host و برنامه
به منظور ايجاد برنامه های وب ايمن ، تبعيت از يك رويكرد جامع امری است الزامی . بنابراين ، می بايست امنيت برنامه های‌ وب را در سه لايه متفاوت بررسی و اقدامات لازم را در هر لايه با توجه به جايگاه آن انجام داد . شكل زير سه لايه مهم به منظور ايجاد برنامه های وب ايمن را نشان می دهد .

وجود يك نقطه آسيب پذير در شبكه به يك مهاجم اجازه می دهد تا كنترل يك host و يا برنامه را بدست بگيرد .
وجود يك نقطه آسيب پذير در host به يك مهاجم اجازه می دهد تا بتواند كنترل يك شبكه و يا برنامه را بدست بگيرد .
وجود يك نقطه آسيب پذير در برنامه به يك مهاجم اجازه می دهد تا كنترل يك host و يا شبكه را بدست بگيرد .
در بخش دوم به بررسی هر يك از لايه های فوق خواهيم پرداخت .
________________________________________
اصول امنيت برنامه های وب ( بخش دوم )
در بخش اول به اين موضوع اشاره گرديد كه به منظور ايجاد برنامه های وب ايمن ، می بايست از يك رويكرد جامع تبعيت و بر روی سه لايه متفاوت شبكه ، host و برنامه متمركز گرديد. در اين بخش به بررسی ايمن سازی شبكه خواهيم پرداخت .

ايمن سازی شبكه
شبكه ، نقطه ورود به يك برنامه وب است و اولين لايه حفاظتی به منظور كنترل دستيابی به سرويس دهندگان متعدد موجود در محيط عملياتی را فراهم می نمايد . با اين كه سرويس دهندگان توسط سيستم های عامل نصب شده بر روی خود حفاظت می گردند ولی نمی بايست به اين موضوع صرفا” اكتفاء نمود و لازم است كه تدابير لازم به منظور حفاظت آنها در مقابل ساير تهديدات ( نظير ارسال سيلابی ‌از بسته های اطلاعاتی از طريق لايه شبكه ) نيز انديشيده گردد .

ايمن سازی شبكه ، شامل حفاظت از دستگاه های شبكه ای و داده مبادله شده بر روی آنها می باشد . روتر ،‌ فايروال و سوئيچ عناصر اوليه زيرساخت يك شبكه را تشكيل می دهند . شكل زير نحوه استفاده از عناصر فوق را در يك شبكه نشان می دهد .

عناصر شبكه : روتر ،‌ فايروال و سوئيچ
يك برنامه وب بر روی يك زيرساخت شبكه ای ايمن فعاليت و به كاربران خود سرويس های لازم را ارائه می نمايد . برای ايمن سازی شبكه ، علاوه بر اين كه شبكه می بايست در مقابل حملات مبتنی بر TCP/IP از خود محافظت نمايد ، بلكه لازم است اقدامات متعدد ديگری نيز در اين رابطه انجام شود . ايجاد اينترفيس های مديريتی ايمن، استفاده از رمزهای عبور قدرتمند ، حصول اطمينان از صحت ترافيك ارسالی از جمله اقدامات ديگر در خصوص ايجاد يك شبكه ايمن می باشد . بدين منظور لازم است كه پورت ها و پروتكل های استفاده شده در هر لايه به دقت بررسی و در صورتی كه وجود آنها غيرضروری تشخيص داده شود و يا استفاده از آنها زمينه بروز تهديداتی را فراهم می نمايد ،‌ می بايست در همان لايه با آنان برخورد و از يك راهكار مناسب امنيتی استفاده گردد .
وجود ضعف امنيتی در يك شبكه زمينه بروز تهديدات متعددی را فراهم می نمايد . بدون شناسائی اينگونه تهديدات ، امكان مقابله منطقی با آنان وجود نخواهد داشت .

تهديدات
يك مهاجم به منظور برنامه ريزی حملات خود به دنبال دستگاه های شبكه ای است كه بر روی آنها پيكربندی ضعيفی اعمال شده است . تنظيمات ضعيف پيش فرض ، دستيابی بدون ضابطه به منابع موجود بر روی شبكه ، وجود دستگاه هائی كه به درستی patch و يا بهنگام نشده اند، حفره های امنيتی متعددی را در يك شبكه ايجاد می نمايد . وجود حفره های امنتيی فوق و عدم برخورد مناسب با آنها ، احتمال موفقيت مهاجمان را افزايش می دهد .
مهمترين تهديدات در يك شبكه عبارتند از :
• جمع آوری اطلاعات
• sniffing
• spoofing
• session hijacking
• DoS ( برگرفته از Denial of Service )

با آگاهی از ماهيت هر يك از تهديدات فوق و نحوه تاثير آنها بر روی عملكرد شبكه ، می توان امكانات حفاظتی و تدافعی مناسبی را در يك شبكه پيش بينی و پياده سازی نمود.
در ادامه به بررسی مختصر هر يك از تهديدات فوق خواهيم پرداخت .

جمع آوری اطلاعات
مهاجمان در اولين مرحله ،‌اقدام به جمع آوری اطلاعات در رابطه با اهداف خود می نمايند . جمع آوری اطلاعات می تواند باعث افشای اطلاعات توپولوژی شبكه ، پيكربندی سيستم و دستگاه های شبكه ای گردد . يك مهاجم می تواند در ادامه با استفاده از اطلاعات جمع آوری شده بر روی نقاط آسيب پذير متمركز و از حفره های امنيتی موجود در جهت تامين خواسته های مخرب خود استفاده نمايد .

نقاط آسيب پذير
متداولترين نقاط آسيب پذيری كه شبكه را مستعد اين نوع از حملات می نمايد عبارتند از :
• ماهيت غيرايمن ذاتی پروتكل TCP/IP
• پيكربندی ضعيف دستگاه های شبكه ای
• استفاده غيرايمن از سرويس هائی كه به وجود آنها در يك شبكه نياز نمی باشد .

حملات
متداولترين حملات مبتنی بر “جمع آوری اطلاعات” عبارتند از :
• استفاده از Tracert به منظور تشخيص توپولوژی شبكه
• استفاده از Telnet به منظور باز نمودن پورت ها و جمع آوری اطلاعات اوليه
• استفاده از پويشگرهای پورت به منظور تشخيص وضعيت پورت ها
• استفاده از درخواست های broadcast برای شمارش تعداد host موجود بر روی يك subnet

پيشگيری و مقابله با تهديدات
به منظور پيشگيری و مقابله با اين نوع حملات می توان از روش های زير استفاده نمود :
• استفاده از امكاناتی كه اطلاعات اضافه ای را در خصوص پيكربندی نظير نام و شماره نسخه نرم افزار ارائه نمی نمايد .
• استفاده از فايروال ها به منظور پوشش سرويس هائی كه نمی بايست در معرض ديد و استفاده عموم قرار داده شوند .

sniffing
sniffing كه به آن “استراق سمع ” نيز گفته می شود ، مانيتورينگ ترافيك شبكه برای داده هائی نظير رمزهای عبور ( رمزنشده) و يا اطلاعات پيكربندی است . با استفاده از يك برنامه packet sniffer ، می توان به سادگی تمامی ترافيك plain text ( رمز نشده ) را مشاهده نمود .
نقاط آسيب پذير
متداولترين نقاط آسيب پذيری كه شبكه را مستعد اين نوع از حملات می نمايد عبارتند از :
• ضعف امنيت فيزيكی
• ضعف رمزنگاری در زمان ارسال داده حساس و مهم
• وجود سرويس هائی كه با يكديگر به صورت متن معمولی ( رمز نشده ) ارتباط برقرار می نمايند .
• استفاده از الگوريتم های ضعيف رمزنگاری

حملات
مهاجمان با قرار دادن يك packet sniffer بر روی شبكه می توانند تمامی ترافيك را capture و آناليز نمايند .
پيشگيری و مقابله با تهديدات
به منظور پيشگيری و مقابله با اين نوع حملات می توان از روش های زير استفاده نمود :
• استفاده از يك سيستم امنيت فيزيكی مناسب به منظور پيشگيری از نصب دستگاه های مخرب بر روی شبكه
• رمزنگاری اطلاعات حساس و ترافيك برنامه بر روی شبكه

Spoofing
spoofing ، كه به آن “هويت مبهم ” نيز گفته می شود ، به كتمان هويت واقعی بر روی شبكه اطلاق می گردد . در اين رابطه از يك آدرس مبداء جعلی كه بيانگر آدرس اوليه صادركننده پيام نمی باشد ، استفاده می گردد . در بسياری موارد از spoofing به منظور مخفی كردن منبع بروز يك تهاجم استفاده می شود. در برخی موارد كه دستيابی به منابع موجود بر روی شبكه بر اساس آدرس متقاضيان انجام می شود ، مهاجمان با تغيير آدرس مبداء سعی می نمايند به اينگونه از منابع دستيابی پيدا نمايند .

نقاط آسيب پذير
متداولترين نقاط آسيب پذيری كه شبكه را مستعد اين نوع از حملات می نمايد عبارتند از :
• ماهيت غيرايمن ذاتی پروتكل TCP/IP
• ضعف در فيلترينگ بسته های اطلاعاتی ورودی و خروجی : ترافيك ورودی و خروجی شبكه به درستی كنترل و فيلتر نمی گردد (ingress & egress filtering )
حملات
يك مهاجم می تواند از ابزارهای متعددی به منظور تغيير آدرس بسته های خروجی استفاده نمايد تا اينچنين وانمود نمايد كه آنها از يك host و يا شبكه ديگر ارسال شده اند .
پيشگيری و مقابله با تهديدات
به منظور پيشگيری و مقابله با اين نوع حملات می توان از از فيلترينگ egress و ingress بر روی روتر های perimeter استفاده نمود .

session Hijacking
با استفاده از اين نوع حملات كه به آنها man in middle نيز گفته می شود ، مهاجمان می توانند از يك برنامه برای تغيير شكل ظاهری خود به عنوان يك سرويس گيرنده و يا سرويس دهنده موجه استفاده نمايند . بدين ترتيب ، يك سرويس دهنده و يا سرويس گيرنده واقعی فريب خورده و فكر می كنند كه با يك host معتبر و مجاز ارتباط برقرار نموده اند . در واقع ، اين نوع كامپيوترهای ميزبان متعلق به مهاجمان بوده كه سعی می نمايند با دستكاری شبكه خود را به عنوان مقصد مورد نظر وانمود نمايند . از اين نوع حملات به منظور آگاهی از اطلاعات logon و دستيابی به سيستم و ساير اطلاعات محرمانه استفاده می گردد .

نقاط آسيب پذير
متداولترين نقاط آسيب پذيری كه شبكه را مستعد اين نوع از حملات می نمايد عبارتند از :
• ضعف در امنيت فيزيكی
• ماهيت غيرايمن ذاتی پروتكل TCP/IP
• مبادله اطلاعات به صورت رمزنشده

حملات
يك مهاجم می تواند از ابزارهای متعددی به منظور انجام عمليات spoofing ، تغيير روتينگ و دستكاری بسته های اطلاعاتی استفاده نمايد.

پيشگيری و مقابله با تهديدات
به منظور پيشگيری و مقابله با اين نوع حملات می توان از روش های زير استفاده نمود :
• رمزنگاری Session
• استفاده از روش Stateful inspection در سطح فايروال

DoS
در اين نوع از حملات ، امكان دستيابی كاربران مجاز به يك سرويس دهنده و يا سرويس خاص سلب می گردد .در حملات DoS لايه شبكه ، معمولا” مهاجمان با ارسال سيلابی از بسته های اطلاعاتی امكان استفاده از يك سرويس توسط ساير كاربران را سلب می نمايند . علاوه بر مشكل فوق ، در چنين مواردی از پهنای باند و منابع موجود بر روی شبكه استفاده بهينه نخواهد شد .