การพิสูจน์ตัวตนแบบใช้คีย์ SSH: known_hosts เทียบกับ authorized_keys


21

ฉันอ่านเกี่ยวกับการตั้งค่าคีย์ ssh ใน Linux และมีคำถาม ช่วยแก้ให้ด้วยนะถ้าฉันผิด…

สมมติว่าโฮสต์ tr-lgto ต้องการเชื่อมต่อกับโฮสต์ tr-mdm โดยใช้ ssh ถ้าเราต้องการให้แน่ใจว่ามันเป็น tr-mdm จริงเราสร้างคู่ของคีย์บน tr-mdm และเราเพิ่มกุญแจสาธารณะลงknown_hostsใน tr-lgto หาก tr-mdm ต้องการตรวจสอบว่าเป็น tr-lgto จริงดังนั้น tr-lgto ต้องสร้าง keypair และเพิ่มพับลิกคีย์ลงauthorized_keysใน tr-mdm

คำถามที่ 1 : ไม่มีฟิลด์ผู้ใช้ในไฟล์ known_hosts เพียงแค่ที่อยู่ IP และชื่อโฮสต์ tr-mdm อาจมีผู้ใช้จำนวนมากแต่ละคนมี.sshโฟลเดอร์ของตัวเอง เราควรจะเพิ่มกุญแจสาธารณะในแต่ละknown_hostsไฟล์หรือไม่

คำถามที่ 2 : ฉันพบว่าssh-keyscan -t rsa tr-mdmจะส่งคืนกุญแจสาธารณะของ tr-mdm ฉันจะรู้ได้อย่างไรว่ากุญแจนี้เป็นของผู้ใช้? ยิ่งไปกว่านั้นคีย์สาธารณะใน/root/.ssh/นั้นแตกต่างจากคำสั่งที่ส่งคืน สิ่งนี้จะเป็นอย่างไร



ฉันได้เพิ่มบริบทพื้นหลังสำหรับ 'ssh' ในคำตอบ "เกี่ยวกับไฟล์ที่ปลอดภัยที่มีกุญแจสาธารณะ" ที่คำถามที่กล่าวถึงโดย @Gilles: < security.stackexchange.com/questions/20706/ … >
IAM_AL_X

คำตอบ:


33

คุณกำลังผสมการรับรองความถูกต้องของเครื่องเซิร์ฟเวอร์กับเครื่องไคลเอนต์และการรับรองความถูกต้องของผู้ใช้กับเครื่องเซิร์ฟเวอร์

ตรวจสอบเซิร์ฟเวอร์

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

ลูกค้าอาจตรวจสอบว่าเซิร์ฟเวอร์เป็นเซิร์ฟเวอร์ที่รู้จัก แต่ไม่ใช่เซิร์ฟเวอร์โกงบางรายที่พยายามส่งผ่านเป็นเซิร์ฟเวอร์ที่เหมาะสม SSH มีเพียงกลไกอย่างง่ายในการตรวจสอบความถูกต้องของเซิร์ฟเวอร์: มันจดจำเซิร์ฟเวอร์ที่คุณเชื่อมต่ออยู่แล้วใน~/.ssh/known_hostsไฟล์บนเครื่องไคลเอนต์ (มีไฟล์ทั้งระบบด้วย/etc/ssh/known_hosts) ในครั้งแรกที่คุณเชื่อมต่อกับเซิร์ฟเวอร์คุณต้องตรวจสอบด้วยวิธีอื่นว่ารหัสสาธารณะที่แสดงโดยเซิร์ฟเวอร์นั้นเป็นรหัสสาธารณะของเซิร์ฟเวอร์ที่คุณต้องการเชื่อมต่อ หากคุณมีพับลิกคีย์ของเซิร์ฟเวอร์ที่คุณกำลังจะเชื่อมต่อคุณสามารถเพิ่มลง~/.ssh/known_hostsในไคลเอ็นต์ด้วยตนเอง

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

