وقتی صحبت از هک و نقص امنیتی میشود، اولین چیزی که اغلب به ذهن شنونده میرسد لورفتن رمز عبور است. درصورتیکه کاربرها از ترکیب ایمیل یا نام کاربری به همراه رمز عبور یکسان برای ثبتنام استفاده کرده باشند، هکرها میتوانند دادههای رمز عبور را برای دسترسی به سایر حسابهای کاربری در وبسایتهای مختلف استفاده کنند.
احراز هویت و مدیریت رمز عبور
در این مطلب از سری مقالههای کدنویسی امن به موضوع احراز هویت و مدیریت رمز عبور میپردازیم. احراز هویت و مدیریت رمز عبور بخشهای حیاتی هر سیستمی هستند و از ثبتنام کاربر گرفته تا ذخیرهسازی اطلاعات هویتی، تنظیم مجدد رمز عبور و دسترسی به منابع خصوصی را شامل میشوند.
احراز هویت(Authentication)
برای شروع به برخی قوانین در ظاهر ساده اشاره میکنیم که با رعایت آنها میتوانیم تا حد زیادی از امنیت سیستم احراز هویت خود اطمینان داشته باشیم.
همه کنترلهای احراز هویت باید در یک سیستم قابلاعتماد اجرا شوند که معمولاً سروری است که بکاند برنامه در آن اجرا میشود. برای سادگی و سهولت اجرا و همچنین کاهش ریسک آسیبپذیربودن باید از خدمات احراز هویت استاندارد و آزمایش شده استفاده کنید. معمولاً فریمورکها از قبل چنین ماژولی دارند و بهتر است که از این ماژولها استفاده کنید. به این دلیل که توسط بسیاری از افراد بهعنوان مکانیزم احراز هویت بهکارگیری میشوند و وظیفه توسعه و نگهداری آنها بر عهده تعداد بسیاری از توسعهدهندگان است و توسط بسیاری از افراد مورد تست و ارزیابی قرار میگیرد. بااینوجود شما باید فرایند و روال اجرای کد را بهدقت بررسی کنید تا مطمئن شوید که هیچ کد مخربی روی اجرای صحیح ماژول احراز هویت شما تأثیر مخربی نگذاشته است.
از کنترل احراز هویت متمرکز استفاده کنید. صفحات و منابعی که نیاز به احراز هویت دارند نباید احراز هویت را بهصورت جداگانه انجام دهند. در عوض باید به صفحه کنترل احراز هویت متمرکز برنامه منتقل شوند (در زمینه انتقال به صفحات دیگر در آینده بیشتر صحبت خواهیم کرد)
احراز هویت نباید تنها توسط کاربران برنامه استفاده شود، بلکه باید توسط برنامه خود شما نیز در زمانی که نیاز به “اتصال به سیستم های خارجی که شامل اطلاعات یا عملکردهای حساس هستند” استفاده شود. در این موارد، مدارک احراز هویت (authentication credentials) مانند رمز عبورها پینها و یا اعتبارنامهها (certificate) برای دسترسی به خدمات خارج از برنامه باید رمزگذاری شده و در یک مکان محافظت شده در یک سیستم قابلاعتماد (بهعنوانمثال، سرور) ذخیره شود. توجه داشته باشید که کد منبع یک مکان امن نیست و نباید این اطلاعات را داخل کد قرار دهید.
مدیریت رمز عبور (Password Management)
اما بپردازیم به مطلبی که ابتدای مقاله درباره آن صحبت کردیم. رمز عبورها دروازه ورود به سامانهها و یکی از اهداف اصلی هکرها برای تست و نفوذ بهحساب میآیند. حملات مختلفی برای یافتن رمز عبور یا دورزدن آن تعریف و مورداستفاده قرار میگیرد، به همین دلیل پیادهسازی امن ماژول مدیریت رمز عبور در هر سامانهای یکی از حیاتیترین موارد در بحث کدنویسی امن محسوب میگردد. برای مبارزه با سرقت رمز عبور، احراز هویت چندعاملی به یک فرایند امنیتی محبوب تبدیل شده است. برای اجرا از موارد زیر برای اطمینان از امنیت کدهای خود استفاده کنید:
- الزامات طول و نویسه رمز عبور را اعمال کنید (یعنی حداقل ۸ کاراکتر با یک حرف بزرگ، یک عدد و یک نماد)
- پس از چندین بار تلاش نادرست، تلاشهای اضافی برای ورود به سیستم را غیرفعال کنید.
- فقط نسخههای رمزنگاری دادههای رمز عبور (بهجای متن ساده) را ذخیره کنید.
برخی از تکنیکهای اشاره شده توسط OWASP را در ادامه بهصورت چکلیست تهیه کردهایم که میتوانید باتوجهبه نیاز سامانه خود تمام یا بخشی از آن را پیادهسازی نمایید:
- نیاز به احراز هویت برای همه صفحات و منابع، به جز مواردی که به طور خاص بهصورت عمومی در نظر گرفته شده است.
- تمام کنترلهای احراز هویت باید در یک سیستم قابلاعتماد اجرا شوند.
- هر زمان که ممکن است، خدمات تأیید هویت استاندارد، آزمایش شده را ایجاد و استفاده کنید. احراز هویت را بهصورت دورهای تکرار نمایید.
- از یک پیادهسازی متمرکز برای همه کنترلهای احراز هویت، از جمله کتابخانههای موجود در فریمورکها استفاده کنید.
- فرایند احراز هویت را از منبع درخواستکننده جدا کنید و کاربر را به صفحه کنترل احراز هویت متمرکز انتقال دهید.
- همه کنترلهای احراز هویت در هر مرحله باید مکانیزم کنترل شکست داشته باشند تا در صورت بروز خطا سیستم با مشکل مواجه نگردد.
- همه عملکردهای مدیریتی و مدیریت حساب باید حداقل بهاندازه مکانیزم احراز هویت اولیه ایمن باشند. (برای مثال تغییر رمز عبور یا حذف حساب کاربری)
- برای ذخیرهسازی مدارک احراز هویت، از رمزگذاری یکطرفه قوی به همراه هشهای نمکی (Salted Hashes)استفاده کنید
- هش رمز عبور باید در سمت سرور سیستم قابلاعتماد اجرا شود نه سمت مشتری
- فقط پس از تکمیل تمام دادههای ورودی، آنها را سمت سرور ارسال و مورد بررسی قرار دهید.
- پاسخهای خطای احراز هویت نباید نشان دهد که کدام قسمت از دادههای احراز هویت نادرست بوده است.
- از احراز هویت برای اتصالات به سیستم های خارجی که شامل اطلاعات یا عملکردهای حساس هستند، استفاده کنید.
- مدارک احراز هویت (Authentication Credentials) برای دسترسی به خدمات خارج از برنامه باید در محلی امن ذخیره شود.
- فقط از درخواستهای HTTP POST برای انتقال مدارک احراز هویت استفاده کنید.
- رمزهای عبور غیرموقت را فقط از طریق یک اتصال رمزگذاری شده یا بهصورت داده رمزگذاری شده ارسال کنید.
- در مورد رمز عبورها از الزامات پیچیدگی و خطمشیهای موجود در بهروشها (Best Practices) استفاده کنید.
- الزامات طول رمز عبور تعیین شده توسط خطمشیها و بهروشها را اعمال کنید.
- رمز عبور نباید هنگام واردشدن بر روی صفحهنمایش کاربر نمایش داده شود.
- پس از تعداد مشخصی از تلاشهای نامعتبر برای ورود به سیستم، حساب را غیرفعال کنید.
- عملیات بازنشانی و تغییر رمز عبور به همان سطحی از کنترلها نیاز دارد که ایجاد حساب و تأیید اعتبار. کنترلهای موجود را بازنشانی رمز عبور نیز انجام دهید.
- سؤالات بازنشانی رمز عبور باید از پاسخهای تصادفی کافی پشتیبانی کند تا قابل حدسزدن و بررسی خودکار نباشد.
- اگر از بازنشانیهای مبتنی بر ایمیل استفاده میکنید، فقط به یک نشانی از پیش ثبت شده ایمیل ارسال کنید و توجه داشته باشید که یک پیوند یا رمز عبور موقت ارسال شود که با گذشت زمان مشخصی منقضی میگردد.
- رمزهای عبور موقت و پیوندها باید مدتزمان انقضای کوتاهی داشته باشند.
- هنگام استفاده بعدی، کاربر را ملزم به تغییر رمز عبور موقت نمایید.
- هنگام بازنشانی رمز عبور به کاربران اطلاع دهید.
- از استفاده از رمز عبور تکراری جلوگیری نمایید.
- برای تغییر مجدد رمز عبور باید حداقل یک روز از بازنشانی قبلی گذشته باشد تا مجدد این امکان برای کاربر فراهم گردد. تا از حمله “استفاده مجدد از رمز عبور” جلوگیری شود (Attacks on password reuse)
- عملکرد “مرا به خاطر بسپار” را برای فیلدهای رمز عبور غیرفعال کنید.
- آخرین استفاده (موفق یا ناموفق) از یک حساب کاربری باید در ورود موفقیتآمیز بعدی به کاربر گزارش شود.
- اجرای فرایند نظارتی برای شناسایی حملات علیه چندین حساب کاربری، با استفاده از رمز عبور یکسان.
- همه گذرواژههای پیشفرض استفاده شده هنگام توسعه سامانه به همراه حسابهای کاربری قرار گرفته در اختیار تیمهای کارفرمایی یا تست را تغییر دهید یا حسابهای مرتبط را غیرفعال نمایید.
- قبل از انجام عملیات حیاتی کاربران را مجدداً احراز هویت کنید.
- از احراز هویت چندعاملی برای حسابها استفاده کنید.
- اگر از کد شخص ثالث برای احراز هویت استفاده میکنید، کد را بهدقت بررسی کنید تا مطمئن شوید که توسط کد مخربی تحتتأثیر قرار نگرفته است.
کدنویسی امن
- اعتبارسنجی ورودیها
- کدگذاری خروجیها
- احراز هویت و مدیریت رمز عبور
- مدیریت نشستها