การรักษาความปลอดภัยเซิร์ฟเวอร์ SSH กับการทำลายสัตว์


14

ฉันมีเซิร์ฟเวอร์ SVN เล็ก ๆ น้อย ๆ เดลแล็ป optoplex เก่าที่ใช้เดเบียน ฉันไม่มีความต้องการสูงในเซิร์ฟเวอร์ของฉันเพราะมันเป็นเซิร์ฟเวอร์ SVN เพียงเล็กน้อย ... แต่ต้องการให้ปลอดภัย

ฉันเพิ่งต่ออายุเซิร์ฟเวอร์ของฉันให้เป็น optiplex ที่ใหม่กว่าและดีกว่าและเริ่มมองหาเซิร์ฟเวอร์เก่าสักหน่อย ฉันเอามันลงหลังจากประสบปัญหา เมื่อฉันตรวจสอบบันทึกมันเต็มไปด้วยความพยายามที่ดุร้ายและบางคนประสบความสำเร็จในการเข้าสู่เครื่องของฉัน บุคคลนี้สร้างไดรฟ์ข้อมูลพิเศษบางตัวที่เรียกว่า "knarkgosse" ที่มี "รูต" และ "swap1" สอง dirs ไม่รู้จริง ๆ ว่าเพราะอะไรและทำอะไร แต่แน่ใจว่าต้องการป้องกันไม่ให้เกิดขึ้นอีกครั้ง ฉันคิดว่ามันแปลกไปหน่อยเพราะฉันเปลี่ยนรหัสผ่านไม่กี่เดือนและรหัสผ่านนั้นจะเป็นตัวอักษรและตัวเลขสุ่มเสมอกัน ... ไม่ใช่เรื่องง่ายที่จะดุร้าย

ฉันรู้ว่าฉันสามารถป้องกันไม่ให้รูทเข้าสู่ระบบและใช้ sudoers ... และเปลี่ยนพอร์ต SSH แต่ฉันจะทำอะไรได้อีกบ้าง

ดังนั้นฉันมีคำถามสองสามข้อ:

  1. ฉันจะป้องกันไม่ให้เข้าสู่ระบบเป็นเวลา 5 นาทีหลังจากลองจำนวน X ไม่ถูกต้อง หรือพยายามช้าลงหลังจากลองผิดแต่ละครั้ง

  2. มีบัญชีดำส่วนกลางบางชนิดที่เซิร์ฟเวอร์สามารถเชื่อมต่อได้หรือไม่ บัญชีดำที่ติดตามที่อยู่ IP ที่ "ไม่ปลอดภัย" และไม่ควรได้รับอนุญาตให้เข้าถึงหรือไม่

  3. ฉันต้องทำอะไรอีกเพื่อนำความปลอดภัยไปใช้กับเซิร์ฟเวอร์ของฉัน

อย่างที่ฉันบอกไปก่อนหน้านี้ฉันใช้ Debian 5 พร้อม Apache (ปัญหาผู้ใช้ข้อมูล www-data?), svn, mysql, php, phpmyadmin, hudson เป็นเครือข่ายในบ้านที่มีการส่งต่อพอร์ตบน 80, 443, 8080, 8180, 23 และ 22


คำตอบ:


17

Fail2banและPort Knockingควรตอบสนองความต้องการส่วนใหญ่ของคุณ

การเปลี่ยนพอร์ต SSH ของคุณและอนุญาตให้ใช้การตรวจสอบความถูกต้องด้วยคีย์เท่านั้น

อาจเป็นที่ถกเถียงกันอยู่ว่าคุณอาจไปถึงจุดที่ผลตอบแทนลดลงในการเพิ่มมาตรการความปลอดภัยเพิ่มเติม แต่จากนั้นอีกครั้งคุณต้องตัดสินใจเมื่อคุณ "ปลอดภัยพอ"

เป็นความคิดที่ดีที่จะไม่อนุญาตการเข้าสู่ระบบรูท


