Denyhosts vs fail2ban กับ iptables - วิธีที่ดีที่สุดในการป้องกันการเข้าสู่ระบบที่ดุร้าย?


62

ฉันกำลังตั้งค่าเซิร์ฟเวอร์ LAMP และจำเป็นต้องป้องกัน SSH / FTP / ฯลฯ ความพยายามในการเข้าสู่ระบบแบบ brute-force ไม่สำเร็จ ฉันเห็นคำแนะนำมากมายสำหรับทั้ง denyhosts และ fail2ban แต่มีการเปรียบเทียบสองอย่างน้อย ฉันยังอ่านว่ากฎ IPTables สามารถเติมฟังก์ชันเดียวกันได้

ทำไมฉันถึงเลือกหนึ่งในวิธีการเหล่านี้กับอีกวิธีหนึ่ง? ผู้คนใน serverfault จัดการกับปัญหานี้ได้อย่างไร

คำตอบ:


53

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


3
โปรดทราบว่า DenyHosts จะ infact บล็อกบริการอื่น ๆ - ความแตกต่างที่สำคัญคือ fail2ban ใช้ iptables ในขณะที่ DenyHosts ใช้ hosts.deny บริการบางอย่างไม่ดูไฟล์โฮสต์เช่น Apache
jammypeach

เพื่อโยนตัวเลือกอื่นลงบนโต๊ะฉันเพิ่งค้นพบว่าตัวกำหนดค่าไฟร์วอลล์ ufw ยังอนุญาตให้คุณใช้การ จำกัด อัตรา (ไม่สามารถกำหนดค่าได้) กับพอร์ต TCP หรือ UDP หากคุณใช้ UFW อยู่แล้วนี่อาจเป็นตัวเลือกที่ดีแทนการกำหนดค่าและเรียกใช้ daemon เพิ่มเติม
spiffytech

สิ่งแรกที่ต้องทำเพื่อป้องกันการละเมิด bruteforce กำลังใช้รหัสผ่านที่แข็งแกร่งพอสมควร (หรือปิดการใช้รหัสผ่านรับรองความถูกต้องทั้งหมด :) การ จำกัด อัตรา (คนเดียว) คือจุดอ่อนสำหรับสิ่งนั้น ฉันไม่ได้ลองใช้ทางเลือกอื่น แต่ฉันใช้ fail2ban ด้วยตัวเองและพบว่ามันค่อนข้างมีประโยชน์ในการป้องกันบ็อตการตรวจสอบรหัสผ่าน
Petr Gladkikh

จากประสบการณ์ของฉัน fail2ban ต้องการงานเพิ่มอีกเล็กน้อยเพื่อให้มันทำอะไรได้จริง ในทางตรงกันข้ามคุณสามารถติดตั้ง denyhosts RPM และเริ่มต้นขึ้นเพื่อปกป้องเซิร์ฟเวอร์ของคุณในขณะที่คุณใช้งานตัวเลือกที่ซับซ้อนมากขึ้น ฉันเห็นด้วยอย่างยิ่ง fail2ban นั้น 'ดีกว่า' แต่สำหรับการป้องกันที่ง่ายคุณไม่สามารถเอาชนะ denyhost ได้
Ralph Bolton

21

วิธีที่ดีที่สุดเพื่อป้องกันการเข้าสู่ระบบกำลังดุร้าย?

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

ต้องบอกว่าการปกป้องระบบปฏิบัติการของคุณด้วยบางอย่างเช่น fail2ban เป็นความคิดที่ดี Fail2ban นั้นแตกต่างจาก DenyHosts เล็กน้อยแม้ว่าพวกเขาจะเล่นในพื้นที่เดียวกัน Fail2ban ใช้ iptables

http://en.wikipedia.org/wiki/Fail2ban

Fail2ban คล้ายกับ DenyHosts ... แต่ต่างจาก DenyHosts ที่เน้น SSH, fail2ban สามารถกำหนดค่าเพื่อตรวจสอบบริการใด ๆ ที่เขียนความพยายามในการเข้าสู่ระบบไปยังไฟล์บันทึกและแทนที่จะใช้ /etc/hosts.deny เพื่อบล็อกที่อยู่ IP / โฮสต์ , fail2ban สามารถใช้ Netfilter / iptables และ TCP Wrappers /etc/hosts.deny

มีหลายเทคนิคการรักษาความปลอดภัยที่สำคัญที่คุณควรพิจารณาเพื่อช่วยป้องกันการเข้าสู่ระบบกำลังดุร้าย:

