Kerberos ทำงานกับ SSH อย่างไร


22

สมมติว่าฉันมีคอมพิวเตอร์สี่เครื่องแล็ปท็อปเซิร์ฟเวอร์ 1 เซิร์ฟเวอร์ 2 เซิร์ฟเวอร์ Kerberos:

  • ฉันเข้าสู่ระบบโดยใช้ PuTTY หรือ SSH จาก L ถึง S1 โดยระบุชื่อผู้ใช้ / รหัสผ่านของฉัน
  • จาก S1 ฉันแล้ว SSH ถึง S2 ไม่ต้องใช้รหัสผ่านเนื่องจาก Kerberos รับรองความถูกต้องของฉัน

อธิบายการแลกเปลี่ยนโปรโตคอล SSH และ KRB5 ที่สำคัญทั้งหมด: "L ส่งชื่อผู้ใช้ไปที่ S1", "K ส่ง ... ไปยัง S1" ฯลฯ

(คำถามนี้มีวัตถุประสงค์เพื่อแก้ไขโดยชุมชนโปรดปรับปรุงสำหรับผู้อ่านที่ไม่ใช่ผู้เชี่ยวชาญ )

คำตอบ:


27

เข้าสู่ระบบครั้งแรก:

  • L ส่งชื่อผู้ใช้และคำขอการตรวจสอบความถูกต้อง SSH ไปยัง S1
  • S1 ส่งคืนกลไกการพิสูจน์ตัวตน SSH ที่มีอยู่พร้อมกับ "รหัสผ่าน" เป็นหนึ่งในนั้น
  • L เลือก "รหัสผ่าน" และส่งรหัสผ่านธรรมดาไปที่ S1
  • S1 มอบชื่อผู้ใช้และรหัสผ่านให้กับ PAM stack
  • บน S1, PAM (โดยปกติpam_krb5หรือpam_sss) ร้องขอ TGT (ตั๋วให้สิทธิตั๋ว) จาก Kerberos KDC
    1. S1 ได้รับ TGT
      • แบบเก่า (ไม่มี preauth): S1 ส่ง AS-REQ และรับ AS-REP ที่มี TGT
      • รูปแบบใหม่ (พร้อม preauth): S1 ใช้รหัสผ่านของคุณเพื่อเข้ารหัสการประทับเวลาปัจจุบันและแนบกับ AS-REQ เซิร์ฟเวอร์ถอดรหัสการประทับเวลาและตรวจสอบว่าอยู่ภายในระยะเวลาที่อนุญาต หากการถอดรหัสล้มเหลวรหัสผ่านจะถูกปฏิเสธทันที มิฉะนั้นจะส่งคืน TGT ใน AS-REP
    2. S1 พยายามถอดรหัส TGT โดยใช้รหัสที่สร้างขึ้นจากรหัสผ่านของคุณ หากการถอดรหัสสำเร็จรหัสผ่านจะถูกยอมรับว่าถูกต้อง
    3. TGT ถูกเก็บไว้ในแคชข้อมูลรับรองที่สร้างขึ้นใหม่ (คุณสามารถตรวจสอบ$KRB5CCNAMEตัวแปรสภาพแวดล้อมเพื่อค้นหา ccache หรือใช้klistเพื่อแสดงรายการเนื้อหา)
  • S1 ใช้ PAM เพื่อดำเนินการตรวจสอบการอนุญาต (ขึ้นอยู่กับการกำหนดค่า) และเปิดเซสชัน
    • หากpam_krb5เรียกว่าอยู่ในขั้นตอนการอนุญาตจะตรวจสอบว่า~/.k5loginมีอยู่จริงหรือไม่ ถ้าเป็นเช่นนั้นจะต้องแสดงรายการไคลเอ็นต์ Kerberos มิฉะนั้นเงินต้นได้รับอนุญาตเพียงอย่างเดียวคือusername@DEFAULT-REALM

เข้าสู่ระบบที่สอง:

  • S1 ส่งชื่อผู้ใช้และคำขอ SSH authn ไปยัง S2
  • S2 ส่งคืนการตรวจสอบสิทธิ์ที่ใช้ได้ซึ่งหนึ่งในนั้นคือ "gssapi-with-mic" 1
  • S1 ร้องขอตั๋วโดยส่ง TGS-REQ พร้อม TGT ไปยัง KDC และรับ TGS-REP พร้อมตั๋วบริการจากมันhost/s2.example.com@EXAMPLE.COM
  • S1 สร้าง "AP-REQ" (คำขอการตรวจสอบสิทธิ์) แล้วส่งไปที่ S2
  • S2 พยายามถอดรหัสคำขอ หากสำเร็จจะทำการตรวจสอบสิทธิ์ (PAM ไม่ได้ใช้สำหรับการตรวจสอบ)
    • โปรโตคอลอื่น ๆ เช่น LDAP อาจเลือกเข้ารหัสการส่งข้อมูลเพิ่มเติมด้วย "session key" ที่รวมอยู่ในคำขอ อย่างไรก็ตาม SSH ได้ทำการเจรจาเลเยอร์การเข้ารหัสของตัวเองแล้ว
  • หากการรับรองความถูกต้องสำเร็จ S2 ใช้ PAM เพื่อดำเนินการตรวจสอบการอนุญาตและเปิดเซสชันเช่นเดียวกับ S1
  • หากเปิดใช้งานการส่งต่อข้อมูลรับรองและ TGT มีการตั้งค่าสถานะ "ส่งต่อ" S1 ร้องขอสำเนาของ TGT ของผู้ใช้ (พร้อมชุดธง "ส่งต่อ") และส่งไปยัง S2 ซึ่งเก็บไว้ใน CCache ใหม่ สิ่งนี้อนุญาตการล็อกอินที่รับรองความถูกต้อง Kerberos แบบเรียกซ้ำ

