ปัญหาความปลอดภัยที่อาจเกิดขึ้นกับ SSH daemon คืออะไร


14

ฉันต้องการ SSH ไปยังเครื่องคอมพิวเตอร์ office 10.04 ของ Ubuntu จากภายนอก ฉันคิดจะเริ่มภูต SSH บนพีซี ปัญหาด้านความปลอดภัยข้อบกพร่องที่เป็นไปได้การตั้งค่าเฉพาะ ฯลฯ ฉันควรระวังคืออะไร

ในกรณีที่มีความสำคัญ: สิ่งนี้มีไว้สำหรับการใช้งานของตัวเองเท่านั้นฉันไม่คิดว่าจะมีคนอื่นใช้มัน มันเป็น Ubuntu 10.04 PC ในระบบปฏิบัติการ Windows 7 / Vista / XP ส่วนใหญ่


1
คุณอาจต้องการพิจารณาติดตั้ง OpenVPN ด้วยและสร้างอุโมงค์ VPN ในพีซีของคุณสำหรับการเชื่อมต่อ ssh ของคุณ วิธีนี้คุณไม่จำเป็นต้องเปิดพอร์ต ssh ของคุณไปทั่วโลก
Linker3000

@ Linker3000 ขอบคุณ! ฉันจะให้ความคิด --- แม้ว่าฉันจะเคยมีประสบการณ์ที่ไม่พึงประสงค์กับ VPN มาก่อน
ev-br

@Zhenya หากคุณไม่เว้นวรรค "@" และชื่อผู้ใช้พวกเขาจะได้รับการแจ้งเตือนเมื่อคุณตอบกลับ ;) คุณจะได้รับความคิดเห็นเมื่อฉันใช้ @Zhenya แต่ไม่ใช่เมื่อฉันใช้ @ Zhenya
BloodPhilia

@Zhenya และตอนนี้คุณกำลังทำมันอีกครั้ง XD
BloodPhilia

@Linker คุณช่วยอธิบายเพิ่มเติมหน่อยได้ไหมว่าทำไม OpenVPN จึงปลอดภัยกว่า SSH
Arjan

คำตอบ:


20

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

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

  1. ใช้รหัสผ่านที่คาดเดายากซึ่งประกอบด้วยตัวอักษรตัวเล็กและตัวใหญ่ตัวเลขและตัวอักษรอื่น ๆ อย่างน้อย 10 ตัว

  2. ผู้ใช้คุกไปยังไดเรกทอรีบ้านของพวกเขา ผู้ใช้ที่ถูกคุมขังจะไม่สามารถเข้าถึง / แก้ไขไฟล์ที่อยู่นอกโฮมไดเร็กตอรี่ของพวกเขาได้ ดังนั้นผู้ใช้ของคุณจะไม่สามารถเข้าถึง / แก้ไขไฟล์ระบบกุญแจ บทเรียนจำนวนมากสามารถพบได้ทั่วไปในการจำคุกผู้ใช้ ส่วนใหญ่ของพวกเขาใช้JailKit ตัวอย่างของการกวดวิชาดังกล่าวสามารถพบได้ที่นี่ หรือคุณสามารถใช้ChrootDirectoryคำสั่งพื้นฐานของ OpenSSH- เซิร์ฟเวอร์ ตัวอย่างของการกวดวิชาเกี่ยวกับเรื่องนี้สามารถพบได้ที่นี่

  3. ติดตั้งfail2ban Fail2Ban เป็นโปรแกรมที่ตรวจสอบบันทึกการรับรองความถูกต้องสำหรับรายการที่ไม่ถูกต้อง เมื่อถึงขีด จำกัด ที่กำหนดไว้แล้วมันจะเพิ่มบล็อกไฟร์วอลล์สำหรับ IP นั้น ๆ ตามระยะเวลาที่กำหนดไว้ มีพบได้ทั่วไปนอกจากนี้ยังมีบทเรียนออนไลน์หลายประการเกี่ยวกับวิธีการตั้งค่า fail2ban กับ SSH ตัวอย่างจะเป็นคนนี้ โฮมเพจ Fail2Ban มี HOWTO ที่สมบูรณ์และสวยงามเช่นกัน

  4. ปิดใช้งานการล็อกอินรูทผ่าน SSH นี่คือผู้ใช้ที่มีการเข้าถึงไฟล์ในระบบของคุณได้ค่อนข้างดีดังนั้นจึงขอแนะนำให้ปิดการใช้งานเชลล์ล็อกอิน ใน Ubuntu รุ่นล่าสุดผู้ใช้รูทจะถูกปิดการใช้งานโดยอัตโนมัติ แต่ก็ไม่เจ็บที่จะปิดการใช้งานการเข้าถึง SSH /etc/ssh/sshd_configนี้จะกระทำโดยการแก้ไขไฟล์ ค้นหาบรรทัดต่อไปนี้และตรวจสอบให้แน่ใจว่าไม่มี # อยู่ด้านหน้า

    #PermitRootLogin no
    
  5. ใช้พอร์ตที่ไม่ได้มาตรฐาน (เช่นไม่ใช่ 22) สิ่งนี้ทำได้ผ่านการส่งต่อพอร์ตในเราเตอร์ของคุณ (เช่น 16121 -> 22 แทนที่จะเป็น 22 -> 22) หรือโดยทำให้ SSH daemon ฟังพอร์ตอื่น สิ่งนี้จะทำให้บริการ SSH ของคุณตรวจจับผู้ใช้ที่เป็นอันตรายได้ง่ายขึ้น /etc/ssh/sshd_configนี้จะกระทำโดยการแก้ไขไฟล์ ค้นหาบรรทัดต่อไปนี้และเปลี่ยน 22 เป็นพอร์ตใดก็ได้ที่คุณต้องการ อย่าลืมส่งต่อพอร์ตที่ถูกต้องในเราเตอร์ของคุณในภายหลัง

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

    #PasswordAuthentication no
    
  7. เป็นทางเลือกตามที่ @ Linker3000 พูดถึงในความคิดเห็นของเขาคุณสามารถตั้งค่าอุโมงค์ VPNไปยังพีซีที่คุณต้องการเข้าถึงผ่าน SSH จากนั้นไม่อนุญาตการเข้าถึงเครือข่ายที่ไม่ใช่แบบโลคัลบนเซิร์ฟเวอร์ SSH ด้วยวิธีนี้ไม่มีอุปกรณ์ภายนอกที่ไม่มีการเชื่อมต่อ VPN จะสามารถเข้าถึงเซิร์ฟเวอร์ SSH ของคุณ สิ่งนี้สามารถทำได้โดยการปฏิเสธโฮสต์ทั้งหมดจากนั้นอนุญาตเฉพาะ IP เครือข่ายท้องถิ่นเพื่อเข้าสู่ระบบ สิ่งนี้ทำได้โดยการแก้ไข/etc/hosts.denyและเพิ่มสิ่งต่อไปนี้:

    sshd: ALL
    

    และเพื่อ/etc/hosts.allowเพิ่มสิ่งต่อไปนี้:

    sshd: 192.168.1.*
    

    ที่ IP ตรงกับเครือข่ายท้องถิ่นของคุณ *เป็นสัญลักษณ์แทนดังนั้นที่อยู่ IP ทั้งหมดที่เริ่มต้นด้วย192.168.1.จะได้รับการยอมรับ หากยังไม่สามารถทำงานการกระจายของคุณอาจใช้แทนssh sshdในกรณีที่คุณควรลองssh: 192.168.1.*และssh: ALLแทน

  8. คุณสามารถอนุญาตโฮสต์ที่เจาะจงเท่านั้นให้ทำเช่นเดียวกันกับ/etc/hosts.allowและ/etc/hosts.denyตามที่อธิบายไว้ใน 6 แต่ในการ/etc/hosts.allowเพิ่มบรรทัดต่อไปนี้และทุกโฮสต์จะอนุญาตให้แยกด้วยช่องว่าง:

    sshd: {IP OF HOST TO ALLOW 1} {IP OF HOST TO ALLOW 2} {IP OF HOST TO ALLOW 3} {ETC.}
    
  9. อนุญาตให้เฉพาะผู้ใช้เฉพาะในการเข้าถึงเซิร์ฟเวอร์ SSH ของคุณ /etc/ssh/sshd_configนี้จะกระทำโดยการแก้ไขไฟล์ ค้นหาบรรทัดต่อไปนี้และตรวจสอบให้แน่ใจว่าไม่มี # อยู่ด้านหน้า หากไม่มีอยู่ให้สร้างขึ้น ตัวอย่างเช่นหากคุณต้องการอนุญาตให้ john, tom and mary เท่านั้นเพิ่ม / แก้ไขบรรทัดนี้:

    AllowUsers john tom mary
    

    คุณสามารถปฏิเสธผู้ใช้ที่เฉพาะเจาะจงได้เช่นหากคุณต้องการปฏิเสธการเข้าถึง john, tom and mary ให้เพิ่ม / แก้ไขบรรทัดนี้:

    DenyUsers john tom mary
    
  10. อนุญาตโปรโตคอล SSH2 สำหรับการเชื่อมต่อขาเข้าเท่านั้น โปรโตคอล SSH มีสองรุ่น SSH1 ขึ้นอยู่กับปัญหาด้านความปลอดภัยดังนั้นแนะนำให้ใช้ SSH 2 /etc/ssh/sshd_configนี้สามารถบังคับโดยการแก้ไขไฟล์ ค้นหาบรรทัดต่อไปนี้และตรวจสอบให้แน่ใจว่าไม่มี # อยู่ด้านหน้า หากไม่มีอยู่ให้สร้างขึ้น

    Protocol 2,1
    

    ลบ 1 ดังนั้นบรรทัดจะเป็น

    Protocol 2
    
  11. ไม่อนุญาตให้ผู้ใช้ลงชื่อเข้าใช้ที่ไม่มีการตั้งรหัสผ่าน /etc/ssh/sshd_configนี้สามารถบังคับโดยการแก้ไขไฟล์ ค้นหาบรรทัดต่อไปนี้และตรวจสอบให้แน่ใจว่าไม่มี # อยู่ด้านหน้า หากไม่มีอยู่ให้สร้างขึ้น

    PermitEmptyPasswords no
    
  12. และถึงแม้ว่าจะง่ายและไม่จำเป็นต้องพูด แต่ได้พิสูจน์แล้วว่ามีความสำคัญในหลาย ๆ กรณีให้ปรับปรุงซอฟต์แวร์ของคุณให้ทันสมัยอยู่เสมอ อัปเดตแพคเกจ / ซอฟต์แวร์ที่ติดตั้งเป็นประจำ


