เพิ่มโฮสต์ (เช่น GitHub) ลงในไฟล์ SSH known_hosts อย่างปลอดภัย


20

ฉันจะเพิ่มโฮสต์คีย์ลงในknown_hostsไฟล์SSH อย่างปลอดภัยได้อย่างไร

ฉันกำลังตั้งค่าเครื่องพัฒนาและฉันต้องการ (เช่น) ป้องกันไม่gitให้พรอมต์เมื่อฉันโคลนที่เก็บจากการgithub.comใช้ SSH

ฉันรู้ว่าฉันสามารถใช้StrictHostKeyChecking=no(เช่นคำตอบนี้ ) แต่นั่นไม่ปลอดภัย

จนถึงตอนนี้ฉันได้พบ ...

  1. GitHub เผยแพร่ลายนิ้วมือกุญแจ SSH ที่https://help.github.com/articles/github-s-ssh-key-fingerprints/

  2. ฉันสามารถใช้เพื่อให้ได้คีย์โฮสต์สำหรับssh-keyscangithub.com

ฉันจะรวมข้อเท็จจริงเหล่านี้ได้อย่างไร เมื่อระบุรายการลายนิ้วมือแบบ prepopulated ฉันจะตรวจสอบได้อย่างไรว่าssh-keyscanสามารถเพิ่มเอาท์พุทของลงในknown_hostsไฟล์ได้อย่างไร


ฉันเดาว่าฉันกำลังถามสิ่งต่อไปนี้:

ฉันจะรับลายนิ้วมือสำหรับคีย์ที่ส่งคืนโดยได้ssh-keyscanอย่างไร

สมมติว่าฉันเป็นMITM-edสำหรับ SSH แล้ว แต่ฉันสามารถเชื่อถือหน้า GitHub HTTPS (เพราะมีสายใบรับรองที่ถูกต้อง)

นั่นหมายความว่าฉันได้รับคีย์โฮสต์ SSH (สงสัย) จาก ( ssh-keyscan) และบางลายนิ้วมือคีย์ (ที่เชื่อถือได้) ฉันจะยืนยันหนึ่งรายการกับอีกอันได้อย่างไร


ที่เกี่ยวข้อง: ฉันจะแฮชส่วนโฮสต์ของผลลัพธ์ได้ssh-keyscanอย่างไร หรือฉันสามารถผสมถก / hosts Unhashed ในknown_hosts?


ทำไมมันจะไม่ปลอดภัยสำหรับกรณีการใช้งานของคุณ?
สี่เท่า

StrictHostKeyChecking=noเสี่ยงต่อ MITM คือssh-keyscanMITM กับความปลอดภัยหรือไม่
Roger Lipscombe

ฉันไม่เข้าใจว่าทำไมฉันถึงเป็นห่วงคนที่ปลอมตัวเป็นคนแปลกหน้าฉันไม่เคยเจอใครที่ฉันไว้ใจพอที่จะเขียนโค้ดฉันกำลังจะดาวน์โหลดและรัน ...
quadruplebucky

เพราะนี่คือซอร์สโค้ดของฉันใน repo ส่วนตัวบน github และฉันไม่ต้องการ MITM (เช่น) แนะนำการเปลี่ยนแปลงที่เป็นอันตรายเมื่อฉันกดคอมมิชชัน นั่นเป็นเพียงหนึ่งตัวอย่างเช่น
Roger Lipscombe

ฉัน (ดีขึ้นหรือแย่ลง) เลือกที่จะเชื่อใจ GitHub ฉันไม่เลือกที่จะเชื่อทุกลิงก์เครือข่ายแบบสุ่มระหว่างฉันกับพวกเขา
Roger Lipscombe

คำตอบ:


11

ส่วนที่สำคัญที่สุดของการเพิ่มรหัสอย่างปลอดภัยลงในknown_hostsไฟล์คือการได้รับลายนิ้วมือที่สำคัญจากผู้ดูแลเซิร์ฟเวอร์ ลายนิ้วมือที่สำคัญควรมีลักษณะเช่นนี้:

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

ในกรณีของ GitHub ปกติเราไม่สามารถพูดคุยกับผู้ดูแลระบบได้โดยตรง อย่างไรก็ตามพวกเขาวางกุญแจบนหน้าเว็บของพวกเขาเพื่อให้เราสามารถกู้คืนข้อมูลจากที่นั่น

การติดตั้งคีย์ด้วยตนเอง

1)คัดลอกคีย์จากเซิร์ฟเวอร์และรับลายนิ้วมือ หมายเหตุ: ทำสิ่งนี้ก่อนตรวจสอบลายนิ้วมือ

$ ssh-keyscan -t rsa github.com | tee github-key-temp | ssh-keygen -lf -
# github.com:22 SSH-2.0-babeld-f3847d63
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

2)รับสำเนาของคีย์ลายนิ้วมือจากผู้ดูแลเซิร์ฟเวอร์ - ในกรณีนี้ไปที่หน้าพร้อมข้อมูลใน github.com

  1. ไปที่ github.com
  2. ไปที่หน้าช่วยเหลือ (บนเมนูทางด้านขวาหากลงชื่อเข้าใช้; ที่ด้านล่างของโฮมเพจเป็นอย่างอื่น)
  3. ในการเริ่มต้นส่วนใช้ให้ไปที่เชื่อมต่อกับ GitHub ด้วย SSH
  4. ไปที่ การทดสอบการเชื่อมต่อ SSH ของคุณ
  5. คัดลอกลายนิ้วมือ SHA256 จากหน้านั้นลงในโปรแกรมแก้ไขข้อความของคุณเพื่อใช้ในภายหลัง

