การเข้าสู่ระบบ ssh ล้มเหลวหลายร้อยรายการ


81

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

คำตอบ:


67

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

iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --name SSH --rsource -j DROP 
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH --rsource -j ACCEPT 

กฎเหล่านี้สมมติว่าคุณยอมรับการเชื่อมต่อ ESTABLISHED ก่อนหน้านี้ในตาราง (เพื่อให้การเชื่อมต่อใหม่เท่านั้นที่จะเข้าถึงกฎเหล่านี้) การเชื่อมต่อ SSH ใหม่จะเข้าสู่กฎเหล่านี้และถูกทำเครื่องหมาย ใน 60 วินาทีความพยายาม 5 ครั้งจากที่อยู่ IP เดียวจะส่งผลให้เกิดการเชื่อมต่อขาเข้าใหม่จาก IP นั้น

สิ่งนี้ใช้ได้ดีสำหรับฉัน

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


1
ฉันชอบวิธีนี้และฉันวางแผนที่จะนำมันมาคืนนี้เมื่อฉันได้รับไฟในวันนี้
MattMcKnight

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

1
+1 สำหรับคำแนะนำ "port knocking" ของ @ Evan ข้อมูลบางส่วน: linux.die.net/man/1/knockd แต่อย่าทำด้วยวิธี man page (เช่นเพิ่ม / ลบกฎ iptables) แต่ใช้-m conditioniptables แทนแทน
pepoluan

2
คุณไม่ต้องการ - พอร์ต 22 ในกฎเหล่านี้เพื่อให้มีผลกับการรับส่งข้อมูล SSH เท่านั้น?
clime

2
@clime - ใช่แล้ว ยากที่จะเชื่อว่าสิ่งนี้เกิดขึ้นที่นี่ 2 1/2 ปีและไม่มีใครสังเกตเห็น! จับดี.
Evan Anderson

39

fail2banสามารถช่วยในเรื่องนี้ได้โดยการปิดกั้นที่อยู่ IP ที่พยายามเข้าสู่ระบบล้มเหลวมากเกินไป


11
ฉันไม่ชอบเครื่องมือ / สคริปต์การอ่านบันทึกและออกคำสั่งในนามของผู้ใช้ดูแลระบบ
asdmin

2
@asdmin ใช่โดยเฉพาะอย่างยิ่งเมื่อพวกเขามีประวัติที่ดีเช่นนี้ ...
maxschlepzig

25

ฉันขอแนะนำให้ใช้พอร์ตที่ไม่ได้มาตรฐานสำหรับ SSH ถ้าคุณสามารถ (เช่น. พอร์ต 10222) แต่เนื่องจากคุณพูดถึงคุณไม่สามารถทำเช่นนั้นได้ฉันไม่แนะนำให้ใช้บางอย่างเช่น DenyHosts

http://denyhosts.sourceforge.net/

แพ็คเกจที่ยอดเยี่ยมติดตั้งและกำหนดค่าได้ง่าย


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

1
OpenSSH 6.7 รองรับ tcpwrappersซึ่งเป็นสิ่งที่ denyhosts ใช้
Zoredache

15

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

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

นี่คือวิธีที่คุณทำ:

ปฏิเสธการเชื่อมต่อ ssh ทั้งหมดใน /etc/hosts.deny:

# /etc/hosts.deny fragment
sshd:  all

อนุญาตระบบที่รู้จักโดย IP ใน /etc/hosts.allow รวมทั้งเพิ่มไฟล์สำหรับการเข้าถึงชั่วคราว:

# /etc/hosts.allow fragment
sshd:  10.0.10.2     # some system
sshd:  172.99.99.99  # some other system
sshd:  /etc/hosts.allow.temporary-sshd-access

สร้างไฟล์ php ในเว็บเซิร์ฟเวอร์ของคุณและตั้งชื่อที่ไม่ชัดเจนเช่น my-sshd-access.php:

<?php
function get_ip()
{
    return getenv("REMOTE_ADDR"); 
}

?>

<?php
$out='/etc/hosts.allow.temporary-sshd-access';
$log='/var/log/sshd-access-addition-log';

print "Was:";
readfile($out);
print "<br>";
$ip=get_ip();
$fp=fopen($out,"w");
fputs($fp,$ip);
fclose($fp);

$lfp=fopen($log,"a");
fputs($lfp,$ip);
fputs($lfp,"n");
fclose($lfp);

print "Wrote: ";
readfile($out);
?>

ยกโทษให้รหัส php - ฉันกวาดมันจากที่อื่นดังนั้นอาจเป็นไปได้ที่จะทำความสะอาดทั้งกลุ่ม สิ่งที่มันทำคือการเพิ่มที่อยู่ IP ของระบบการเข้าถึงมันไปยังไฟล์ /etc/hosts.allow.temporary-sshd-access ซึ่งอ่านโดย sshd (เนื่องจากการรวมโดย /etc/hosts.allow) ในเวลาเชื่อมต่อ .

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

$ wget http://your.system.name/my-sshd-access.php

ตอนนี้คุณควรจะสามารถ ssh ในระบบของคุณ หากนี่เป็นที่ที่คุณมักจะถูกเก็บข้อมูลบ่อยครั้งมันเป็นเรื่องไม่สำคัญที่จะอ่านเนื้อหาของไฟล์ /etc/hosts.allow.temporary-sshd-access และเพิ่มที่อยู่ IP ไปยัง / etc / hosts อย่างถาวร อนุญาต


หากต้องการทำให้ปลอดภัยยิ่งขึ้นให้เรียกใช้หน้านี้ใน https
Robert Munteanu