2
ฉันใช้ denyhosts แต่มันค่อนข้างเหมือนกับ fail2ban afaik
pfyon

Fail2Ban เสียงที่คุ้นเคย ... ฉันจะดูด้วยว่า
Paul Peelen

1
+1 Fail2Ban, ความพยายามล้มเหลว 5 ครั้ง = บล็อก IP 5 นาที หากคุณไม่มีรหัสผ่านที่ใช้งานง่ายอย่างน่าขันมันจะไม่ถูกหักล้างด้วยรหัสผ่านที่ 1 ต่อนาที
Chris S

@Chris S ใช่นั่นเป็นหนึ่งในรายการโปรดของฉัน สคริปต์ Kiddies มักจะไม่ทราบวิธีจัดการกับการหมดเวลา ...
gWaldo

1
@ gWaldo อคติยืนยันไปอีกนานในการเขียนสิ่งที่คุณอ่านเพื่อพูดในสิ่งที่คุณคิดว่าเป็นจริงแล้ว
Chris S

7

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

Fail2Ban มีตัวอย่างที่ดีหลายอย่างเกี่ยวกับวิธีกำหนดค่าทุกสิ่งที่คุณถาม ... แต่มันไม่มีที่เก็บที่อยู่สากลที่ไม่ดี ฉันไม่คิดว่าจะมีพื้นที่เก็บข้อมูลใด ๆ เนื่องจากความสะดวกในการรับ IP อื่น (การต่ออายุ DHCP / bot-net โจมตี / etc ... ) ฉันจะปิดการใช้งานการเข้าสู่ระบบผ่าน ssh โดยใช้ชื่อผู้ใช้ประเภท 'ผู้ดูแลระบบ' ทั่วไป (root / admin / administrator / sysop / etc .. ) เนื่องจากสิ่งเหล่านี้เป็นสิ่งที่ถูกกระแทกบ่อยที่สุด


คำตอบที่ดี ฉันเห็นด้วยอย่างยิ่งกับข้อความที่เป็นตัวหนาของคุณ ... จดหมายจึงรวมกับรหัสผ่านตัวเลข การพิสูจน์ตัวตนคีย์เป็นบิตมากเกินไปสำหรับเซิร์ฟเวอร์นี้ ... แต่เป็นความคิดที่ดี ตอนนี้ฉันติดตั้ง Fail2ban แล้วดูเหมือนว่าฉันไม่จำเป็นต้องกำหนดค่าใหม่และเนื่องจากเซิร์ฟเวอร์ svn ตัวเล็กนี้อยู่ที่บ้านฉันเข้าถึงได้ง่าย (พิจารณาว่าอยู่หลังตู้ Walk-in ของฉัน = S) ขอบคุณ สำหรับคำแนะนำของคุณ!
Paul Peelen

1
Spamhaus เผยแพร่รายชื่อเครือข่ายผู้ส่งสแปมที่รู้จัก มันไม่ครอบคลุมบอตเน็ตมันเป็นที่รู้จักกันดีว่าเป็นสแปมเมอร์ "มืออาชีพ": spamhaus.org/drop
Chris S


4

มีคำแนะนำที่ดีจำนวนมากที่นี่ ฉันขอแสดงความนับถือด้วยความเคารพว่าสามสิ่งที่ควรทำให้สิ่งนี้ค่อนข้างปลอดภัย:

  1. รัน sshd บนพอร์ตสูงแบบสุ่ม โดยทั่วไปแล้วบ็อตจะไปตามพอร์ต 22 และรูปแบบที่พอร์ต 22 เช่น 2222 เท่านั้น
  2. ปิดใช้งานการพิสูจน์ตัวตนด้วยรหัสผ่านในการกำหนดค่า sshd:

ใช้หมายเลข PAM

  1. รับรองความถูกต้องกับเว็บไซต์นี้ผ่านคู่คีย์ SSH ที่แบ่งปันล่วงหน้า ผู้ชายใน ssh-keygen เพื่อเริ่มต้นกับการตรวจสอบตาม PKI

