المقدمة
يوضح هذا المستند سمة رأس مصدق RADIUS ومصدق الرسالة، وكيفية إستخدامهما، ووقت توقع فشل التحقق من الصحة.
رأس المصدق
وفقا لمعيار RFC 2865، يبلغ طول رأس المصدق 16 بايت. وعند إستخدامه في طلب الوصول، يسمى مصدق الطلب. عند إستخدامه في أي نوع من الاستجابة، يطلق عليه مصدق الاستجابة. تستخدم من أجل:
- مصادقة الاستجابة
- إخفاء كلمة المرور
مصادقة الاستجابة
إذا استجاب الخادم باستخدام "مصدق الاستجابة" الصحيح، يمكن للعميل إجراء الحساب إذا كانت الاستجابة مرتبطة بطلب صالح.
يرسل العميل الطلب مع رأس المصدق العشوائي. بعد ذلك، يقوم الخادم الذي يرسل الاستجابة بحساب مصدق الاستجابة باستخدام حزمة الطلب مع السر المشترك:
ResponseAuth = MD5(Code + ID + Length + RequestAuth + Attributes + Secret)
يقوم العميل الذي يستقبل الاستجابة بتنفيذ العملية نفسها. إذا كانت النتيجة هي نفسها، فإن الحزمة صحيحة.
ملاحظة: يتعذر على المهاجم الذي يعرف القيمة السرية انتحال الاستجابة ما لم يكن قادرا على التعرف على الطلب.
متى يمكن توقع فشل التحقق من الصحة:
يحدث فشل التحقق من الصحة إذا لم يعد المحول يقوم بتخزين الطلب مؤقتا (على سبيل المثال، بسبب المهلة). يمكنك أيضا تجربته عندما يكون السر المشترك غير صالح (نعم - يتضمن Access-Reject أيضا هذا الرأس). بهذه الطريقة، يمكن لجهاز الوصول إلى الشبكة (NAD) اكتشاف عدم تطابق السر المشترك. عادة ما يتم الإبلاغ عنه بواسطة خوادم/عملاء المصادقة والتفويض والمحاسبة (AAA) كعدم تطابق مشترك للمفتاح، ولكنه لا يكشف التفاصيل.
إخفاء كلمة المرور
كما يتم إستخدام رأس المصدق لتجنب إرسال سمة كلمة مرور المستخدم في نص عادي. أولا، يتم حساب ملخص الرسالة 5 (MD5 - سري، المصدق). ثم يتم تنفيذ العديد من عمليات XOR بأجزاء كلمة المرور. تعد هذه الطريقة عرضة للهجمات غير المتصلة (جداول قوس قزح) نظرا لأنه لم يعد ينظر إلى MD5 على أنه خوارزمية قوية أحادية الإتجاه.
هنا ال بايثون نص أن يحسب المستعمل كلمة:
def Encrypt_Pass(password, authenticator, secret):
m = md5()
m.update(secret+authenticator)
return "".join(chr(ord(x) ^ ord(y)) for x, y in zip(password.ljust
(16,'\0')[:16], m.digest()[:16]))
عمليات إعادة الإرسال
إذا تم تغيير أي من السمات في طلب وصول RADIUS (مثل معرف RADIUS واسم المستخدم وما إلى ذلك)، فيجب إنشاء حقل المصدق الجديد ويجب إعادة حساب كافة الحقول الأخرى التي تعتمد عليه. إذا كان هذا إعادة إرسال، لا يتغير شيء.
الحسابات
يختلف معنى رأس المصدق بالنسبة إلى طلب الوصول وطلب المحاسبة.
بالنسبة لطلب الوصول، يتم إنشاء المصدق بشكل عشوائي ومن المتوقع أن يتلقى إستجابة تم حساب ResponseAuthenticator عليها بشكل صحيح، مما يثبت أن الاستجابة كانت مرتبطة بذلك الطلب المحدد.
بالنسبة لطلب المحاسبة، فإن المصدق ليس عشوائيا، ولكنه يتم حسابه (وفقا ل RFC 2866):
RequestAuth = MD5(Code + ID + Length + 16 zero octets + Attributes + Secret)
بهذه الطريقة، يمكن للخادم التحقق من رسالة المحاسبة فورا وإفلات الحزمة إذا لم تتطابق قيمة إعادة الحساب مع قيمة المصدق. ترجع Identity Services Engine (ISE):
11038 RADIUS Accounting-Request header contains invalid Authenticator field
السبب النموذجي لهذا هو المفتاح السري المشترك غير الصحيح.
سمة مصدق الرسائل
سمة مصدق الرسائل هي سمة RADIUS المحددة في RFC 3579. وتستخدم لغرض مماثل: للتوقيع والتحقق. ولكن هذه المرة، لا يتم إستخدامها للتحقق من صحة إستجابة ما بل الطلب.
يقوم العميل الذي يرسل طلب الوصول (يمكن أيضا أن يكون خادما يستجيب باستخدام اعتراض الوصول) بحساب رمز مصادقة الرسائل المستندة إلى التجزئة (HMAC)-MD5 من الحزمة الخاصة به، ثم يضيف سمة مصدق الرسائل كتوقيع. وبعد ذلك، يمكن للخادم التحقق من تنفيذه لنفس العملية.
تبدو الصيغة مماثلة لرأس المصدق:
Message-Authenticator = HMAC-MD5 (Type, Identifier, Length, Request Authenticator,
Attributes)
تأخذ الدالة HMAC-MD5 في وسيطتين:
- حمولة الحزمة، والتي تتضمن حقل مصدق الرسائل سعة 16 بايت المملوء بالأصفار
- السر المشترك
متى يمكن إستخدام مصدق الرسائل:
يجب إستخدام مصدق الرسائل لكل حزمة، والتي تتضمن رسالة بروتوكول المصادقة المتوسع (EAP) (RFC 3579). ويتضمن ذلك كل من العميل الذي يرسل طلب الوصول والخادم الذي يستجيب مع "تحدي الوصول". يقوم الجانب الآخر بإسقاط الحزمة بصمت إذا فشل التحقق من الصحة.
متى يمكن توقع فشل التحقق من الصحة:
يحدث فشل التحقق من الصحة عندما يكون السر المشترك غير صالح. بعد ذلك، لا يمكن لخادم AAA التحقق من صحة الطلب.
يخبر ال ISE:
11036 The Message-Authenticator Radius Attribute is invalid.
ويحدث ذلك عادة في المرحلة اللاحقة عند إرفاق رسالة EAP. لا تتضمن حزمة RADIUS الأولى من جلسة عمل 802.1x رسالة EAP؛ لا يوجد حقل مصدق رسائل ولا يمكن التحقق من الطلب، ولكن في هذه المرحلة، يمكن للعميل التحقق من صحة الاستجابة باستخدام حقل المصدق.
التحقق من صحة سمة مصدق الرسائل
هنا مثال لتوضيح كيفية حساب القيمة يدويا للتأكد من حسابها بشكل صحيح.
تم إختيار الحزمة رقم 30 (طلب الوصول). هو في منتصف جلسة EAP، وتتضمن الحزمة حقل مصدق الرسالة. الهدف هو التحقق من صحة مصدق الرسالة:
- انقر بزر الماوس الأيمن فوق بروتوكول Radius واختر تصدير وحدات بايت الحزم المحددة.
- اكتب حمولة RADIUS إلى ملف (بيانات ثنائية).
- لحساب حقل مصدق الرسائل، يجب وضع أصفار هناك وحساب HMAC-MD5.
على سبيل المثال، عند إستخدام المحرر سداسي/ثنائي، مثل VIM، بعد كتابة ":٪!xd"، والتي يتم تحويلها إلى الوضع سداسي العشري والأصفار 16 بايت بدءا من "5012" (50hex هو 80 في ديسمبر وهو نوع مصدق الرسائل، و 12 هو الحجم الذي يساوي 18 بما في ذلك رأس أزواج قيمة السمة (AVP)):
الرجاء ملاحظة أن Vim وغيره من محرري النصوص يمكنهم إضافة حرف LineFeed إضافي ("0a" بالنظام السداسي العشري) إلى نهاية الملف عند الحفظ. تأكد من إستخدام الوضع الثنائي لمحرر النصوص (ملف vim -b) لمنع ظهور حرف LineFeed.
بعد هذا التعديل، تصبح الحمولة جاهزة. من الضروري العودة إلى الوضع السداسية العشرية/الثنائية (النوع: ":٪!xd -r") وحفظ الملف (":wq"). يمكنك التحقق مرتين من عدم إضافة حرف LineFeed إضافي باستخدام 'hexdump -C file'.
- أستخدم OpenSSL لحساب HMAC-MD5:
pluton # cat packet30-clear-msgauth.bin | openssl dgst -md5 -hmac 'cisco'
(stdin)= 01418d3b1865556918269d3cf73608b0
تأخذ الدالة HMAD-MD5 وسيطتين: الأولى من إدخال قياسي (stdin) هي الرسالة نفسها والثانية هي السر المشترك (Cisco في هذا المثال). والنتيجة هي نفس قيمة مصدق الرسائل المرفق بحزمة طلب الوصول RADIUS.
نفس الشيء يمكن حسابه باستخدام برنامج Python النصي:
بايثون 2:
pluton # cat hmac.py
#!/usr/bin/env python
import base64
import hmac
import hashlib
f = open('packet30-clear-msgauth.bin', 'rb')
try:
body = f.read()
finally:
f.close()
digest = hmac.new('cisco', body, hashlib.md5)
d=digest.hexdigest()
print d
pluton # python hmac.py
01418d3b1865556918269d3cf73608b0
بايثون 3:
import hmac
import hashlib
with open('packet30-clear-msgauth.bin', 'rb') as f:
body = f.read()
digest = hmac.new(b'cisco', body, hashlib.md5)
print(digest.hexdigest())
يوضح المثال السابق كيفية حساب حقل مصدق الرسائل من طلب الوصول. بالنسبة لتحدي الوصول وقبول الوصول ورفض الوصول، فإن المنطق هو نفسه تماما، ولكن من المهم تذكر أنه يجب إستخدام مصدق الطلب، والذي يتم توفيره في حزمة طلب الوصول السابقة.
معلومات ذات صلة