เหตุใดฉันจึงควรใช้การพิสูจน์ตัวตนกุญแจสาธารณะสำหรับ SSH


26

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

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

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

เป็นไปได้ว่าฉันได้รับบริการที่ดีขึ้นด้วยการตรวจสอบสิทธิ์แบบสองปัจจัย

มีข้อโต้แย้งใด ๆ ที่ฉันหายไปหรือไม่? อะไรคือวิธีที่ดีที่สุดสำหรับฉัน


10
เมื่อทำถูกต้องการรับรองความถูกต้องของรหัสสาธารณะเป็นรูปแบบของ 2FA พร้อมสิ่งที่คุณรู้ (วลีรหัสผ่านไปยังรหัสส่วนตัว) และสิ่งที่คุณมี (รหัสส่วนตัว)
สเวน

1
@EEAA ทำไมมันถึงมีความสำคัญตราบใดที่คีย์ส่วนตัวของคุณมีรหัส?
user253751

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

1
หลายองค์กรต้อง (ด้วยเหตุผลใดก็ตาม) ต้องการให้มีการตรวจสอบสิทธิ์แบบสองปัจจัย ไม่สามารถทำได้โดยอาศัยการเข้ารหัสคีย์ส่วนตัว
EEAA

6
สำหรับสิ่งที่มันคุ้มค่าที่ผมไม่เห็นด้วยอย่างสุดซึ้งกับ Sven เกี่ยวกับการจำแนกประเภทของคีย์ส่วนตัวเป็นสิ่งที่คุณมี มันล้มเหลวในการทดสอบพื้นฐานของบางสิ่งบางอย่างที่คุณมีเพราะมันทำซ้ำได้โดยพลการเป็นข้อมูลดิจิตอล การรับรองความถูกต้องของรหัสสาธารณะด้วยตนเองไม่ใช่ 2FA ถ้าคุณบอกตัวเองว่าเป็นคุณกำลังหลอกตัวเองเกี่ยวกับความปลอดภัยของคุณ
MadHatter สนับสนุนโมนิก้า

คำตอบ:


32

หากมีใครบางคนแฮ็คเข้าคอมพิวเตอร์ของฉันเขาไม่ได้แค่เอาคอมพิวเตอร์ของฉันไปเท่านั้น

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

แต่มีข้อดี 3 ประการสำหรับคีย์:

1) การพิสูจน์ตัวตนที่แคชได้ ป้อนข้อความรหัสผ่านของคุณหนึ่งครั้งดำเนินการหลายคำสั่ง ssh สิ่งนี้มีประโยชน์มากหากคุณกำลังใช้บางสิ่งที่ใช้ ssh เป็นการขนส่งเช่น scp, rsync หรือ git

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

2b) มันปรับขนาดด้วยวิธีอื่นถ้าคุณมีผู้ดูแลระบบหลายคนที่ใช้ระบบเดียวกันเพราะคุณสามารถเพิกถอนคีย์จากผู้ใช้ A โดยไม่ต้องบอก B, C, D, E, F ... ว่ารหัสผ่านมีการเปลี่ยนแปลง

(สิ่งนี้สามารถทำได้กับแต่ละบัญชีและ sudo แต่คุณต้องเตรียมบัญชีเหล่านั้นด้วย)

3) ระบบอัตโนมัติและการมอบหมายบางส่วน คุณสามารถตั้งค่า SSH เพื่อเรียกใช้คำสั่งโดยเฉพาะอย่างยิ่งเมื่อมีการเชื่อมต่อที่สำคัญ สิ่งนี้ทำให้กระบวนการอัตโนมัติบนระบบ A ทำอะไรบางอย่างในระบบ B โดยไม่ต้องมีความไว้วางใจแบบไม่มีรหัสผ่านระหว่างทั้งสอง

(มันแทน rlogin / rsh ซึ่งไม่ปลอดภัยอย่างสนุกสนาน)

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


2
2b นั้นสำคัญมาก คีย์ที่ได้รับอนุญาตจะได้รับการจัดการจากส่วนกลางได้อย่างง่ายดายการเปลี่ยนรหัสผ่านและแจกจ่ายให้ผู้ใช้ทุกคนต้องใช้งานมากขึ้น
Jonas Schäfer