หวังว่านี่จะช่วยได้


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

1

ฉันเป็นแฟนตัวยงของCSF / LFD เสมอซึ่งสามารถบล็อกที่อยู่ IP ของผู้คนที่พยายาม bruteforce, portscan และตัวเลือกอื่น ๆ โดยทั่วไปแล้วมันเป็น perl-wrapper ขนาดใหญ่สำหรับตาราง IP แต่ไฟล์การกำหนดค่าไม่ยากที่จะอ่านและเอกสารก็ไม่ได้เลวร้าย


คุณรู้หรือไม่ว่ามีวิธีใดบ้างที่สามารถรับการแจ้งเตือน (เช่นทางอีเมล) เมื่อใดก็ตามที่การสแกนพอร์ตถูก preformed บนเซิร์ฟเวอร์
Paul Peelen

1

คุณยังสามารถดูเป็น sshguard ฉันไม่ได้ใช้มัน แต่ฉันได้ยินสิ่งที่ดี

แหล่งที่มา:
http://isc.sans.edu/diary.html?storyid=9370

http://www.sshguard.net/

http://www.sshguard.net/docs/faqs/

"Sshguard ตรวจสอบเซิร์ฟเวอร์จากกิจกรรมการบันทึกเมื่อมีการบันทึกว่ามีคนกำลังทำสิ่งที่ไม่ดี sshguard จะตอบสนองโดยการบล็อกเขา / เธอ / เธอสักหน่อย Sshguard มีบุคลิกที่งี่เง่า: เมื่อ Tyke ซนยืนยันรบกวนโฮสต์ของคุณ กระชับขึ้นและกระชับขึ้น "


ฟังดูเรียบร้อยดี ... ฉันจะดูมัน ขอบคุณ
Paul Peelen

1

ฉันมีเซิร์ฟเวอร์ SSH เชื่อมต่อกับอินเทอร์เน็ตบนพอร์ตเริ่มต้นและไม่เคยมีปัญหา ..

  • tcp_wrappers (เช่น hosts.allow hosts.deny) สำหรับ SSH .. ฉันไม่คิดว่าจะมี SSH ออกมาที่ไม่มีการสนับสนุนที่รวบรวมไว้
  • iptables นี้ใช้ร่วมกับ tcp_wrappers กำจัดประมาณ 99% ของพอร์ตสุ่มของฉันสแกน / พยายาม bruteforce .. ปัญหาเดียวคือคุณต้องรู้ว่าคุณจะเชื่อมต่อจากที่ใดเพื่อให้ช่วง IP / IP เหล่านั้น ... ฉันก็ทำได้ การค้นหาผู้ให้บริการที่ได้รับความนิยมในพื้นที่ของฉันเพื่อดูช่วง IP ของพวกเขาและอนุญาตให้ผู้ .. สแกนส่วนใหญ่ดูเหมือนจะมาจากดินแดนที่ห่างไกล :)
  • PermitRootLogin โดยไม่ต้องใช้รหัสผ่าน (เช่นเฉพาะคู่คีย์ RSA / DSA ที่เข้ารหัสด้วยวลีรหัสผ่าน) ทำงานได้อย่างมหัศจรรย์สำหรับงานอัตโนมัติ .. เมื่อฉันเข้าสู่ระบบเพื่อโต้ตอบฉันเห็นได้ชัดว่าใช้บัญชีของฉัน (ปกติ) ซึ่งกำหนดค่าด้วยการเข้าถึง sudo
  • sudoers
  • อัปเดตอย่างต่อเนื่อง .. ฉันอัปเดตช่องนี้บ่อยครั้งด้วยการอัปเดตความปลอดภัย / ที่สำคัญทั้งหมด
  • การเปลี่ยนแปลงรหัสผ่าน / วลีรหัสผ่าน
  • เรียกใช้ chkrootkit ทุก ๆ คราวเพื่อดูว่าฉันมีปัญหาหรือไม่ .. (มีหลายอย่างที่ทำหน้าที่นี้)