SSH:

  • ไม่อนุญาตให้รูทเข้าสู่ระบบ
  • ไม่อนุญาตให้ใช้รหัสผ่าน ssh (ใช้การตรวจสอบรหัสส่วนตัว)
  • อย่าฟังในทุก ๆ อินเตอร์เฟส
  • สร้างส่วนต่อประสานเครือข่ายสำหรับ SSH (เช่น eth1) ซึ่งแตกต่างจากส่วนต่อประสานที่คุณให้บริการคำขอ (เช่น eth0)
  • อย่าใช้ชื่อผู้ใช้ทั่วไป
  • ใช้รายการอนุญาตและอนุญาตเฉพาะผู้ใช้ที่ต้องการการเข้าถึง SSH
  • หากคุณต้องการการเข้าถึงอินเทอร์เน็ต ... จำกัด การเข้าถึงชุด IP ที่ จำกัด IP แบบคงที่หนึ่งอันเหมาะสมอย่างไรก็ตามการล็อกลงไปที่ xx0.0 / 16 นั้นดีกว่า 0.0.0.0/0
  • หากเป็นไปได้ให้หาวิธีเชื่อมต่อโดยไม่ใช้อินเทอร์เน็ตวิธีที่คุณสามารถปฏิเสธการรับส่งข้อมูลอินเทอร์เน็ตทั้งหมดสำหรับ SSH (เช่นด้วย AWS คุณสามารถรับการเชื่อมต่อโดยตรงที่ข้ามอินเทอร์เน็ตได้นั่นคือ Direct Connect)
  • ใช้ซอฟต์แวร์เช่น fail2ban เพื่อตรวจจับการโจมตีที่ดุร้าย
  • ตรวจสอบให้แน่ใจว่าระบบปฏิบัติการเป็นรุ่นล่าสุดอยู่เสมอโดยเฉพาะอย่างยิ่งความปลอดภัยและแพคเกจ ssh

การประยุกต์ใช้:

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

1
คุณสามารถอธิบายอย่างละเอียดเกี่ยวกับข้อความที่ว่า "มีหลายวิธีที่จะหยุดความพยายามอันโหดร้ายก่อนที่พวกเขาจะไปถึงโฮสต์ของคุณหรือแม้แต่ในระดับ SSH" ฉันสนใจเป็นพิเศษหากคุณมีข้อเสนอแนะสำหรับเครื่องที่โฮสต์ซึ่งคุณไม่สามารถควบคุมเครือข่ายภายนอกได้ ขอบคุณ!
Kevin Keane

7

ฉันใช้กฎ iptables เพื่อ จำกัด อัตราการเชื่อมต่อใหม่จากที่อยู่ IP เดียวกัน (ส่วนใหญ่เป็น SSH แต่ก็ใช้ได้ดีสำหรับ FTP ด้วย) ข้อได้เปรียบดังที่ฉันเห็นมันมีอยู่เหนือ "fail2ban" และเครื่องมืออื่น ๆ คือเส้นทาง iptables นั้นเกิดขึ้นอย่างสมบูรณ์ในโหมดเคอร์เนลและไม่พึ่งพาเครื่องมือโหมดผู้ใช้ใด ๆ

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

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

ด้วย SSH คุณควรใช้การรับรองความถูกต้องของใบรับรองและไม่ยอมรับรหัสผ่านอยู่ดี


@ mc0e - ฉันไม่ได้ติดตาม
Evan Anderson

7

อีกวิธีที่ดีในการปกป้อง SSH (ฉันใช้สิ่งนี้มาสิบปีหรือมากกว่า) คือการใช้ไลบรารี่ล่าสุดใน iptables โดยกำเนิด (ขึ้นอยู่กับ distro ของคุณ)
โดยทั่วไปสามารถใช้เป็นพอร์ตเคาะที่สร้างขึ้นใน iptables นี่จะช่วยให้คุณปวดหัวมาก ๆ ตราบใดที่คุณสามารถเชื่อมต่อ tcp (telnet เป็นวิธีหนึ่งฉันยังใช้ไคลเอ็นต์ ssh และชี้ไปที่พอร์ตสิ่งใดก็ตามที่จะทำการเชื่อมต่อ tcp กับหมายเลขพอร์ตที่ระบุฉันกำลังดูคุณ Putty!) ลูกค้าเริ่มต้นการเชื่อมต่อ ssh คุณสามารถใช้สิ่งนี้

