الصورة الكبيرة والتاريخ
كل موقع فيه "تسجيل دخول" بيجاوب على سؤالين: إنت مين؟ ومسموحلك بإيه؟ الدرس ده بيفرّق بينهم، وبيحكيلك إزاي وصلنا لكل حل موجود النهارده، من أول باسورد اتعمل سنة 1961.
- تفرّق بين Identification و Authentication و Authorization و Accounting
- تعرف إمتى ترجّع
401وإمتى403وإمتى404 - تحكي تاريخ الـ Auth، وتعرف كل حل اتعمل بعد أنهي اختراق
- تعرف يعني إيه MFA، وإمتى ميبقاش MFA رغم إن فيه خطوتين
1. Authentication و Authorization
تخيّل نادي كبير. على البوابة فيه بواب بيقولك “ورّيني الكارنيه”، وبيبص على الصورة وبيبص في وشك. ده Authentication.
دخلت جوه، وعايز تروح حمام السباحة، فيقولولك “ده لأعضاء الاشتراك الذهبي بس”. ده Authorization. البواب خلاص عرف إنت مين، والسؤال دلوقتي بقى عن حدودك.
وفيه خطوتين حواليهم بيكمّلوا الصورة. قبلهم Identification، وهي إنك تقول إنت مين. وبعدهم Accounting، وهو إنك تسجّل اللي حصل.
جرّب بنفسك: اختار مين اللي داخل ورايح فين، واتفرج على المراحل الأربعة وهي بتنور واحدة ورا التانية.
- Identificationإعلان الهوية
- Authenticationالتحقق من الهوية
- Authorizationفحص الصلاحية
- Accountingتسجيل العملية
| الخطوة | السؤال | في shop-lab |
|---|---|---|
| Identification | إعلان الهوية (Claim): المستخدم بيقول هو مين | كتبت الإيميل في صفحة الدخول |
| Authentication | التحقق من الادعاء ده (Verification) | الباسورد طلع صح |
| Authorization | فحص الصلاحية (Permission check) | تفتح /admin؟ تشوف الأوردر رقم 1043؟ |
| Accounting | تسجيل اللي حصل (Audit log) | سطر في الـ log: اليوزر 7 مسح المنتج 55 |
بتستخدمهم فين في المتجر؟
- صفحة “أوردراتي” محتاجة Authentication، لأن لازم نعرف إنت مين عشان نجيب أوردراتك.
- صفحة تعديل المنتجات محتاجة Authorization، لأن مش أي حد عامل login يبقى أدمن.
- “مين غيّر سعر المنتج ده امبارح؟” سؤال بيجاوبه الـ Accounting.
الـ Authentication هي التحقق من هوية المستخدم (Identity)، والـ Authorization هي تحديد صلاحياته (Permissions). والـ Authorization دايماً بتيجي بعد الـ Authentication.
2. الفرق بين 401 و 403
اسم الـ 401 الرسمي هو Unauthorized، وده غلط تاريخي في التسمية. المعنى الحقيقي ليها هو Unauthenticated. والمفروض كمان يرجع معاها header اسمه WWW-Authenticate بيقول للعميل يعرّف نفسه إزاي.
غيّر مين بيطلب وبيطلب إيه، واتفرج على الـ request رايح والرد راجع:
| الموقف في المتجر | الرد | ليه |
|---|---|---|
زائر بيفتح /orders |
تحويل لصفحة الدخول في الويب، أو 401 في الـ API | إحنا مش عارفين هو مين |
عميل عادي بيفتح /admin/products |
403 | عارفينه، بس هو مش أدمن |
| عميل بيفتح أوردر بتاع حد تاني | كتير بنرجّع 404 | عشان منأكدلوش إن الأوردر ده موجود أصلاً (تفاصيلها في المرحلة 3) |
401 Unauthorized يعني فشل في الـ Authentication، و 403 Forbidden يعني الـ Authentication نجح والـ Authorization فشل.
3. الحكاية من الأول
كل حل موجود النهارده جه عشان حاجة اتكسرت قبله، ولو فهمت إيه اللي اتكسر هتفهم ليه الحل شكله كده. عشان كده كل حدث هنا مكتوب جنبه الدرس اللي العالم اتعلمه منه. دوس على أي حدث عشان يتفتح.
العصر الأول: كمبيوتر واحد وناس كتير
في MIT، على نظام اسمه CTSS بيشتغل عليه كذا حد في نفس الوقت. Fernando Corbató حط باسورد لكل يوزر عشان محدش يستخدم ملفات أو وقت التاني.
الدرس: لما الموارد تبقى مشتركة، لازم كل واحد يثبت هو مين.
طالب دكتوراه اسمه Allan Scherr كان عايز وقت أكتر على الجهاز، فطبع ملف الباسوردات كله، لأنه كان متخزن نص عادي.
الدرس: متخزنش الباسورد زي ما هو.
Robert Morris و Ken Thompson نشروا ورقة عن أمان الباسوردات، وطبّقوا فكرتين لسه عايشين لحد النهارده: خزّن hash بدل الباسورد، وضيف salt عشوائي لكل يوزر.
الدرس: الأساس اللي هتشوفه في الدرس الجاي.
من MIT برضه. بتثبت نفسك مرة واحدة وتاخد "تذكرة" تدخل بيها خدمات كتير. ولسه شغال لحد النهارده جوه Windows Active Directory.
الدرس: دي جدّة فكرة الـ token والـ Single Sign-On.
العصر التاني: الويب
Tim Berners-Lee عمل HTTP stateless، يعني كل request لوحده والسيرفر مش فاكر اللي قبله. ده خلّى الويب بسيط وسهل يكبر، بس عمل مشكلة لأي حاجة فيها تسجيل دخول.
الدرس: لازم كل request يشيل معاه إثبات.
Lou Montulli في Netscape اخترعها عشان يحل مشكلة واحدة: إزاي موقع تجارة إلكترونية يفتكر إنت حطيت إيه في السلة وإنت بتنقل من صفحة لصفحة.
الدرس: الـ Cookie اتعملت أصلاً عشان نفس المشروع اللي إنت بتبنيه.
اتوثّقت رسمياً في RFC 1945. بتبعت اليوزر والباسورد مع كل request.
الدرس: بسيطة، بس ملهاش logout، والباسورد ماشي على الشبكة طول الوقت.
Niels Provos و David Mazières عملوا hash بطيء عن قصد، وتقدر تتحكم في بطؤه. ولسه هو الـ default في لارافيل.
الدرس: السرعة عدوّك لما الموضوع يبقى باسورد.
مطورين في Twitter كانوا عايزين التطبيقات التانية تستخدم حسابك من غير ما تديها الباسورد بتاعك.
الدرس: اسمح بالوصول من غير ما تشارك الباسورد (المرحلة 2).
العصر التالت: اختراقات كبيرة وحلول أكبر
اتسرب منها 32 مليون باسورد نص عادي. القايمة دي (rockyou.txt) لسه بتتستخدم في هجمات التخمين لحد النهارده.
الدرس: الناس كلها بتستخدم نفس الباسوردات الضعيفة.
الباسوردات كانت SHA-1 من غير salt. اتنشر 6.5 مليون hash واتكسر أغلبهم في أيام، وفي 2016 ظهر إن الرقم الحقيقي 117 مليون.
الدرس: الـ hash لوحده مش كفاية، لازم salt ولازم يبقى بطيء.
اتنشر في RFC 6749. أبسط من 1.0، وانتشر في كل حتة.
حوالي 150 مليون حساب. الباسوردات كانت متشفرة بطريقة ضعيفة بدل ما تتعمل hash، و"تلميح الباسورد" كان متخزن نص عادي جنبها.
الدرس: التشفير مش طريقة لتخزين الباسورد.
طبقة فوق OAuth 2.0 خلّت "Login with Google" تبقى إثبات هوية بجد.
الـ JWT اتوثّق في RFC 7519. و Argon2 كسب مسابقة Password Hashing Competition.
الجهة الأمريكية للمعايير قالت: بطّلوا تجبروا الناس يغيّروا الباسورد كل 90 يوم، وبطّلوا شروط "حرف كبير ورمز". المهم الطول، وإن الباسورد ميكونش مسرّب قبل كده.
الـ cookies بقت
SameSite=Laxافتراضياً، وده قفل باب لأغلب هجمات الـ CSRF.أبل وجوجل ومايكروسوفت أعلنوا الدخول من غير باسورد خالص، مبني على WebAuthn اللي بقى standard رسمي سنة 2019.
تخزين الباسورد اتطور كده: نص عادي، بعدين hash، بعدين salt، بعدين hash بطيء، وفي الآخر من غير باسورد خالص.
4. عوامل الإثبات
| النوع | معناه | أمثلة |
|---|---|---|
| Knowledge | حاجة إنت عارفها | باسورد، PIN |
| Possession | حاجة معاك | موبايلك (كود SMS أو Authenticator)، مفتاح أمان، Passkey |
| Inherence | حاجة هي إنت | بصمة، وشّ |
MFA (Multi-Factor Authentication) معناها إنك تستخدم نوعين مختلفين على الأقل. الفكرة إن الهاكر لو سرق الباسورد، لسه ناقصه موبايلك.
اختار أي طريقتين، وشوف هيقعوا في أنهي عمود:
حاجة إنت عارفها
Knowledgeحاجة معاك
Possessionحاجة هي إنت
Inherenceتفاصيل الـ MFA، زي إزاي كود الـ Authenticator بيشتغل من غير نت وليه الـ SMS أضعف، موجودة في آخر درس في المرحلة 3.
عدد العوامل مش هو المهم، المهم إن أنواعها تبقى مختلفة.
أسئلة الإنترفيو
فكّر في إجابتك الأول، وبعدين افتح السؤال.
01إيه الفرق بين Authentication و Authorization؟
Authentication بتثبت إنت مين، و Authorization بتحدد مسموحلك بإيه. الأولى دايماً قبل التانية. فشل الأولى بيدي 401، وفشل التانية بيدي 403.
02إمتى ترجّع 401 وإمتى 403؟
401 لما السيرفر مش عارف إنت مين (مفيش login أو الـ token غلط)، ومعاها WWW-Authenticate. 403 لما عارفك وبرضه مش مسموحلك. والاسم الرسمي للـ 401 (Unauthorized) غلط تاريخي، معناها الحقيقي Unauthenticated.
03باسورد + سؤال أمان يعتبر MFA؟
لأ. الاتنين من نوع واحد (حاجة إنت عارفها). الـ MFA لازم يبقى نوعين مختلفين: حاجة عارفها، أو حاجة معاك، أو حاجة هي إنت.
04ليه الـ HTTP اتعمل stateless، وده عمل مشكلة إيه؟
عشان أي سيرفر يقدر يرد على أي request من غير ذاكرة، وده خلّى الويب بسيط وسهل يكبر. المشكلة إن السيرفر مش فاكرك، فلازم كل request يشيل إثبات بنفسه: باسورد، أو session ID في cookie، أو token.