LDAP_SASL_BIND_S (GSSAPI) - ما ينبغي توفيره في بنية بيانات الاعتماد

StackOverflow https://stackoverflow.com/questions/3144910

  •  01-10-2019
  •  | 
  •  

سؤال

أحاول استخدام 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 );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top