Bagaimana cara mengautentikasi pengguna dalam grup bertingkat di Apache LDAP?

21

Saya sudah bekerja otentikasi LDAP dengan pengaturan berikut

 AuthName            "whatever"
 AuthType            Basic
 AuthBasicProvider   ldap
 AuthLDAPUrl         "ldap://server/OU=SBSUsers,OU=Users,OU=MyBusiness,DC=company,DC=local?sAMAccountName?sub?(objectClass=*)"
 Require ldap-group  CN=MySpecificGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local

Ini berfungsi, namun saya harus memasukkan semua pengguna yang ingin saya otentikasi MySpecificGroup. Tetapi pada server LDAP saya sudah mengkonfigurasi yang MySpecificGroupjuga berisi grup MyOtherGroupdengan daftar pengguna lain.

Tetapi para pengguna MyOtherGroupitu tidak diautentikasi, saya harus menambahkan semuanya secara manual MySpecificGroupdan pada dasarnya tidak dapat menggunakan pengelompokan bersarang. Saya menggunakan Windows SBS 2003.

Apakah ada cara untuk mengkonfigurasi Apache LDAP untuk melakukan ini? Atau adakah masalah dengan kemungkinan rekursi tak terbatas dan karenanya tidak diizinkan?

menandai
sumber

Jawaban:

19

Anda perlu mengatur AuthLDAPSubGroupDepthuntuk membuat ini berfungsi. Bilangan bulat yang Anda berikan di sini menentukan kedalaman bersarang sub-grup maksimum yang akan dievaluasi sebelum pencarian pengguna dihentikan.

Tambahkan ini ke konfigurasi Anda:

AuthLDAPSubGroupDepth 1

Info Lebih Lanjut: di sini dan di sini .

Bart De Vos
sumber
Saya menjalankan apache 2.2, ini mod_authnz_ldap belum direktif AuthLDAPSubGroupDepth
Selivanov Pavel
Jadi, mengapa tidak memperbarui?
Bart De Vos
2
Saya menjalankan Debian Squeeze dan saya lebih suka menggunakan paket dari distribusi yang stabil: pembaruan keamanan rutin yang teruji dengan baik. Apache 2.3 masih beta, akan segera muncul di stabil atau stabil-backports. Saya telah memecahkan masalah ini dengan menggunakan AuthnProviderAliasuntuk saat ini. Jika tidak ada yang akan menawarkan solusi untuk Apache 2.2, hadiah adalah milik Anda :)
Selivanov Pavel
mengingat informasi baru dari grup berada di server yang berbeda, saya rasa metode ini tidak akan berfungsi.
Jeff Strunk
3
AuthLDAPSubGroupDepth tidak ada di Apache HTTPd 2.4. AuthLDAPMaxSubGroupDepth adalah arahan yang benar untuk digunakan.
Chris Harris
33

Selain itu AuthLDAPSubGroupDepth, yang hanya tersedia di apache 2.4, dimungkinkan, saat menggunakan Microsoft AD LDAP, untuk melakukan otorisasi menggunakan grup bersarang dengan menggunakan aturan pencocokan LDAP_MATCHING_RULE_IN_CHAIN. Ini jauh lebih cepat daripada mencari subkelompok pada klien, karena dilakukan pada server DC dengan lebih sedikit permintaan melalui jaringan.

Require ldap-filter memberof:1.2.840.113556.1.4.1941:=CN=Access to Apache,OU=My Organization Unit,DC=company,DC=com

String 1.2.840.113556.1.4.1941adalah OID yang disebut LDAP_MATCHING_RULE_IN_CHAIN. OID ini ditugaskan oleh Microsoft untuk digunakan dengan implementasi LDAP-nya (bagian dari Active Directory). Anda tidak dapat menggunakannya dengan server LDAP lainnya. Format manusia yang dapat ditebus adalah:iso(1).member_body(2).us(840).microsoft(113556).ad(1).as_schema(4).LDAP_MATCHING_RULE_IN_CHAIN(1941)

Dari dokumentasi Microsoft:

Aturan ini terbatas pada filter yang berlaku untuk DN. Ini adalah operator korek api "extended" khusus yang berjalan di rantai leluhur pada objek sampai ke akar sampai menemukan kecocokan.

Lihat juga:

Mircea Vutcovici
sumber
Saya akan memperbaiki ini 10x jika saya bisa. Untuk orang yang menjalankan RHEL 5, ini adalah solusi yang bagus. Mengkompilasi sumber vendor untuk mendapatkan fitur terbaru tidak selalu merupakan solusi yang diinginkan!
Aaron Copley
Saya senang itu membantu. Saya pikir ini adalah penggunaan LDAP_MATCHING_RULE_IN_CHAIN ​​yang didokumentasikan pertama kali di apache.
Mircea Vutcovici
Apakah ada cara yang digunakan LDAP_MATCHING_RULE_IN_CHAINuntuk mengambil keanggotaan grup rekursif dan meneruskannya sebagai header ke server backend (menggunakan Apache sebagai proxy terbalik) ??
Gershon Papi
mod_authnz_ldaptidak menyediakan ini. Namun Anda dapat menggunakan LDAP_MATCHING_RULE_IN_CHAINfilter LDAP di aplikasi Anda. Lihat: stackoverflow.com/a/34075052/290087
Mircea Vutcovici
6