= หลังจากแก้ไขไฟล์ปรับแต่ง SSH แล้วอย่าลืมรีสตาร์ท daemon เพื่อใช้การเปลี่ยนแปลง รีสตาร์ท daemon โดยดำเนินการ:

sudo /etc/init.d/ssh restart

หรือ

sudo /etc/init.d/sshd restart

ขึ้นอยู่กับการกระจายของ Linux ที่คุณใช้


2
sudo service ssh restartบน Ubuntu
ulidtko

@ulidtko คำถามนี้ถูกรวมเข้ากับคำถามทั่วไปดังนั้นฉันจึงทำให้คำตอบของฉันกว้างขึ้นและเหมาะสมกับการแจกแจงที่แตกต่างกัน วิธีนี้ใช้ได้ผลเกือบทุกรูปแบบ แต่คุณพูดถูก
BloodPhilia

@BloodPhilia ขอบคุณมากสำหรับคำตอบที่ละเอียดและเข้าถึงได้! คำถามเพิ่มเติมเกี่ยวกับประเด็นของคุณสองสามข้อ: 1. อะไรคือข้อดีของการจำคุกผู้ใช้เพื่อ จำกัด สิทธิ์ พูดว่าการเข้าสู่ระบบในฐานะ 'ผู้ใช้' ฉันมีสิทธิ์อ่านเพื่อเข้าถึงสิ่งต่าง ๆ นอกบ้านของฉันเท่านั้น แต่ไม่มีการเขียนหรือดำเนินการเข้าถึง [ตามค่าเริ่มต้นของ Ubuntu ฉันคิดว่า] มันจะดีกว่าหรือแย่กว่าการจำคุก? 2. บันทึกการรับรองความถูกต้องอยู่ที่ไหนปกติ? ฉันต้องการตรวจสอบพวกเขาด้วยตนเอง / ผ่าน grep นาน ๆ
ev-br

@BloodPhilia 4. ถ้าฉันให้ sshd ฟังพอร์ตที่ไม่ได้มาตรฐานบนเซิร์ฟเวอร์เช่น 1234 แล้ววิธีการเชื่อมต่อกับเซิร์ฟเวอร์นี้จากบรรทัดคำสั่ง linux บนไคลเอนต์คืออะไร? ฉันหมายถึงคำสั่ง ssh มาตรฐานต้องการสวิตช์บางประเภทหรือไม่?
ev-br

1
@ulidtko: ด้วยการพุ่งพรวด, sudo restart ssh.
Hello71

7

เคล็ดลับ:

  1. ใช้การรับรองความถูกต้องตามคีย์ซึ่งเป็นวิธีที่ปลอดภัยกว่ารหัสผ่าน
  2. SSH 2 เท่านั้น
  3. ปิดใช้งานการเข้าสู่ระบบรูท
  4. สำหรับ paranoid ให้เปลี่ยนพอร์ตจากพอร์ตมาตรฐาน 22
  5. เพื่อความสะดวกใช้เครื่องมือในการจับคู่ IP ของคุณกับชื่อ DNS เช่น Dyndns หรือ ilk คุณสามารถใช้เวลานานกับ IP เดียวกัน แต่ครั้งเดียวที่คุณเดินทางและต้องการคุณจะพบว่าคุณได้รับใบแจ้งหนี้ใหม่
  6. แน่นอนอนุญาตเฉพาะพอร์ตที่จำเป็นสำหรับ SSH (พอร์ต 22 หรือไม่เป็นมาตรฐานหากคุณเลือก) ผ่านไฟร์วอลล์ของคุณ

