วิธีการตรวจสอบผู้ใช้ในกลุ่มที่ซ้อนกันใน Apache LDAP?


21

ฉันใช้การตรวจสอบสิทธิ์ LDAP ด้วยการตั้งค่าต่อไปนี้

 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

งานนี้ MySpecificGroupแต่ผมจะนำผู้ใช้ทั้งหมดที่ฉันต้องการการตรวจสอบเข้า แต่บนเซิร์ฟเวอร์ LDAP ฉันได้กำหนดค่าที่MySpecificGroupมีกลุ่มที่MyOtherGroupมีรายชื่อผู้ใช้อื่น

แต่ผู้ใช้เหล่านั้นMyOtherGroupไม่ได้รับการรับรองความถูกต้องฉันจะเพิ่มพวกเขาทั้งหมดด้วยตนเองMySpecificGroupและโดยทั่วไปไม่สามารถใช้การจัดกลุ่มแบบซ้อนได้ ฉันใช้ Windows SBS 2003

มีวิธีกำหนดค่า Apache LDAP ให้ทำเช่นนี้หรือไม่? หรือมีปัญหากับการเรียกซ้ำแบบไม่สิ้นสุดที่เป็นไปได้และไม่อนุญาต

คำตอบ:


19

คุณต้องตั้งค่าAuthLDAPSubGroupDepthให้ใช้งานได้ จำนวนเต็มที่คุณระบุที่นี่ระบุความลึกการซ้อนกลุ่มย่อยสูงสุดที่จะถูกประเมินก่อนที่การค้นหาผู้ใช้จะถูกยกเลิก

เพิ่มลงในการกำหนดค่าของคุณ:

AuthLDAPSubGroupDepth 1

รายละเอียดเพิ่มเติม: ที่นี่และที่นี่


ฉันใช้ apache 2.2, มันเป็น mod_authnz_ldap ยังไม่ได้ AuthLDAPSubGroupDepth directive: httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html
Selivanov Pavel

ดังนั้นทำไมไม่อัปเดต
Bart De Vos

2
ฉันใช้ Debian Squeeze และฉันชอบใช้แพ็คเกจจากการกระจายที่เสถียร: มีการทดสอบความปลอดภัยที่ดีเป็นประจำ Apache 2.3 ยังคงเป็นรุ่นเบต้าจะปรากฏในคอกที่มั่นคงหรือ backport ที่เสถียรในไม่ช้า ฉันได้แก้ไขปัญหานี้โดยใช้AuthnProviderAliasตอนนี้ ถ้าไม่มีใครจะนำเสนอโซลูชั่นสำหรับ Apache 2.2 เงินรางวัลเป็นของคุณ :)
Selivanov พาเวล

เนื่องจากข้อมูลใหม่ของกลุ่มอยู่บนเซิร์ฟเวอร์ที่แตกต่างกันฉันไม่คิดว่าวิธีนี้จะยังคงทำงานได้
Jeff Strunk

3
AuthLDAPSubGroupDepth ไม่มีอยู่ใน Apache HTTPd 2.4 AuthLDAPMaxSubGroupDepth เป็นคำสั่งที่ถูกต้องที่จะใช้
Chris Harris

33

นอกจากAuthLDAPSubGroupDepthนั้นจะมีให้เฉพาะใน apache 2.4 เป็นไปได้เมื่อใช้ Microsoft AD LDAP เพื่อทำการอนุญาตให้ใช้กลุ่มที่ซ้อนกันโดยใช้กฎการจับคู่ LDAP_MATCHING_RULE_IN_CHAIN สิ่งนี้เร็วกว่าการค้นหากลุ่มย่อยบนไคลเอนต์เนื่องจากทำได้บนเซิร์ฟเวอร์ DC ที่มีการสอบถามน้อยกว่าผ่านเครือข่าย

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

สตริง1.2.840.113556.1.4.1941เป็นOIDLDAP_MATCHING_RULE_IN_CHAINเรียกว่า OID นี้ได้รับมอบหมายจาก Microsoft ให้ใช้กับการใช้งาน LDAP (ส่วนหนึ่งของ Active Directory) คุณไม่สามารถใช้กับเซิร์ฟเวอร์ LDAP อื่นได้ รูปแบบที่มนุษย์สามารถเรียกคืนได้คือ:iso(1).member_body(2).us(840).microsoft(113556).ad(1).as_schema(4).LDAP_MATCHING_RULE_IN_CHAIN(1941)

จากเอกสารของ Microsoft:

กฎนี้ จำกัด เฉพาะตัวกรองที่ใช้กับ DN นี่คือโอเปอเรเตอร์การแข่งขันแบบ "ขยาย" พิเศษที่เดินผ่านสายโซ่ของบรรพบุรุษในวัตถุจนถึงรูตจนกว่าจะพบการแข่งขัน

ดูสิ่งนี้ด้วย:


ฉันจะลงคะแนน 10 เท่านี้ถ้าทำได้ สำหรับผู้ที่ใช้ RHEL 5 นี่เป็นทางออกที่ยอดเยี่ยม การรวบรวมแหล่งที่มาของผู้ขายเพื่อรับคุณสมบัติล่าสุดนั้นไม่ใช่ทางออกที่ต้องการเสมอไป!
Aaron Copley

ฉันดีใจที่มันช่วย ฉันคิดว่านี่เป็นการใช้งานครั้งแรกของ LDAP_MATCHING_RULE_IN_CHAIN ​​ใน apache
Mircea Vutcovici

มีวิธีใช้LDAP_MATCHING_RULE_IN_CHAINในการดึงข้อมูลสมาชิกกลุ่มแบบเรียกซ้ำและส่งผ่านเป็นส่วนหัวไปยังเซิร์ฟเวอร์เบื้องหลัง (ใช้ Apache เป็น reverse proxy) หรือไม่?
Gershon Papi

