OpenSSH พร้อมพับลิกคีย์จากฐานข้อมูล


14

เป็นไปได้ที่จะดึงกุญแจสาธารณะจากฐานข้อมูลแทนที่จะเป็นไฟล์ authorized_keys หรือไม่?

ฉันต้องการใช้การตั้งค่าดังกล่าวเพื่อจัดการการเข้าถึง ssh เช่นที่เก็บ git สำหรับผู้ใช้หลายคนโดยไม่จำเป็นต้องสร้างไฟล์ authorized_keys ใหม่ทุกครั้งที่มีการเปลี่ยนหรือเพิ่มพับลิกคีย์


1
ฉันใช้หุ่นเชิดเพื่อสิ่งนี้
Matt Simmons

Userify สามารถจัดการบัญชีเหล่านั้นด้วยการจัดการแบบรวมศูนย์ แต่การรับรองความถูกต้องแบบโลคัล .. ด้วยวิธีนี้ถ้าฐานข้อมูลส่วนกลางของคุณล่มคุณยังสามารถเข้าไปได้ แต่คุณจะได้รับประโยชน์ทั้งหมดจากการจัดการแบบรวมศูนย์
Jamieson Becker

คำตอบ:


16

ฉันพบคำถามนี้เมื่อพยายามตอบด้วยตนเอง หลังจากการค้นหาและการทดลองฉันพบตัวเลือกอื่น ๆ สำหรับสิ่งนี้ ฉันจะข้ามส่วนเกี่ยวกับการแจกจ่ายกุญแจเป็นทางเลือกเนื่องจาก Matt Simmons กล่าวถึงเรื่องนั้น นอกจากนี้ฉันรู้ว่ามีบางครั้งที่ไม่ดีพอ ตัวอย่างเช่นถ้าคุณเป็น GitHub และต้องเก็บกุญแจสาธารณะนับล้านกับผู้ใช้คนเดียวอัปเดตไฟล์ SSH authorized_keys อย่างต่อเนื่องและทำให้ซิงโครไนซ์ข้ามกล่องที่มีขอบหลายสิบถึงร้อยกล่องนั้นไม่เหมาะสมหรือไม่ต้องการ