3)เปรียบเทียบคีย์จากสองแหล่ง

การวางพวกมันไว้เหนือตัวอื่น ๆ ในเท็กซ์เอดิเตอร์ทำให้ง่ายต่อการดูว่ามีอะไรเปลี่ยนแปลงหรือไม่

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA) #key recovered from github website
2048 SHA256:nThbg6kXUpJ3Gl7E1InsaspRomtxdcArLviKaEsTGY8 github.com (RSA) #key recovered with keyscan

(โปรดสังเกตว่าคีย์ที่สองได้รับการจัดการ แต่มันก็ค่อนข้างคล้ายกับต้นฉบับ - ถ้ามีอะไรทำนองนี้เกิดขึ้นคุณกำลังถูกโจมตีอย่างรุนแรงและควรติดต่อผู้เชี่ยวชาญด้านความปลอดภัยที่เชื่อถือได้)

ถ้าปุ่มต่าง ๆ ยกเลิกขั้นตอนและติดต่อกับผู้เชี่ยวชาญด้านความปลอดภัย

4)หากเปรียบเทียบคีย์อย่างถูกต้องคุณควรติดตั้งคีย์ที่คุณดาวน์โหลดไปแล้ว

cat github-key-temp >> ~/.ssh/known_hosts

หรือเพื่อติดตั้งสำหรับผู้ใช้ทั้งหมดในระบบ (ในฐานะรูท):

cat github-key-temp >> /etc/ssh/ssh_known_hosts

การติดตั้งคีย์อัตโนมัติ

หากคุณต้องการเพิ่มคีย์ในระหว่างกระบวนการสร้างคุณควรทำตามขั้นตอนที่ 1-3 ของกระบวนการด้วยตนเองด้านบน

หลังจากนั้นให้ตรวจสอบเนื้อหาของgithub-key-tempไฟล์ของคุณและสร้างสคริปต์เพื่อเพิ่มเนื้อหาเหล่านั้นลงในไฟล์โฮสต์ที่คุณรู้จัก

if ! grep github.com ~/.ssh/known_hosts > /dev/null
then
     echo "github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==" >> ~/.ssh/known_hosts
fi

ตอนนี้คุณควรกำจัดใด ๆsshคำสั่งที่มีStrictHostKeyCheckingคนพิการ


17

คุณสามารถผสมรายการที่แฮช / ไม่ได้แฮชในไฟล์ known_hosts ของคุณ

ดังนั้นหากคุณต้องการเพิ่มคีย์ Github คุณสามารถทำได้:

ssh-keyscan github.com >> ~/.ssh/known_hosts

หากคุณต้องการแฮชให้เพิ่ม -H

ssh-keyscan -H github.com >> ~/.ssh/known_hosts


1
ข้อแตกต่างระหว่าง hashed / unhashed คืออะไร ฉันรู้ว่า hashing คืออะไรไม่ใช่ทำไมมันถูกนำไปใช้ในบริบทนี้
เกลนโทมัส

3
การแฮชรายการของคุณช่วยให้คุณสามารถซ่อนข้อมูลเกี่ยวกับโฮสต์ที่คุณใช้ในการเชื่อมต่อ ตรวจสอบคำตอบที่ได้รับการยอมรับได้ที่security.stackexchange.com/questions/56268/…
Wee

4
สิ่งนี้ไม่ตอบคำถาม การใช้ ssh-keyscan นั้นขึ้นอยู่กับชายคนหนึ่งในการโจมตีกลางซึ่งหมายความว่ากุญแจที่คุณเก็บไว้อาจเป็นกุญแจที่เป็นของผู้โจมตีที่พยายามเจาะเข้าสู่ระบบของคุณ โปรดดูคำตอบของฉันสำหรับวิธีการตรวจสอบสิ่งต่าง ๆ
Michael

อัฐ การได้รับคำตอบที่ไม่ถูกต้อง - "ทั้งสองคำตอบนั้นไม่ปลอดภัยจริง ๆ "
Peter Mortensen

6

วิธีที่ง่ายที่สุดคือการดึงกุญแจssh-keyscanด้วยตนเองตรวจสอบด้วยตนเอง:

$ ssh-keyscan -t rsa github.com | ssh-keygen -lf -
# github.com:22 SSH-2.0-libssh-0.7.0
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

และเพิ่มไปยังสคริปต์ของคุณซึ่งจะนำรหัสสาธารณะ "สิทธิ์"


ฉันได้รับกุญแจอย่างที่คุณพูดฉันจะ 'เพิ่มลงในสคริปต์ของฉันได้อย่างไร?
เกลนโทมัส

อาจเป็นไฟล์แยกหรือเป็นสตริงในสคริปต์ของคุณ
Jakuje

คำตอบนี้อันตรายเพราะซ่อนอยู่ใน "ตรวจสอบด้วยตนเอง" เป็นกระบวนการที่ยากทั้งหมด ฉันได้เพิ่มคำตอบด้านล่างซึ่งพยายามอธิบายวิธีการใช้และผลลัพธ์อย่างปลอดภัย
Michael

อัฐ การได้รับคำตอบที่ไม่ถูกต้อง - "ทั้งสองคำตอบนั้นไม่ปลอดภัยจริง ๆ "
Peter Mortensen

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