หากคุณเปลี่ยนสคริปต์ดังนั้นจึงไม่ส่งออกเนื้อหาของไฟล์ "ที่อยู่ IP ชั่วคราวที่อนุญาต" จะไม่มีสิ่งใดที่จะทำให้ดมกลิ่นดมกลิ่น จากนั้นคุณสามารถเรียกใช้ได้บน http แทน https
s, Barry

"ที่อยู่ IP ชั่วคราวที่ได้รับอนุญาต" นั้นเป็นของผู้ร้องขอเสมอ (เช่นของคุณ) ฉันไม่คิดว่ามันจะสำคัญไม่ทางใดก็ทางหนึ่ง Https หมายความว่า URL ที่ร้องขอนั้นได้รับการเข้ารหัสหมายความว่ามันไม่สำคัญที่จะดมกลิ่นนอกสาย
David Mackintosh

สิ่งนี้จะไม่ทำงานหากคุณอยู่ในเครือข่ายที่เชื่อมต่อ HTTP พร็อกซี แต่เส้นทางที่ตรงไปยังอินเทอร์เน็ตของคุณคือการออกนอกเส้นทางที่แตกต่างกัน
Andrew Taylor

OpenSSH 6.7 รองรับ tcpwrappersซึ่งเป็นคำตอบที่คุณใช้
Zoredache


8

ทำตัวเองชอบและปิดการใช้งานรหัสผ่าน ใช้คีย์การรับรองความถูกต้องเฉพาะ (google ssh-keygen เป็นต้น - ตัวอย่าง: http://www.puddingonline.com/~dave/publications/SSH-with-Keys-HOWTO/document/html/SSH-with-Keys-HOWTO-4 .html ) เซิร์ฟเวอร์ของคุณจะปลอดภัยมากขึ้นคุณจะเชื่อมต่อกับมันได้อย่างสะดวกสบายมากขึ้น (ตรวจสอบ ssh-agent, ssh-add, keychain) และคุณจะไม่ตกเป็นเหยื่อของการโจมตีแบบ brute force อีกต่อไป


2

อีกวิธีคือย้าย ssh ไปยังพอร์ตอื่น เวิร์มเหล่านี้ค่อนข้างโง่


3
โปสเตอร์ต้นฉบับบอกว่าเขาต้องวิ่งบนพอร์ตมาตรฐาน
kbyrd

1
ขอโทษฉันต้องอ่านคำถามอย่างระมัดระวังมากขึ้น :)
disserman

1
ฉันต้องยอมรับ ... ฉันมี SSH ของฉันทำงานบนพอร์ต "ทางเลือก" และมันทำให้โลกแตกต่างในบันทึก เวิร์มนั้นฉลาดพอ ๆ กับก้อนอิฐดังนั้นมันจึงทำงานได้ดีกับสคริปต์อัตโนมัติแบบโง่ ไม่ดีต่อผู้โจมตีมนุษย์ ยังคงบันทึกเสียงที่มีความสุขของความเงียบในพวกเขา ...
เอเวอรี่เพน

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

2

ตัวเลือกอื่นอาจต้องการการเชื่อมต่อ ssh ทั้งหมดจะถูกตรวจสอบโดยใบรับรองและทำด้วยรหัสผ่านทั้งหมด

ฉันใช้เพื่อใช้ Denyhosts แต่ฉันพบว่าฉันเพิ่งเชื่อมต่อเป็นระยะ ๆ จากสถานที่จำนวนหนึ่งดังนั้นฉันจึงบล็อกการเชื่อมต่อพอร์ต 22 ทั้งหมดยกเว้นที่อื่นและใช้พอร์ตเคาะเพื่อให้ฉันสามารถเชื่อมต่อได้จากทุกที่ด้วยแล็ปท็อปของฉัน .


1

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

หากคุณ จำกัด ผู้ใช้ / กลุ่มเฉพาะผู้ที่ควรได้รับอนุญาตให้ ssh ในสถานที่แรกและปิดการใช้งานการเข้าสู่ระบบในฐานะ root คุณควรมีความปลอดภัยมากกว่า และหากยังไม่เพียงพอจะมีการตรวจสอบสิทธิ์แบบใช้คีย์เสมอ


1

หากคุณต้องใช้ SSH (และพอร์ต 22) คุณจะไม่สามารถหลีกเลี่ยงสิ่งเหล่านี้ได้ หากคุณต้องยอมรับรหัสผ่านแสดงว่าคุณมีรูปร่างแย่ลง

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

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


0

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

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


0

เว็บโฮสติ้งส่วนใหญ่ใช้APF + BFDเพื่อ ip-block ล็อกอิน SSH ล้มเหลว ทุกวันนี้มีCSF (ไฟร์วอลล์ของเซิร์ฟเวอร์ตัวกำหนดค่า)ซึ่งรวมถึงเครื่องมือที่เรียกว่า LFD ซึ่งทำสิ่งเดียวกันและอื่น ๆ รวมถึงการบล็อก IP จากบางประเทศที่คุณไม่ต้องการเข้าถึงเซิร์ฟเวอร์ของคุณ (เช่นเกาหลีจีน ฯลฯ ที่ 99% ของโพรบ SSH ของฉัน ดูเหมือนจะมาจาก)



0

หากคุณต้องการแก้ไขปัญหานี้ในโฮสต์มากกว่าหนึ่งโฮสต์คุณอาจต้องการตรวจสอบ OSSEC: http://www.ossec.net/main/ossec-architecture

สิ่งนี้จะช่วยให้คุณสามารถกำหนดค่าหลายเอเจนต์จากที่ตั้งส่วนกลางเพื่อตอบสนองต่อการโจมตีด้วยกำลังดุร้ายโดยอัตโนมัติ

ซอฟต์แวร์ที่ดีมาก ๆ :)


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