ฉันใช้ SSO บน apache สำเร็จสำหรับผู้ใช้ windows ในโดเมน AD เดียวกันกับที่เซิร์ฟเวอร์ apache อยู่ใน: AD domain = example.com เซิร์ฟเวอร์ Linux = linux.example.com KDC = ad.example.com

ฉันตั้งค่า KrbLocalUserMapping เป็น ON ใน httpd.conf เนื่องจากแอปพลิเคชันที่ผู้ใช้ลงชื่อเข้าใช้ต้องการส่วน @example.com ของชื่อผู้ใช้ที่จะถูกถอดออก

ตอนนี้ฉันต้องการให้ผู้ใช้จากสำนักงานสาขาลงชื่อเข้าใช้แอปพลิเคชันได้เช่นกัน แต่มาจากโดเมนอื่น = Branch.example.com โดเมนทั้งสองอยู่ในความสัมพันธ์ที่เชื่อถือได้

เมื่อผู้ใช้จาก branch.example.com พยายามเข้าสู่ระบบ พวกเขาจะได้รับ "Internal Server Error" และบันทึกข้อผิดพลาดของ apache แจ้งว่า "Krb5_aname_to_localname() ไม่พบการแมปสำหรับหลัก[email protected] "

ฉันเดาว่าผู้ใช้ที่มาจากโดเมนย่อย branch.example.com จะไม่ได้รับส่วนโดเมนของชื่อผู้ใช้ที่ถูกถอดออก

ฉันต้องเปลี่ยนอะไรและที่ไหน (อาจเป็น krb5.conf?) ฉันจำเป็นต้องสร้างคีย์แท็บแยกต่างหากสำหรับโดเมนย่อยของสาขาหรือไม่

นอกจากนี้ เนื่องจากเป็นเซิร์ฟเวอร์ที่ใช้งานจริงซึ่งฉันไม่สามารถรีสตาร์ทได้ตามอำเภอใจ ฉันจำเป็นต้องรีสตาร์ทบริการใดบ้างหลังจากเปลี่ยนแปลงสิ่งต่าง ๆ ใน krb5.conf

answer

ฉันเพิ่งพบปัญหาเดียวกันกับคุณ และต้องขอบคุณกระทู้นี้ที่นี่ ฉันพบคำตอบแล้ว!

หลังจากเปิดขอบเขตที่สอง (ที่เชื่อถือได้) ในmod_auth_kerbการตั้งค่าของฉันและวางสิ่งที่ถูกต้องลงในคีย์แท็บ หากฉันพยายามลงชื่อเข้าใช้กับผู้ใช้จากโดเมนที่สอง ฉันได้รับข้อผิดพลาดในบันทึก httpd เช่น:

[auth_kerb:notice] [pid 1234] [client X.X.X.X:12345] krb5_aname_to_localname() found no mapping for principal [email protected]

ข่าวดีก็คือฉันได้แก้ไขมันแล้ว! รายละเอียดด้านล่าง....


ประการแรก ในการกำหนดค่า Apache HTTPD ของคุณ คุณต้องการสิ่งต่อไปนี้

# Use this one for both Examples and Branches together
KrbAuthRealms EXAMPLE.COM BRANCHES.EXAMPLE.COM

# Strip the realm from the username
KrbLocalUserMapping On

ที่บอกmod_auth_kerbให้ยอมรับผู้ใช้จากขอบเขตโดเมนหลักหรือสาขาหนึ่ง และแยกขอบเขตออกจากชื่อผู้ใช้ หมายความว่า[email protected]ไปที่ผู้ดูแลระบบในขณะที่[email protected]ไปที่guest

ขั้นต่อไป สมมติว่าเป็น Kerberos ของ MIT คุณต้องแก้ไข/etc/krb5.confไฟล์ของคุณและบอกวิธีการจับคู่ตัวการกับชื่อผู้ใช้ ด้วยเหตุผลทางประวัติศาสตร์หลายประการ การดำเนินการนี้ไม่ได้ดำเนินการในlibdefaultsส่วนที่คุณคาดหวัง มันไม่ได้ทำในส่วนต่ออาณาจักรเช่นกันซึ่งทำให้ฉันผิดหวัง แต่จะทำกับauth_to_localรายการใน[realm]ส่วนของขอบเขตเริ่มต้นแทน

โดยค่าเริ่มต้นkrb5_aname_to_localname()ฟังก์ชัน libkrb5 จะลบขอบเขตออกจากขอบเขตเริ่มต้น และปล่อยไว้ที่นั่นมิฉะนั้น ดังนั้นเราต้องเพิ่มรายการเพื่อบอกให้ดึงขอบเขตออกจากขอบเขตกิ่งเช่นกัน (กฎที่ซับซ้อนยิ่งขึ้นก็สามารถทำได้ ดูkrb5.confหน้าคู่มือสำหรับข้อมูลเพิ่มเติม)

ดังนั้น เราต้องการให้การกำหนดค่าของเราเป็นดังนี้:

[libdefaults]
  default_realm = EXAMPLE.COM

[realms]
   EXAMPLE.COM = {
     kdc = dc.example.com
     admin_server = dc.example.com
     auth_to_local = RULE:[1:[email protected]$0](^.*@BRANCHES\.EXAMPLE\.COM)s/@.*//
     auth_to_local = DEFAULT
   }
   BRANCHES.EXAMPLE.COM = {
     kdc = dc.branches.example.com
     admin_server = dc.branches.example.com
   }

สังเกตว่าBRANCHES.EXAMPLE.COMกฎการทำแผนที่ไม่ได้อยู่ในขอบเขตของมัน แต่อยู่ในEXAMPLE.COMขอบเขตหลักซึ่งเป็นขอบเขตเริ่มต้น


Also, since it is a production server which I cannot arbitrarily restart, what services do i need to restart after changing things in the krb5.conf?

แค่ต้องเริ่มบริการ Apache HTTPD ใหม่หลังการเปลี่ยนแปลง

เพียงเพื่อเพิ่มคำตอบของ @ Gragravarr (ซึ่งใช้งานได้ดีมาก ขอบคุณมาก !) หากคุณมีKrbServiceName PROTOCOL/domain.of.your.serviceคำแนะนำในการกำหนดค่า apache คุณจะต้องแทนที่ด้วยKrbServiceName Any(มิฉะนั้นคุณจะได้รับข้อผิดพลาดเพราะ Kerb/Apache จะตรวจสอบ ชื่อบริการของคุณเทียบกับแต่ละอาณาจักร...)