ด้านล่างเป็นตัวอย่างที่จะให้ iptables เปิดพอร์ต 22 ไปยังโฮสต์ของคุณเมื่อคุณ telnet จากโฮสต์ของคุณไปยังเซิร์ฟเวอร์ที่พอร์ต 4103 จากนั้นคุณสามารถใช้ telnet ไปยังพอร์ต 4102 หรือ 4104 เพื่อปิดการเปิด sed เหตุผลที่ทั้ง 4102 และ 4104 นั้นคือการป้องกันการสแกน tcp อย่างง่ายจากการเปิด 22 เพียงแค่การเชื่อมต่อ tcp (telnet) ถึงพอร์ต 4103 เท่านั้นที่จะช่วยให้คุณเข้าได้

สนุก!

โอ้และฉันชอบ Fail2Ban ความยืดหยุ่นมากขึ้นและฉันชอบที่การห้ามเกิดขึ้นใน iptables มากกว่า tcpwrappers

SSH PORTKNOCKING

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -m recent --rcheck --name SSH -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 4102 -m recent --name SSH --remove -j DROP
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 4103 -m recent --name SSH --set -j DROP
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 4104 -m recent --name SSH --remove -j DROP

6

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

อีกข้อแตกต่างคือ Fail2ban ใช้ iptables ในขณะที่ Denyhosts ใช้ tcpwrappers คนอื่น ๆ ได้พูดถึงความแตกต่างนี้มาก่อน แต่มีบันทึกสองด้านที่ควรค่าแก่การกล่าวขวัญ

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

ผลอีกอย่างคือเมื่อ iptables ถูกแทนที่ด้วย nftables Fail2ban อาจหยุดทำงานหรือต้องเขียนใหม่ Denyhosts จะทำงานต่อไป

ดังนั้นทั้งสองมีข้อดีและข้อเสีย ฉันชอบทั้งคู่; สำหรับตัวฉันเองฉันใช้ Denyhosts เพราะโดยปกติฉันต้องการปกป้อง SSH เท่านั้นและฉันชอบแบ่งปันรายการบล็อก


5

สิ่งหนึ่งที่ควรทราบเกี่ยวกับ Fail2Ban ก็คือดูเหมือนว่าจะใช้หน่วยความจำมากกว่า DenyHosts ประมาณ 10MB ดังนั้นหากคุณใช้ VPS ขนาด 128 เมกะไบต์คุณอาจต้องการตรวจสอบสิ่งนั้น นอกจากนี้ fail2ban แบบ out-of-the-box fail2ban เท่านั้นที่ติดตั้งบน SSH ซึ่งหมายความว่าไม่มีการเปลี่ยนแปลงการตั้งค่า - DenyHosts ทำสิ่งเดียวกันในหน่วยความจำน้อย


2
ลองเพิ่ม "ulimit -s 256" ต่อท้าย / etc / default / fail2ban ลดลง 10MB ในระบบของฉัน
pkoch

3

denyhosts สำหรับ ssh fail2ban นั้นมีความครอบคลุมมากกว่า (HTTP, FTP และอื่น ๆ ) ทั้งสองใช้ iptables เบื้องหลัง


ทั้ง "denyhosts" และ "fail2ban" ใช้ iptables เพื่อให้บรรลุพฤติกรรม "การบล็อก" ของพวกเขา แต่พวกเขาไม่ได้ใช้ iptables เพื่อ จำกัด อัตรา พวกเขาแยกบันทึกใน "ดินแดนผู้ใช้" และดำเนินการตามรายการบันทึก
Evan Anderson

10
@Evan, denyhosts ไม่ได้ใช้ iptables (โดยค่าเริ่มต้น) มันใช้ TCP wrappers และอัพเดท /etc/hosts.deny ของคุณเมื่อระบบถูกแบน
Zoredache

@Zoredache: ฉันยืนแก้ไข ก่อนหน้านี้ enver ใช้ "denyhosts" ก่อนหน้านี้ฉันตั้งสมมติฐานที่ไม่ถูกต้องเกี่ยวกับการใช้ฟังก์ชัน "การบล็อก" แต่ถึงกระนั้นในฐานะที่เป็นเครื่องมือแยกวิเคราะห์ / ปฏิกิริยา userland ฉันยังคงต้องการใช้โซลูชันที่ใช้ iptables อย่างเคร่งครัดเพื่อ "denyhosts"
Evan Anderson

1

แทนที่จะยุ่งกับ iptables ที่น่าเบื่อหรือการกำหนดค่า fail2ban ทำไมชุมชนเปิดไม่ทำงานทั้งหมดให้คุณและใช้ CSF / LFD แทน? ฉันขอแนะนำได้เหนือตัวเลือกอื่น ๆ ที่กล่าวถึงทั้งหมด ดูhttp://configserver.com/cp/csf.htmlสำหรับสิ่งที่เซิร์ฟเวอร์ของคุณสามารถทำได้ CSF ไม่ต้องการแผงควบคุม แต่ก็มี UI ที่เรียบง่ายสำหรับผู้ที่ไม่ต้องการใช้เชลล์ และมันก็มีความน่าเชื่อถือแบบไม่ต้องอาศัย perl-scripting perl ที่น่าเชื่อถือ