ดังนั้น,

  1. ประการแรก RedHat (และตัวแปร) มีแพตช์ที่รองรับสำหรับ OpenSSH ที่เพิ่มAuthorizedKeysCommandและAuthorizedKeysCommandRunAsตัวเลือก แพทช์ได้รับการรวมอัปสตรีมใน openssh 6.2 อ้างจากหน้าคน :

    AuthorizedKeysCommand

    ระบุโปรแกรมที่จะใช้สำหรับการค้นหาพับลิกคีย์ของผู้ใช้ โปรแกรมจะถูกเรียกใช้โดยมีอาร์กิวเมนต์แรกคือชื่อของผู้ใช้ที่ได้รับอนุญาตและควรสร้างบรรทัดมาตรฐาน AuthorizedKeys (ดู AUTHORIZED_KEYS ใน sshd (8)) โดยค่าเริ่มต้น (หรือเมื่อตั้งค่าเป็นสตริงว่าง) จะไม่มีการเรียกใช้ AuthorizedKeysCommand ถ้า AuthorizedKeysCommand ไม่สามารถอนุญาตผู้ใช้ได้สำเร็จการให้สิทธิ์จะผ่านไปยัง AuthorizedKeysFile โปรดทราบว่าตัวเลือกนี้มีผลเฉพาะเมื่อเปิด PubkeyAuthentication

    AuthorizedKeysCommandRunAs

    ระบุผู้ใช้ภายใต้บัญชี AuthorizedKeysCommand ที่ถูกเรียกใช้ สตริงว่าง (ค่าเริ่มต้น) หมายถึงผู้ใช้ที่ได้รับอนุญาตถูกใช้งาน

    ในการทดลองของฉันคืนนี้ฉันพบว่ามันไม่ได้ผลเพราะนโยบาย SELinux เริ่มต้น คุณจะได้รับรอบนี้โดยการปิดการบังคับใช้ SELinux setenforce 0กับ เนื่องจากการเปลี่ยน SELinux อาจเป็นแนวคิดที่ไม่ดีแต่คุณสามารถสร้างนโยบายที่ถูกต้องได้ ในกรณีของฉันที่เป็นง่ายๆเป็นความพยายามที่จะเข้าสู่ระบบด้วยAuthorizedKeysCommandตัวเลือกการตั้งค่าในแล้วใช้/etc/ssh/sshd_config audit2allow -a -M local && semodule -i local.ppสิ่งนี้จะดูผ่านบันทึกการตรวจสอบและค้นหาสิ่งที่ถูกป้องกันและสร้างข้อยกเว้นสำหรับพวกเขา หากคุณมีแนวโน้มที่จะมีสิ่งอื่นในนั้นที่อาจได้รับรายการที่อนุญาตคุณควรเรียนรู้เพิ่มเติมเกี่ยวกับaudit2allowการทำให้แน่ใจว่าคุณได้รับนโยบายใหม่อย่างถูกต้อง

  2. มีแพทช์อื่น ๆ (น่าจะผ่านการทดสอบและเชื่อถือได้น้อยกว่า) ออกมีเพื่อเพิ่มฟังก์ชันการทำงานที่คล้ายกัน ตัวอย่างเช่นมี, openssh-สคริปต์รับรองความถูกต้อง คุณสามารถค้นหาแพตช์ที่ RedHat ใช้และนำไปใช้โดยตรง การแข่งขันอย่างรวดเร็วของ Googling ปล่องhttps://launchpadlibrarian.net/89063205/openssh-5.3p1-authorized-keys-command.patchและhttps://launchpadlibrarian.net/105938151/openssh-authorized-keys-command.patchซึ่งเป็น อิงตามเวอร์ชัน RH แต่ได้รับการอัพเดตสำหรับ OpenSSH เวอร์ชันใหม่กว่า

  3. Patch OpenSSH เพื่อทำการค้นหาคีย์โดยตรงจากร้านค้าบางแห่ง (เช่นGitHubและ CodeBaseHQ และอื่น ๆ ได้ทำ) GitHub ไม่ได้เปิดซอร์สแพทช์นี้เพื่อความรู้ที่ดีที่สุดของฉัน แต่ฉันรู้ว่าในอดีตฉันเคยเจอรุ่นสำหรับการค้นหาคีย์ MySQL และ PostgreSQL ฉันพยายามค้นหาพวกเขาอีกครั้งในตอนนี้ แต่ยังไม่มีโชคมาก

  4. นอกจากนี้ยังมีตัวเลือกตาม FUSE ตัวอย่างเช่นมีLPKFuseซึ่งช่วยให้คุณให้บริการกุญแจสาธารณะจาก LDAP โดยการเปลี่ยนAuthorizedKeysFileตำแหน่งเป็นหนึ่งในระบบไฟล์ LPKFuse LPKFuse FS สร้างไฟล์เสมือนที่เนื้อหาได้รับการสนับสนุนจากฟิลด์จากเซิร์ฟเวอร์ไดเรกทอรี


โดยสรุปฉันคิดว่าตัวเลือก # 1 นั้นดีที่สุดเนื่องจาก RedHat ได้รับการสนับสนุนอย่างเป็นทางการ นอกจากนี้ยังช่วยให้คุณสามารถวางตรรกะใด ๆ ที่คุณต้องการในสคริปต์นั้น (รวมถึงการพูดคุยกับฐานข้อมูล) ในภาษาที่คุณต้องการ


Re: # 1 พบว่าดี !! ฉันหวังว่าจะไปทางต้นน้ำมันจะเป็นประโยชน์ใน ESXi
Jason Tan

@ JasonTan: AuthorKeyKommand ไปอัปสตรีมใน openssh 6.2 ฉันได้อัปเดตคำตอบแล้วเพื่อสะท้อนว่า
Bluewind

คำตอบที่ดีตัวเลือกที่ 1 คือสิ่งที่ฉันกำลังมองหา
Shane Kilkelly

3

OpenSSH ไม่มีความสามารถนี้เท่าที่ฉันทราบ ทางออกที่ดีที่สุดของคุณคือให้สคริปต์สร้างไฟล์ใหม่ทุกคืนโดยอัตโนมัติ (หรือบ่อยเท่าที่จำเป็น)

นอกจากนี้คุณอาจต้องการเห็นคำถามนี้: ระบบสำหรับแจกจ่ายกุญแจสาธารณะ SSH


1

ฉันเชื่อว่าในรุ่น openssh รุ่นใหม่คุณสามารถจัดเก็บคีย์ในรายการ LDAP ของผู้ใช้ได้ หากคุณใช้ LDAP หรือ AD สำหรับการจัดการบัญชีอยู่แล้วคุณควรจะสามารถใช้ประโยชน์จากมันเพื่อการจัดการคีย์ได้เช่นกัน

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