ใช้คีย์ส่งต่อเฉพาะจากตัวแทน SSH หรือไม่


30

สมมติว่าฉันมีกุญแจสำหรับ Github พร้อมกับปุ่มอื่น ๆ ฉันได้เพิ่มกุญแจจำนวนมากให้กับตัวแทน ssh ของฉัน ( ssh-add -Lคืนสายจำนวนมาก) ที่คอมพิวเตอร์ที่บ้านของฉัน A. ในฉัน.ssh/configฉันได้ตั้งค่าคีย์ที่จะใช้กับโฮสต์ที่ดังนั้นเช่น

ssh -T -vvv git@github.com 2>&1 | grep Offering

จะช่วยให้

debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.github

เสนอคีย์เดียวเท่านั้นตามที่คาดไว้ แต่จากนั้นจึงไปยังโฮสต์ B ด้วยForwardAgent yesและทำซ้ำคำสั่งเดียวกันฉันจะได้รับ

debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.linode2
debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.helium
debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.github

หมายความว่ามันจะลองใช้กุญแจทั้งหมดของฉัน นี่คือปัญหาตั้งแต่เพียงจำนวน จำกัด Too many authentication failuresของคีย์สามารถพยายามก่อนที่เซิร์ฟเวอร์ของผลตอบแทน ดังนั้นฉันจึงลองแก้ไข.ssh/configบนโฮสต์ B เพื่อรวม

Host github.com
  IdentityFile /Users/doxna/.ssh/id_rsa.github
  IdentitiesOnly yes

แต่ฉันก็ไม่ได้รับข้อเสนอที่สำคัญ

debug2: key: /Users/doxna/.ssh/id_rsa.github ((nil))

ซึ่งฉันเดาว่าหมายความว่าไม่พบกุญแจ (?) และหลังจากนั้นกุญแจอยู่ที่คอมพิวเตอร์ที่บ้าน A ไม่ใช่ host B ดังนั้นคำถามคือวิธีอ้างอิงถึงที่ host B? หวังว่าฉันจะสามารถอธิบายคำถามได้

คำตอบ:


28

คุณมีความคิดที่ถูกต้อง ส่วนเดียวที่คุณขาดหายไปคือไฟล์นั้นIdentityFileต้องชี้ไป ไม่จำเป็นต้องมีรหัสส่วนตัวการมีเพียงกุญแจสาธารณะที่มีอยู่ก็เพียงพอแล้ว

บนโฮสต์ B คุณสามารถแยกพับลิกคีย์จากเอเจนต์โดยพิมพ์ssh-add -L | grep /Users/doxna/.ssh/id_rsa.github > ~/.ssh/id_rsa.github.pubจากนั้นชี้ไปที่ไฟล์นั้น~/.ssh/config


FYI ชื่อกุญแจสาธารณะไม่สำคัญ มันจะเลือกคีย์ที่เหมาะสมจากตัวแทนตามเนื้อหา
akostadinov

@akostadinov True หากคุณชี้sshไปที่ไฟล์พับลิกคีย์ที่ไม่มีไฟล์ไพรเวตคีย์ที่เกี่ยวข้องมันควรอ่านพับลิกคีย์จากไฟล์และให้เอเจนต์ใช้ไพรเวตคีย์ที่เกี่ยวข้องเพื่อสร้างลายเซ็น
kasperd

สิ่งนี้จะช่วยประหยัดคีย์ของคุณบนโฮสต์ B! ดูคำตอบด้านล่างโดย @ mc0e สำหรับวิธีแก้ปัญหาที่ไม่ได้บันทึกคีย์ไว้บนเซิร์ฟเวอร์
Pitt

2
@ พิตต์ไม่ได้ทำ มันจะเก็บกุญแจสาธารณะเท่านั้น และนั่นไม่ใช่ปัญหาเพราะกุญแจสาธารณะไม่เคยถูกคาดหวังให้เก็บเป็นความลับตั้งแต่แรก การส่งต่อตัวแทนให้การเข้าถึงโฮสต์เพื่อใช้กุญแจตราบเท่าที่การส่งต่อตัวแทนอยู่ในสถานที่ แต่ตัวแทนจะไม่ส่งคีย์ลับที่ใดก็ได้
kasperd