มีเทคนิคอะไรบ้างในการจัดการกุญแจที่ได้รับอนุญาตจากส่วนกลาง? (ฉันคุ้นเคยกับการวางไฟล์ authorized_keys บนระบบไฟล์ที่แชร์ แต่ต้องมีอย่างอื่น)
pjc50

1
ณ จุดที่คุณมีเซิร์ฟเวอร์หลายสิบหรือหลายร้อยเซิร์ฟเวอร์คุณอาจใช้ Chef, Ansible, Puppet, Holo หรืออะไรทำนองนั้นที่จัดการเซิร์ฟเวอร์เหล่านั้น หรือคุณมีคีย์ที่ได้รับอนุญาตใน LDAP หรือฐานข้อมูลอื่น
Jonas Schäfer

1
อย่าลืมตัวแทนการส่งต่อ: คุณสามารถเข้าสู่ระบบด้วยssh -Aและจากนั้นเข้าสู่ระบบเครื่องที่อนุญาตให้สาธารณะของคุณที่มาโฮสต์
Halfgaar

@Halfgaar ... โดยไม่ต้องเปลี่ยนอะไรเป็นพิเศษในโฮสต์ที่คุณกำลังเชื่อมต่อ ฉันเพิ่งเรียนรู้คุณลักษณะนั้นและฉันรักมัน!
Canadian Luke ติดตั้ง MONICA ใหม่

12

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

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

มีโพสต์ที่คล้ายกัน:

  1. โพสต์จากServerFault
  2. โพสต์จากstackexchange การรักษาความปลอดภัย
  3. โพสต์จากsuperuser

2
Keyphrase เป็น IMHO ที่ต้องมี เมื่อใช้ ssh-agent ให้ดูที่ตัวเลือก ssh-add's -t เพื่อทำให้ปุ่มยกเลิกการโหลดหลังจากผ่านไประยะเวลาหนึ่ง
fuero

12

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

(เช่นเดียวกับเมื่อผู้โจมตีจัดการเพื่อควบคุมเซิร์ฟเวอร์และมีเซิร์ฟเวอร์อื่น ๆ ที่ข้อมูลประจำตัวเดียวกันทำงาน)

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

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

แน่นอนตามคำตอบอื่น ๆ ที่ได้บอกไปแล้วคุณจำเป็นต้องรักษารหัสส่วนตัวของคุณให้ปลอดภัยเช่นเข้ารหัสด้วยข้อความรหัสผ่านหรือเป็นไปได้ในอุปกรณ์แยกต่างหากซึ่งจะสร้างลายเซ็นต์หลังจากป้อน PIN เท่านั้น


2

OpenSSH สามารถเก็บ CA ของตัวเองเพื่อจัดการโฮสต์ SSH และรหัสลูกค้าและสามารถใช้รายการเพิกถอนได้ สิ่งนี้สามารถเพิ่มความปลอดภัยให้โดยการรับรองความถูกต้องโดยใช้คีย์


2

คุณถูกต้องเกี่ยวกับการอ้างสิทธิ์ "คุณไม่จำเป็นต้องใช้รหัสผ่าน" ที่ไม่ปลอดภัยจริง ๆ บนฝั่งไคลเอ็นต์

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

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


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

0

เป็นไปได้ว่าฉันได้รับบริการที่ดีขึ้นด้วยการตรวจสอบสิทธิ์แบบสองปัจจัย

ความเป็นไปได้ทางหนึ่งสำหรับ 2FA สำหรับ SSH (และสิ่งที่ต้องการการตั้งค่า / ความซับซ้อนค่อนข้างน้อย) คือการใช้รหัสสาธารณะและรหัสผ่าน

ฉันเชื่อว่ามีบางสิ่งที่AuthenticationMethods publickey,keyboard-interactiveเพิ่มเข้ามาเพื่อ/etc/ssh/sshd_configให้สามารถใช้งานได้

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

รหัสผ่านมักน้อยกว่า 2048 บิตและมักไม่ได้มาจากแหล่งที่ปลอดภัยของการเข้ารหัส

นอกจากนี้คุณยังสามารถใช้รหัสผ่านเพื่อรักษาความปลอดภัยของกุญแจเพื่อป้องกันปัญหาที่เกี่ยวข้องกับการสูญเสียรหัสผ่าน (แม้ว่าจะมีใครบางคนสามารถลองและบังคับใช้รหัสผ่านนั้น)

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

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