โปรดทราบว่าคุณสามารถรับ TGT ในเครื่องได้เช่นกัน บน Linux คุณสามารถทำเช่นนี้ใช้แล้วเชื่อมต่อโดยใช้kinit ssh -Kสำหรับ Windows หากคุณลงชื่อเข้าใช้โดเมน Windows AD Windows จะทำเช่นนั้นสำหรับคุณ ไม่เช่นนั้นMIT Kerberosก็สามารถใช้ได้ PuTTY 0.61 รองรับการใช้งานทั้ง Windows (SSPI) และ MIT (GSSAPI) ถึงแม้ว่าคุณจะต้องเปิดใช้งานการส่งต่อ (มอบหมาย) ด้วยตนเอง


1 gssapi-keyexยังเป็นไปได้ แต่ไม่ได้รับการยอมรับใน OpenSSH อย่างเป็นทางการ


คุณสามารถอธิบายความสัมพันธ์ระหว่างรหัสผ่าน TGT และการตอบสนองจาก KDC ได้ไหม? มันยังไม่ชัดเจนว่า PAM ตัดสินใจได้อย่างไรว่ารหัสผ่านนั้นถูกต้อง
ฟิล

หมายเหตุ: ประโยคนี้ไม่ถูกต้อง: "S1 ส่ง TGS-REQ และรับ TGS-REP ที่มี TGT" ไม่ถูกต้องเนื่องจาก TGT มาเป็นส่วนหนึ่งของ AS_REP ตั๋วบริการจะกลับมาพร้อมกับ TGS_REPn
jouell

1
OpenSSH เวอร์ชันล่าสุดมีการแลกเปลี่ยนคีย์ ฉันคิดว่า 4.2p1 เป็นรุ่นแรกที่มีแพตช์ ( sxw.org.uk/computing/patches/openssh.html )
quinnr

ไม่พวกเขาทำไม่ได้ นั่นคือแพทช์ของบุคคลที่สาม นั่นคือสิ่งที่ฉันหมายถึงโดย "ไม่ยอมรับใน OpenSSH อย่างเป็นทางการ"
grawity

0

ในการสรุปเรื่องสั้น: ควรมีตั๋ว Kerberos บนเทอร์มินัล (L) ของคุณไม่ว่าจะด้วยkinitคำสั่งหรือเป็นส่วนหนึ่งของลำดับการล็อกอินในเครื่องในการตั้งค่า "single sign-on" ระบบระยะไกล (S1, S2) จะสามารถเข้าถึงได้โดยไม่ต้องแจ้งรหัสผ่าน การเข้าถึงที่ถูกล่ามโซ่ (L → S1 → S2) เป็นไปได้โดยใช้เทคนิคที่เรียกว่า "การส่งต่อตั๋ว" โดยเฉพาะอย่างยิ่งการตั้งค่านี้ต้องการ KDC ที่สามารถเข้าถึงได้โดยตรงจากเทอร์มินัล (L)

คำตอบอื่น ๆ โดยgrawityอธิบายวิธีการนี้ในรายละเอียด


-2

ขั้นตอนที่ไม่ชัดเจนเพียงอย่างเดียวที่นี่ก็คือจะมีโมดูล PAM ใน S1 ที่ใช้ข้อมูลประจำตัวของคุณเพื่อดำเนินการkinitและทำให้คุณได้รับตั๋วที่ให้ตั๋วจาก K (การตรวจสอบลูกค้า) จากนั้นเมื่อคุณ SSH ถึง S2 โดยใช้การตรวจสอบสิทธิ์ Kerberos จะมีการตรวจสอบสิทธิ์บริการลูกค้า ฉันไม่เห็นประโยชน์ของการแลกเปลี่ยนข้อความที่น่าเบื่อทุกข้อความ

ส่ง-vvvคำสั่ง ssh ของคุณหากคุณต้องการเห็นทุกข้อความและอ่านคำอธิบาย Wikipediaของ Kerberos


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