LDAP_SASL_BIND_S (GSSAPI) - ما ينبغي توفيره في بنية بيانات الاعتماد
سؤال
أحاول استخدام ldap_sasl_bind_s
الطريقة من Microsoft LDAP C SDK ، مع GSSAPI كآلية المصادقة. ldap_sasl_bind_s
يتوقع بيانات الاعتماد ك BERVAL
الهيكل ، وهو غير شفاف.
بالنظر إلى اسم مستخدم (أو DN) وكلمة المرور ، كيف يمكنني الوصول إلى BERVAL
بنية من المفترض أن أنقل إلى ldap_sasl_bind_s
?
الأمثلة التي وجدتها حتى الآن
- هي من LDAP C SDKs - وليس الشخص من Microsoft
- استعمال
ldap_sasl_bind_s
عندما تكون المصادقة البسيطة مطلوبة - لكنني بحاجة إلى استخدام GSSAPI - استعمال
ldap_sasl_interactive_bind_s
عندما تكون آليات مصادقة SASL أخرى مطلوبة. ومع ذلك ، لا يوجدldap_sasl_interactive_bind_s
في Microsoft SDK.
كملاحظة جانبية ، فإن الهدف هو أن تكون قادرًا على ربط SASL بمجموعة متنوعة من خوادم LDAP ؛ الآن: Activedirectory و OpenLdap.
أي مؤشرات سيكون موضع تقدير كبير.
المحلول
تمكنت من أداء ربط LDAP SASL على GSSAPI ، باستخدام ldap_sasl_bind_s
. للمهتمين ، إليك بعض المؤشرات.
للحصول على وصف تجريدي للإجراءات ، يحتاج العميل والخادم إلى تنفيذها أثناء مصادقة GSSAPI SASL ، "The Kerberos V5 (" GSSAPI ") آلية مصادقة وطبقة أمان بسيطة (SASL)" يجب قراءة RFC ؛ على وجه التحديد ، يعد قسم "جانب عميل تبادل بروتوكول المصادقة" ذا أهمية ، لأنه يعطي إشارة إلى تسلسل الإجراءات التي نحتاج إلى القيام بها لربط خادم LDAP بنجاح على Kerberos.
أوراق الاعتماد ldap_sasl_bind_s
تتوقع - شكلها ومعناها - يعتمد على آلية المصادقة الفعلية المستخدمة ، والتي في حالتنا هي Kerberos.
في Microsoft SDK ، يتوفر Kerberos من خلال SSPI - وهو تنفيذ Microsoft تقريبًا لـ GSSAPI ؛ الأساليب ذات الصلة بحالتنا الخاصة هي: AcquireCredentialsHandle
, InitializeSecurityContext
, DecryptMessage
, EncryptMessage
يرتبط LDAP SASL على Kerberos 3 مراحل.
المرحلة 1
مكالمة AcquireCredentialsHandle
و InitializeSecurityContext
.
ملاحظات مهمة هنا:
- انقل الى
AcquireCredentialsHandle
مؤشر إلىSEC_WINNT_AUTH_IDENTITY
الهيكل الذي يحتوي على بيانات الاعتماد الفعلية (المجال ، اسم المستخدم ، كلمة المرور) ، أوNULL
إذا تم استخدام بيانات اعتماد الخيط الحالي - يجب أن يكون الاسم الهدف هو SPN تم تعيينه للحساب الذي يعمل بموجبه خادم LDAP
- عند الاتصال
InitializeSecurityContext
, ، يجب طلب المصادقة المتبادلة.
إذا كانت جميع الوسائط المهمة صحيحة - بيانات اعتماد صالحة ، SPN صالحة ، NULL
رمز الإدخال - ال InitializeSecurityContext
يجب أن تعود المكالمة SEC_I_CONTINUE_NEEDED
وملء رمز الإخراج بشكل صحيح. يجب أن تذهب محتويات رمز الإخراج هذا في BERVAL
بنية ldap_sasl_bind_s
يتوقع كبيانات اعتماد العميل.
مكالمة ldap_sasl_bind_s
مع رمز الإخراج من InitializeSecurityContext
كبيانات اعتماد العميل. إذا كانت جميع الوسائط صحيحة - DN فارغة ، GSSAPI كاسم الآلية - يجب أن تعود المكالمة الفعلية LDAP_SUCCESS
ويجب أن يكون أحدث خطأ LDAP لجلسة LDAP LDAP_SASL_BIND_IN_PROGRESS
.
كملاحظة جانبية ، يمكن اكتشاف أحدث خطأ LDAP لجلسة LDAP عن طريق الاتصال ldap_get_option
في الجلسة LDAP_OPT_ERROR_NUMBER
كخيار.
المرحلة 2
بعد الدعوة الناجحة إلى ldap_sasl_bind_s
, تشير الحجة الأخيرة إلى أ BERVAL
الهيكل الذي يحتوي على بيانات اعتماد الخادم. محتوى هذا BERVAL
يجب استخدام الهيكل الآن كقائد إدخال للمكالمة الثانية إلى InitializeSecurityContext
.
هذه الدعوة الثانية إلى InitializeSecurityContext
يجب أن تعود SEC_OK
ورمز الإخراج الفارغ.
يجب استخدام رمز الإخراج الفارغ هذا كبيانات اعتماد العميل لمكالمة أخرى إلى ldap_sasl_bind_s
. هذه الدعوة الثانية إلى ldap_sasl_bind_s
يجب أن تعود LDAP_SUCCESS
, ، مع وجود خطأ LDAP الأخير لجلسة LDAP LDAP_SASL_BIND_IN_PROGRESS
.
المرحلة 3
بعد الدعوة الناجحة الثانية إلى ldap_sasl_bind_s
, تشير الحجة الأخيرة إلى أ BERVAL
بنية تحتوي على بيانات الخادم. يجب إعطاء بيانات الخادم هذه كمدخلات إلى DecryptMessage
. كما هو محدد في RFC المذكورة سابقًا ، يجب أن تكون البيانات التي تم فك تشفيرها 4 بايت.
يجب على العميل بناء رده وفقًا للمعلومات الواردة في نفس RFC.
ملحوظة: في حالتي ، حذفت معرف التفويض المذكور في RFC. لتفهمي ، يؤدي معرف التفويض الفارغ إلى استخدام معرف المصادقة للترخيص أيضًا.
يجب بعد ذلك الرد على الرد الذي صممه العميل كمدخلات إلى EncryptMessage
. إخراج EncryptMessage
يجب بعد ذلك تمرير المكالمة كبيانات اعتماد العميل للمكالمة الثالثة والنهائية إلى ldap_sasl_bind_s
.
ملحوظة: وثائق MSDN لاستخدامها EncryptMessage
تحت Kerberos يبدو أنه غير مكتمل. يجب أن يساعد البحث عن رمز Google في مثال عمل. أيضًا ، للحصول على مثال عاملة للتدفق الموضح أعلاه ، يمكن استشارة رمز مصدر Samba.
نصائح أخرى
لقد وجدت المشكلة.
وفقا لهذا الموضوع ( https://groups.google.com/group/microsoft.public.active.directory.interfaces/browse_thread/thread/9c13fe85e520b4/820a136e032946e9؟pli=1) هناك خطأ مع LDAP_SASL_BIND_S إرجاع بيانات اعتماد الخادم الفارغة في Windows XP. لقد اختبرت طلبي ضمن خادم Windows 2008 ويتم إرجاع بيانات الاعتماد بشكل صحيح.
مقال من شمس و MSDN. ربما إذا كان بإمكانك محاولة إنشاء برنامج عينة ، يمكنك الحصول على الإجابات
كود مزيف
struct berval cred;
char mechanism[BUFSIZ];
getline( mechanism, sizeof(mechanism), stdin, "mechanism? " );
getline( passwd, sizeof(passwd), stdin,"credentials? " );
cred.bv_val = passwd;
cred.bv_len = strlen( passwd );
rc = ldap_sasl_bind_s( ld, dn, mechanism, &cred, NULL, NULL, NULL );