Sepertinya satu-satunya pilihan Anda di Apache 2.2 adalah mendaftar setiap grup yang disertakan oleh grup resmi utama Anda.

Require ldap-group  CN=MySpecificGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local
Require ldap-group  CN=MyOtherGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local

Ini harus masuk akal jika grup bersarang Anda tidak terlalu rumit.


Melintasi Domain AD (menggunakan dua server LDAP)

Anda dapat mengatur OpenLDAP dengan overlay slapd_meta yang berjalan di server web Anda untuk proksi otentikasi Anda.

/etc/ldap/slapd.conf akan terlihat seperti:

database meta
suffix   "DC=company,DC=local"
uri      "ldap://a.foo.com/OU=MyBusiness,DC=company,DC=local"
uri      "ldap://b.foo.com/OU=otherdomainsuffix,DC=company,DC=local"

Kemudian, bait mod_authnz_ldap Anda akan terlihat seperti:

AuthName            "whatever"
AuthType            Basic
AuthBasicProvider   ldap
AuthLDAPUrl         "ldapi:///DC=company,DC=local?sAMAccountName?sub?(objectClass=*)"
Require ldap-group  CN=MySpecificGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local
Require ldap-group  CN=MyOtherGroup,OU=Security Groups,OU=otherdomainsuffix,DC=company,DC=local

Ini akan membutuhkan beberapa pemijatan untuk membuatnya bekerja, tetapi saya pikir ini adalah ide umum.

Jeff Strunk
sumber
1
Sayangnya ini tidak berfungsi ketika grup berada dalam domain AD yang berbeda (Domain1_DomainLocal_Group menyertakan Domain2_Global_Group). Itu adalah hal pertama yang saya coba :)
Selivanov Pavel
Apakah itu berarti bahwa salah satu grup ada di server yang berbeda? Jika itu benar, saya curiga AuthLDAPSubGroupDepth juga tidak bekerja untuk Anda.
Jeff Strunk
Ya, dua server, dua domain. Saya mempertimbangkan untuk mengintegrasikan kotak Linux dalam AD dan menggunakan otentikasi PAM, tetapi mod-auth-pam tidak didukung karena apache 2.0, mod-authnz-external + pwauth tidak mendukung grup. Ini semua sayangnya :(
Selivanov Pavel
1
Oh, saya belum melihat jawaban Anda diperbarui. Menggunakan OpenLDAP slapd_meta mungkin merupakan solusi, tetapi ia membunuh poin utama dari konfigurasi ini: dapatkan hak pengguna dikelola dalam satu titik tunggal (Direktori Aktif) dengan menambahkan / menghapus pengguna dari grup dan termasuk grup satu sama lain. Berikut ini adalah solusi analog saya dengan AuthnProviderAlias ​​tanpa layanan OpenLDAP tambahan: <AuthnProviderAlias ​​ldap first-ldap> AuthLDAPURL ... </AuthnProviderAlias> <AuthnProviderAlias ​​ldap second-ldap> AuthLDAPURer ... Autoblobal firstDif -lap
Selivanov Pavel
1
Saya memutuskan untuk memberikan hadiah kepada Bart De Vos: ini bukan pertanyaan saya; untuk pertanyaan asli (tanpa spesifik saya sendiri) solusinya sederhana dan akan bekerja
Selivanov Pavel
4

Sementara solusi yang diberikan oleh @Mircea_Vutcovici bekerja untuk saya, satu-satunya kritik saya adalah bahwa orang mungkin akan mudah tersinggung ketika mereka melihat operator bitwise sedang digunakan.

Sebagai contoh, saya akan menyerahkan instalasi Apache Bloodhound, yang menggunakan Apache HTTPd sebagai ujung depan dengan auth grup AD, kepada sekelompok rekan pengembang. Mereka akan menghadapi masalah dengan operator bitwise. Admin tidak akan semudah itu ... Saya harap.

Yang sedang berkata, saya punya solusi yang tidak menggunakan operator bitwise dan yang tidak menggunakan beberapa definisi ldap-group.

Konfigurasi berikut ini berfungsi untuk saya:

<Location /protected>
    # Using this to bind
    AuthLDAPURL "ldap://<MY_SERVER>:3268/<MY_SEARCH_BASE>?sAMAccountName?sub?(objectClass=user)"
    AuthLDAPBindDN "<MY_BIND_DN>"
    AuthLDAPBindPassword "<MY_PASSWORD>"
    LDAPReferrals Off

    AuthType Basic
    AuthName "USE YOUR AD ACCOUNT"
    AuthBasicProvider ldap
    Require ldap-group <MY_PARENT_GROUP>
    AuthLDAPMaxSubGroupDepth 1
    AuthLDAPSubgroupAttribute member
    AuthLDAPSubGroupClass group
    AuthLDAPGroupAttribute member
    AuthLDAPGroupAttributeIsDN on
</Location>

Bagian penting adalah konfigurasi berikut:

AuthLDAPSubGroupClass group

AuthLDAPMaxSubGroupDepth tidak bekerja dengan sendirinya, atau ketika digabungkan dengan AuthLDAPSubgroupAttribute. Hanya ketika saya menggunakan AuthLDAPSubGroupClass yang auth terhadap sub kelompok mulai bekerja ... setidaknya untuk saya dan situasi saya.

Chris Harris
sumber