หวังว่ามันจะช่วย!


1

มีวิธีที่ดีกว่าในการทำเช่นนี้การใช้ fail2ban หมายความว่าคุณต้องเพิ่มแอปพลิเคชันและทำงานที่ชั้นแอปพลิเคชัน

หากคุณใช้ iptables จะมีประสิทธิภาพมากขึ้นเนื่องจากทำงานที่เลเยอร์เครือข่ายและคุณไม่จำเป็นต้องติดตั้งแอปพลิเคชันเพิ่มเติม

ใช้โมดูลล่าสุดของ iptables http://www.snowman.net/projects/ipt_recent/

iptables -N SSHSCAN
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j SSHSCAN
iptables -A SSHSCAN -m recent --set --name SSH
iptables -A SSHSCAN -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-level info --log-prefix "SSH SCAN blocked: "
iptables -A SSHSCAN -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
iptables -A SSHSCAN -j ACCEPT

0

ตัวเลือก (ที่จะใช้นอกเหนือจากมาตรการรักษาความปลอดภัยอื่น ๆ ) คือให้ฟัง sshd บนพอร์ตอื่นที่ไม่ใช่ 22 ฉันไม่ได้ลองด้วยตัวเอง แต่เคยได้ยินว่ามันลดจำนวนการโจมตีเดรัจฉานพลังบริสุทธิ์โดยบอท

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


ฉันก็ทำเช่นนั้น swiched ไปที่พอร์ต 23 ส่วนใหญ่เป็นเพราะฉันมีเซิร์ฟเวอร์อื่นที่พอร์ต 22 (ซึ่งตอนนี้ฉันลง)
Paul Peelen

2
23 เป็นพอร์ตที่สงวนไว้สำหรับtelnetแม้ว่า บ่อยครั้งที่ควรใช้พอร์ตที่ไม่ได้จองไว้เช่น> 60k iana.org/assignments/port-numbersจะแสดงรายการหมายเลขพอร์ตที่สงวนไว้ให้คุณ
inkaphink

ขอบคุณสำหรับทิป. ฉันไม่ได้ใช้ทฤษฎีบนเครื่องนี้ (แต่) แต่จะเปลี่ยนพอร์ต ฉันมีช่วงพอร์ตระหว่าง 52,000 - 59,000 ฉันใช้กับเซิร์ฟเวอร์มืออาชีพของฉันโดยใช้เหมือนกันสำหรับเซิร์ฟเวอร์นี้
Paul Peelen

1
@ พอล: I don't use te[l]net on this machine- ทำอย่างนั้น ในขณะที่คุณต้องการไคลเอ็นต์ telnet รอบด้วยเหตุผลต่าง ๆ ไม่มีเหตุผลในการเรียกใช้เซิร์ฟเวอร์ telnet เมื่อคุณมี ssh รหัสผ่าน plaintext ผ่านสายที่มีที่ไม่ดี
mlp

0

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


โดยทั่วไปฉันเห็นด้วยกับการแก้ปัญหาของคุณ ฉันเชื่อว่านี่เป็นมาตรฐานที่ บริษัท ฉันทำงานให้ ... แต่ฉันไม่คิดว่านี่เป็นสิ่งที่ฉันต้องการ ปัญหาคือว่าฉันส่วนใหญ่ใช้ macbook pro ของฉันจากที่บ้าน (เครือข่ายท้องถิ่น) จากการทำงาน (IP แบบคงที่) หรือในระหว่างการเดินทาง (ใช้โมเด็ม 3G / iPhone) สำหรับปัญหาล่าสุดหากฉันไม่มี VPN ซึ่งเกินความจำเป็นฉันคิดว่าเกินไป ขอบคุณสำหรับคำตอบของคุณ
Paul Peelen

0