การตรวจสอบผู้ใช้

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

  • ผู้ใช้อาจแสดงรหัสผ่านสำหรับบัญชีที่เขาพยายามเข้าสู่ระบบ; เซิร์ฟเวอร์จะตรวจสอบว่ารหัสผ่านถูกต้อง
  • ผู้ใช้อาจนำเสนอกุญแจสาธารณะและพิสูจน์ว่าเขามีกุญแจส่วนตัวที่เกี่ยวข้องกับกุญแจสาธารณะนั้น นี่เป็นวิธีการเดียวกับที่ใช้ในการรับรองความถูกต้องของเซิร์ฟเวอร์ แต่ตอนนี้ผู้ใช้กำลังพยายามพิสูจน์ตัวตนของพวกเขาและเซิร์ฟเวอร์กำลังตรวจสอบพวกเขา ความพยายามในการเข้าสู่ระบบได้รับการยอมรับหากผู้ใช้พิสูจน์ให้เห็นว่าเขารู้รหัสส่วนตัวและกุญแจสาธารณะอยู่ในรายการการอนุญาตของบัญชี ( ~/.ssh/authorized_keysบนเซิร์ฟเวอร์)
  • วิธีการอีกประเภทหนึ่งเกี่ยวข้องกับการมอบหมายงานส่วนหนึ่งของการพิสูจน์ตัวตนผู้ใช้กับเครื่องไคลเอนต์ สิ่งนี้เกิดขึ้นในสภาพแวดล้อมที่มีการควบคุมเช่นรัฐวิสาหกิจเมื่อเครื่องหลายเครื่องใช้บัญชีเดียวกัน เซิร์ฟเวอร์รับรองความถูกต้องของเครื่องลูกข่ายโดยกลไกเดียวกับที่ใช้ในทางกลับกันจากนั้นอาศัยไคลเอนต์เพื่อตรวจสอบผู้ใช้

1
คำตอบที่ดี Gilles แต่คำถามของฉันคือเซิร์ฟเวอร์ใด ๆ สามารถส่งรหัสสาธารณะแบบสุ่มและพิสูจน์ว่ามีรหัสสาธารณะที่เกี่ยวข้อง สิ่งนั้นพิสูจน์ได้อย่างไรว่าเซิร์ฟเวอร์นั้นเป็นของแท้
Alex

@spartacus ฉันคิดว่าคุณหมายถึง“ และพิสูจน์ว่ามันมีรหัสส่วนตัวที่เกี่ยวข้อง” ใช่ไหม? แนวคิดคือไคลเอ็นต์ส่งค่าที่สร้างขึ้นแบบสุ่ม (ความท้าทาย ) ไปยังเซิร์ฟเวอร์และเซิร์ฟเวอร์ทำการคำนวณบางอย่างตามคีย์ส่วนตัวที่ขึ้นอยู่กับความท้าทาย (เพื่อให้เซิร์ฟเวอร์ไม่สามารถทำการคำนวณได้จนกว่าจะได้รับสิ่งนี้ ความท้าทาย) และสามารถทำได้ด้วยความรู้ของรหัสส่วนตัวเท่านั้น
Gilles 'ดังนั้นหยุดความชั่วร้าย'

ฉันคิดว่า Alex หมายถึงครั้งแรกที่ไคลเอ็นต์เชื่อมต่อกับเซิร์ฟเวอร์ ฉันคิดว่าลูกค้าจะเชื่อถือเซิร์ฟเวอร์ในครั้งแรก จากนั้นเซิร์ฟเวอร์จะส่งพับลิกคีย์และไคลเอ็นต์จะสามารถพิสูจน์ตัวตนเซิร์ฟเวอร์สำหรับการเชื่อมต่อต่อไปนี้
synack

@synack อาครั้งแรกเหรอ? ค่อนข้างลูกค้าและผู้ใช้ตัดสินใจ (“ คุณแน่ใจหรือไม่ว่าคุณต้องการเชื่อมต่อ (ใช่ / ไม่ใช่)”) เซิร์ฟเวอร์ไม่ได้พิสูจน์อะไรเลยในตอนนั้น
Gilles 'หยุดความชั่วร้าย'

คุณพูดถูกผู้ใช้เป็นผู้ตัดสินใจ
synack

2

เพื่อนของฉันให้คำตอบ โดยค่าเริ่มต้นคีย์ระบุเครื่องและไม่ใช่ผู้ใช้ ดังนั้นคีย์จะถูกเก็บไว้ใน / etc / ssh / นั่นเป็นเหตุผลที่ฉันได้รับคีย์ที่แตกต่างจากที่เก็บไว้ใน /root/.ssh

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