@kasperd คุณไม่จำเป็นต้องใช้สำเนาส่วนตัวของคีย์ส่วนตัวในขณะที่คุณมีการเชื่อมต่อแบบสดกับตัวแทนผู้ใช้ด้วยรหัส ในฐานะที่เป็น root คุณสามารถเข้าถึงการเชื่อมต่อตัวแทนของผู้ใช้อื่น ๆ ที่เข้าสู่ระบบ
mc0e

5

คำตอบที่ดีจาก @Kasperd แต่โปรดทราบด้วยว่าหาก Host B ถูกบุกรุกหรือหากคุณไม่ไว้วางใจผู้ที่มีสิทธิ์ใช้งานรูทนั้นคุณก็จะยังคงเปิดเผยคีย์ทั้งหมดของคุณว่ามีการละเมิดตราบเท่าที่คุณเข้าสู่ระบบ ในโฮสต์นั้น

ดังนั้นวิธีที่ดีกว่าอาจเป็นการส่งต่อการเข้าถึงคีย์ที่คุณต้องการเท่านั้น อาจจะลองssh-agent-filterซึ่งอยู่ในเดเบียน / อูบุนตูที่เก็บหรือจากGitHub

แก้ไข: ฉันได้ตัดสินssh-identมากกว่าssh-agent-filterการส่งต่อปุ่มเลือกแม้ว่ามันจะไม่เป็นประสบการณ์ที่ราบรื่นอย่างที่ใคร ๆ ก็คาดหวัง


1
จากความคิดเห็นของ @ kasperd เกี่ยวกับคำตอบของเขา: "มันไม่ได้มันเก็บกุญแจสาธารณะเท่านั้นและนั่นไม่ใช่ปัญหาเนื่องจากกุญแจสาธารณะไม่เคยถูกคาดหวังว่าจะถูกเก็บเป็นความลับในตอนแรก Agent forwarding ช่วยให้โฮสต์เข้าถึง ใช้รหัสตราบเท่าที่ตัวแทนส่งต่ออยู่ แต่ตัวแทนจะไม่ส่งรหัสลับใด ๆ "
Bdoserror

1
@Bdoserror ในฐานะที่เป็น root คุณสามารถละเมิดการเชื่อมต่อ ssh-agent ในขณะที่ผู้ใช้ที่เกี่ยวข้องเข้าสู่ระบบคุณเพียงแค่คัดลอกSSH_*ตัวแปรสภาพแวดล้อมและเข้าสู่ระบบทุกที่ที่คุณต้องการใช้กุญแจแม้ว่าจะไม่เคยมีการคัดลอกจริง
mc0e

เพื่อชี้แจง: คำตอบนี้ผิดแน่นอน - ในขณะที่สถานการณ์การละเมิดจาก mc0e เป็นจริง แต่ไม่มีอะไรเกี่ยวข้องกับการบันทึกคีย์สาธารณะ - หากโฮสต์กลางถูกบุกรุกการเชื่อมต่อตัวแทนของคุณสามารถใช้รับรองความถูกต้องกับคีย์ส่วนตัวของคุณได้ ไม่ว่าคุณจะบันทึกกุญแจสาธารณะในโฮสต์ระดับกลางหรือไม่ ไพรเวตคีย์ของคุณจะไม่ถูกบุกรุกและการบันทึกคีย์สาธารณะจะไม่ทำให้ง่ายขึ้นเนื่องจากผู้โจมตีที่มีการเชื่อมต่อกับเอเจนต์สามารถขอกุญแจสาธารณะได้
Reinstate Monica

@ marc-lehmann อ่านสิ่งที่ฉันเขียน หากคุณส่งต่อคีย์พวกเขาจะถูกเปิดเผย แต่คุณสามารถ จำกัด ได้ว่าจะส่งต่อคีย์ใด
mc0e

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