DenyHosts, http://denyhosts.sourceforge.net/เป็นโครงการที่ดีที่ฉันมีโชคด้วย หากคุณตั้งค่า denyhosts เพื่อซิงโครไนซ์ระบบจะดาวน์โหลด IP ใหม่เพื่อเพิ่มลงในรายการที่ต้องห้ามที่จะทำให้ระบบอื่นเสียหายโดยใช้ denyhosts นอกจากนี้ยังหมดอายุ IP ที่ไม่ได้พยายามบังคับให้เดรัจฉานอยู่พักหนึ่ง

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


0

อะไรที่มีประสิทธิภาพสำหรับฉัน:

  1. อย่างที่คนอื่น ๆ บอกไว้ไม่มีการล็อกอินรูท PasswordAuthentication ถูกตั้งค่าเป็นไม่ (เฉพาะล็อกอินด้วยคีย์) ใน sshd_config

  2. ผู้ใช้หนึ่งหรือสองคนเท่านั้นที่ได้รับอนุญาตให้เข้าสู่ระบบผ่านทาง ssh และพวกเขามีชื่อแบบกึ่งปิดบังที่ไม่ได้อยู่ในรายชื่อผู้ใช้เครื่องมือกำลังดุร้าย (เช่นไม่ใช่ "admin" หรือ "apache" หรือ "web" หรือ " จอห์นนี่ ")

  3. กฎไฟร์วอลล์ที่ จำกัด (โดยพื้นฐานแล้วทุกอย่างถูกปิดกั้น แต่บริการและพอร์ตของฉัน) ฉันยัง จำกัด ping เพื่อป้องกันการสแกนหยาบมากขึ้น (มากถึงความผิดหวังของคู่ค้าของฉัน)

  4. บนโฮสต์เว็บของฉันฉัน จำกัด การเข้าถึงที่อยู่ IP ไม่กี่แห่ง แต่ดูเหมือนว่าจะไม่ใช่ตัวเลือกสำหรับคุณ แน่นอนว่าไม่สามารถทำได้ด้วยตัวเองบนโฮสต์ทั้งหมดของเรา คุณอาจต้องการค้นหา "การเคาะพอร์ต"

  5. และสิ่งที่ฉันชอบ: โมดูลการตอบสนองที่ใช้งานอยู่ของ OSSEC เพื่อบล็อกเงื่อนไขบังคับและการแจ้งเตือนข้อผิดพลาดอื่น ๆ มันตรวจพบการเข้าสู่ระบบ x ที่ไม่ถูกต้องในระยะเวลา y แล้วบล็อก (ผ่านคำสั่ง iptables firewall-drop) ในช่วงระยะเวลาหนึ่ง ฉันกำลังบล็อกประมาณ 12 ชั่วโมงเพื่อความสนุกสนาน :)

สิ่งหนึ่งที่ฉันทำที่นี่เพื่อให้แน่ใจว่าฉันไม่ได้ปิดกั้นสิ่งผิดปกติมากเกินไปนั่นคือใน / etc /ossec.conf ฉันตั้งค่าการตอบสนองที่ใช้งานอยู่ในระดับสูง (ที่ไม่มีอยู่ในการกำหนดค่าเริ่มต้น) แล้ว ผ่าน sshd_rules.xml และตั้งค่ากฎที่ฉันต้องการบล็อกในระดับนั้นและปรับเปลี่ยนเกณฑ์สำหรับการบล็อกเทียบกับการแจ้งเตือนตามต้องการ

หากคุณใช้ Apache คุณสามารถบล็อกสิ่งที่ละเมิดกฎ Apache ได้เช่นกัน ฉันไม่ได้บล็อกสิ่งเหล่านี้เพียงเพราะปัญหา NAT ฉันต้องการคิดถึงการบล็อกมหาวิทยาลัยทั้งหมดหรือบางสิ่งบางอย่าง :) นอกจากนี้คุณสามารถเขียนกฎที่กำหนดเองเพื่อบล็อกในเงื่อนไขบางประการในล็อกไฟล์ซึ่งมีประโยชน์จริงๆ

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