8
สิ่งนี้ฟังดูคล้ายกับโฆษณามากขึ้นและคัดสรรคำถามที่เกิดขึ้นจริง
Drew Khoury

ไม่ฉันไม่ได้ทำตามคำถามจริง ฉันมอบทางเลือกอื่นที่จะป้องกันไม่ให้คุณต้องมารบกวนตัวเองด้วยคำถามนี้ อย่างจริงจัง CSF / LFD ไม่ได้เป็นเพียงระบบควบคุมไฟร์วอลล์อื่นเท่านั้น แต่มันก็เพิ่มขึ้นจากปัญหาที่เกิดขึ้นที่นี่ ทำไมไม่มีใครอยากวิวัฒนาการ? มันช่วยให้คุณประหยัดเวลาได้มากเพราะคนอื่น ๆ ได้แก้ไขมันแล้ว นั่นเป็นเหตุผลที่ CSF มีอยู่จริง
Ben

สำหรับสิ่งที่คุ้มค่าในฐานะคนที่ให้ความสำคัญกับความสามารถในการหารายได้ของเวลาของฉันถ้าราคาถูกต้องฉันค่อนข้างจะมีวิธีการแก้ปัญหา "plug 'n play" กับสิ่งนี้แม้ว่าจะมีราคาไม่กี่ดอลลาร์ก็ตาม ด้วยวิธีนี้ฉันไม่ต้องเสียเวลาเรียนรู้เกี่ยวกับสิ่งที่ฉันไม่สนใจ แต่ตระหนักถึงความสำคัญของการได้รับการปกป้อง
David

1

fail2ban ดูเหมือนจะไม่มีกลไกในการจดจำล็อกอิน ssh ที่ประสบความสำเร็จและรีเซ็ตจำนวนครั้งของความล้มเหลว

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

จากที่กล่าวมาตอนนี้ฉันกำลังคิดที่จะย้ายออกจาก fail2ban ในแง่นี้อย่างน้อยที่สุด denyhosts ก็ดีกว่า อย่างไรก็ตามเห็นได้ชัดว่ามันไม่ใช่ตัวเลือกที่ดีอีกต่อไปและไม่ได้รับการสนับสนุนในเดเบียนเวอร์ชันใหม่ ๆ อีกต่อไป (การสนทนาบางอย่างที่https://www.chrissearle.org/2015/06/16/replacing-denyhosts-with-fail2ban-for- เดเบียน / )

ฉันไม่มีทางออกที่ดีที่นี่


มีปัญหาคล้ายกันหากคุณใช้การตรวจสอบสิทธิ์ LDAP การเข้าสู่ระบบที่ประสบความสำเร็จมากเกินไปจะทำให้คุณถูกล็อค: bugs.launchpad.net/ubuntu/+source/libpam-ldap/+bug/562388
Mike

เพื่อป้องกันการแสดงคีย์ทั้งหมดให้ผู้ใช้ของคุณทราบวิธีระบุคีย์ที่จะใช้ในไฟล์ ~ / .ssh / config
BillThor

0

ที่จริงแล้วฉันคิดว่า denyHost สามารถป้องกันบริการอื่น ๆ นอกเหนือจากบริการ sshd ได้ ในไฟล์กำหนดค่า - /etc/denyhosts.confมีบางบรรทัดของรหัสกล่าวว่า:

# BLOCK_SERVICE: the service name that should be blocked in HOSTS_DENY
#
# man 5 hosts_access for details
#
# eg.   sshd: 127.0.0.1  # will block sshd logins from 127.0.0.1
#
# To block all services for the offending host:  
BLOCK_SERVICE = ALL
# To block only sshd:
# BLOCK_SERVICE  = sshd

ดังนั้นถ้าเราตั้งค่าBLOCK_SERVICEตัวแปรให้ALLเป็นข้างต้นเราสามารถดูบริการ ssh ของเรา


0

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

หากคุณเปิดใช้งานการสนับสนุน iptables Denyhosts จะสร้างรายการที่อยู่ IP ที่ถูกบล็อกจำนวนมากช้า Denyhosts ไม่ได้ใช้ ipset หรือ nftables เพื่อสร้างแผนที่ IP ที่มีประสิทธิภาพ

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