1
Re 5: หากคุณมีบัญชีอีเมลบนเครื่องนอกบ้านคุณสามารถตั้งค่างาน cron เพื่อส่งข้อความจากเครื่องที่บ้านของคุณไปยังที่อยู่นั้นเป็นระยะ IP ที่บ้านของคุณจะอยู่ในส่วนหัว ไม่สะดวกเท่ากับ DNS แต่ใช้งานได้
garyjohn

คุณสามารถติดต่อ ISP ของคุณและขอราคาสำหรับที่อยู่ IP แบบคงที่ได้ นี่คือทางออกที่ง่ายที่สุดของทั้งหมด แต่มักจะมีราคาแพงกว่า DNS แบบไดนามิก
Steen Schütt

2

ความเสี่ยงหลักคือการลืมว่าคุณใช้เซิร์ฟเวอร์ ssh และใส่รหัสผ่านที่อ่อนแอในบัญชี มีผู้โจมตีที่ลองชื่อบัญชีทั่วไป (เช่นwebmasterและbob) และรหัสผ่านที่อ่อนแอ คุณสามารถขจัดความเสี่ยงนี้โดยการห้ามการเข้าสู่ระบบรหัสผ่าน (ใส่PasswordAuthentication noในsshd_configและทั้งยังใส่UsePAM Noหรือตรวจสอบรหัสผ่านปิดการใช้งานในการตั้งค่า PAM สำหรับ SSH) มาตรการกลางคือการ จำกัด การเข้าสู่ระบบ SSH รายการที่อนุญาตของผู้ใช้ที่มีAllowUsersหรือในAllowGroupssshd_config

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

ความต้องการขั้นต่ำในการใช้ไคลเอ็นต์ ssh บนเครื่องคือคุณเชื่อมั่นว่าจะไม่มีการหักหลังของการสื่อสาร ssh (การโจมตีแบบ man-in-the-middle เป็นไปได้ถ้ามันทำงานบนเครื่องไคลเอนต์ - คุณคิดว่า คุณกำลังพิมพ์คำสั่งลงในไคลเอนต์ ssh ที่เก่าแก่ แต่ไคลเอนต์กำลังส่งข้อมูลการรับรองความถูกต้องของคุณอย่างซื่อสัตย์ แต่ยังใส่ม้าโทรจันเข้าสู่การสื่อสารในภายหลัง นี่เป็นข้อกำหนดที่อ่อนแอกว่าเชื่อใจว่าจะไม่มี snooper รหัสผ่าน (มักดำเนินการผ่าน keylogger แต่มีวิธีการแบบอัตโนมัติน้อยกว่าเช่นการท่องไหล่) หากคุณมีความไว้วางใจขั้นต่ำ แต่ยังคงกลัวผู้สอดแนมคุณสามารถใช้รหัสผ่านครั้งเดียว (OpenSSH สนับสนุนพวกเขาผ่านการสนับสนุน PAM)

แน่นอนว่าเป็นโปรแกรมอื่น ๆ ที่โต้ตอบกับเครื่องจักรนอกการควบคุมของคุณ (ไม่ใช่แค่เซิร์ฟเวอร์เครือข่าย แต่รวมถึงไคลเอนต์) คุณต้องติดตามการปรับปรุงความปลอดภัย


2

มีสามสิ่งที่เข้ามาในใจของฉัน:

  1. หากคุณเปิดพอร์ตเริ่มต้นที่ 22 แล้วในไม่ช้ามันก็จะถูกตรวจพบและพีซีของคุณจะถูกโจมตีด้วยการโจมตีอย่างดุเดือด ฉันขอแนะนำให้คุณกำหนดค่า sshd เพื่อฟังพอร์ตอื่นหรือทำการจับคู่พอร์ตในไฟร์วอลล์ของคุณ แม้ว่านี่จะไม่ใช่ bullet Magic แต่ก็จะช่วยให้คุณประหยัดรอบ CPU เดียวกันได้อย่างน้อย

    พอร์ต 12345

  2. ปิดใช้งานการพิสูจน์ตัวตนด้วยรหัสผ่านอย่างชัดเจนและใช้คีย์เท่านั้น รหัสใด ๆ จะดีกว่ารหัสผ่านที่ซับซ้อนที่สุดที่คุณจำได้

    รหัสผ่านการตรวจสอบหมายเลข

  3. แม้ว่า Ubuntu จะปิดใช้งานผู้ใช้รูทตามค่าเริ่มต้นแล้ว แต่ปิดใช้งานการลงชื่อเข้าใช้รูทอย่างชัดเจน

    PermitRootLogin ไม่

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