mod_authnz_ldapไม่ได้ให้สิ่งนี้ อย่างไรก็ตามคุณสามารถใช้LDAP_MATCHING_RULE_IN_CHAINตัวกรอง LDAP ในแอปพลิเคชันของคุณ ดู: stackoverflow.com/a/34075052/290087
Mircea Vutcovici

6

ดูเหมือนว่าตัวเลือกเดียวของคุณใน Apache 2.2 คือการแสดงรายการทุกกลุ่มที่รวมอยู่ในกลุ่มที่ได้รับอนุญาตหลักของคุณ

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

นี่ควรจะสมเหตุสมผลถ้ากลุ่มที่ซ้อนกันของคุณไม่ซับซ้อนเกินไป


การข้ามโดเมนโฆษณา (โดยใช้เซิร์ฟเวอร์ LDAP สองเซิร์ฟเวอร์)

คุณสามารถตั้งค่า OpenLDAP ด้วยการซ้อนทับslapd_meta ที่ทำงานบนเว็บเซิร์ฟเวอร์ของคุณเพื่อเชื่อมต่อการรับรองความถูกต้องของคุณ

/etc/ldap/slapd.conf ควรมีลักษณะดังนี้:

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"

จากนั้น mod_authnz_ldap stanza ของคุณจะมีลักษณะดังนี้:

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

สิ่งนี้จะต้องใช้การนวดเพื่อให้สามารถทำงานได้ แต่ฉันคิดว่านี่เป็นความคิดทั่วไป


1
น่าเสียดายที่สิ่งนี้ไม่ทำงานเมื่อกลุ่มอยู่ในโดเมนโฆษณาต่าง ๆ (Domain1_DomainLocal_Group มี Domain2_Global_Group) มันเป็นสิ่งแรกที่ผมพยายาม :)
Selivanov พาเวล

หมายความว่ากลุ่มใดกลุ่มหนึ่งอยู่บนเซิร์ฟเวอร์ที่แตกต่างกันใช่หรือไม่ หากเป็นจริงฉันสงสัยว่า AuthLDAPSubGroupDepth จะไม่ทำงานสำหรับคุณเช่นกัน
Jeff Strunk

ใช่สองเซิร์ฟเวอร์สองโดเมน ฉันพิจารณาเกี่ยวกับการรวมกล่อง Linux ในโฆษณาและใช้การรับรองความถูกต้อง PAM แต่ mod-auth-pam ไม่ได้รับการสนับสนุนเนื่องจาก apache 2.0, mod-authnz-external + pwauth ไม่สนับสนุนกลุ่ม ทั้งหมดนี้น่าเศร้า :(
Selivanov Pavel

1
โอ้ฉันไม่ได้สังเกตว่าคุณได้ทำการปรับปรุงคำตอบแล้ว การใช้ OpenLDAP slapd_meta อาจเป็นวิธีแก้ปัญหา แต่ก็ฆ่าประเด็นหลักของการกำหนดค่านี้: รับสิทธิ์ผู้ใช้ที่จัดการในจุดเดียว (Active Directory) โดยเพิ่ม / ลบผู้ใช้จากกลุ่มและรวมถึงกลุ่มในกันและกัน นี่คือโซลูชันอะนาล็อกของฉันกับ AuthnProviderAlias ​​ที่ไม่มีบริการ OpenLDAP เพิ่มเติม: <AuthnProviderAlias ​​ldap first-ldap> AuthLDAPURL ... </AuthnProviderAlias> AuthnProviderAlias ​​ldap second-ldap> AuthnProviderAlias ​​ที่สอง ... -ldap
Selivanov Pavel

1
ฉันได้ตัดสินใจที่จะมอบความโปรดปรานให้กับ Bart De Vos: นี่ไม่ใช่คำถามของฉัน สำหรับคำถามเดิม (โดยเฉพาะของตัวเอง) แก้ปัญหาของเขาเป็นเรื่องง่ายและจะทำงาน
Selivanov พาเวล

4

ในขณะที่คำตอบของ @Mircea_Vutcovici ได้ผลสำหรับฉันการวิจารณ์เพียงอย่างเดียวของฉันคือผู้คนอาจรู้สึกคลื่นไส้เมื่อพวกเขาเห็นผู้ใช้ระดับบิต

ตัวอย่างเช่นฉันจะส่งมอบการติดตั้ง Apache Bloodhound ที่ใช้ Apache HTTPd เป็นส่วนหน้ากับ AD group auth ให้กับกลุ่มนักพัฒนาเพื่อน พวกเขากำลังจะมีปัญหาที่จะเกิดขึ้นกับผู้ประกอบการระดับบิต ผู้ดูแลระบบจะไม่คลื่นไส้แน่นอน ... ฉันหวังว่า

ที่ถูกกล่าวว่าฉันมีวิธีการแก้ปัญหาที่ไม่ได้ใช้ตัวดำเนินการระดับบิตและที่ไม่ได้ใช้หลายคำนิยามกลุ่ม ldap

การกำหนดค่าต่อไปนี้ใช้งานได้สำหรับฉัน:

<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>

ส่วนที่สำคัญคือการกำหนดค่าต่อไปนี้:

AuthLDAPSubGroupClass group

AuthLDAPMaxSubGroupDepth ไม่ทำงานด้วยตัวเองหรือเมื่อรวมกับ AuthLDAPSubgroupAttribute มันก็ต่อเมื่อฉันใช้ AuthLDAPSubGroupClass ที่รับรองความถูกต้องกับกลุ่มย่อยเริ่มทำงาน ... อย่างน้อยสำหรับฉันและสถานการณ์ของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.