การรักษาความปลอดภัยเซิร์ฟเวอร์ linux: iptables vs fail2ban


10

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

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

ฉันมีการจัดการที่ดีเกี่ยวกับความปลอดภัยของเซิร์ฟเวอร์เช่นการล็อค ssh โดยไม่อนุญาตให้มีการล็อกอินรูทหรือรหัสผ่านเปลี่ยนพอร์ตเริ่มต้นมั่นใจว่าซอฟต์แวร์ทันสมัยตรวจสอบไฟล์บันทึกอนุญาตให้โฮสต์บางแห่งเข้าถึงเซิร์ฟเวอร์และใช้ความปลอดภัย เครื่องมือการตรวจสอบเช่นLynis ( https://cisofy.com/lynis/ ) สำหรับการปฏิบัติตามการรักษาความปลอดภัยโดยทั่วไปดังนั้นคำถามนี้ไม่จำเป็นต้องเกี่ยวกับว่าถึงแม้จะป้อนข้อมูลและคำแนะนำที่เป็นยินดีต้อนรับเสมอ

คำถามของฉันคือฉันควรใช้โซลูชันใด (fail2ban หรือ iptables) และฉันจะกำหนดค่าได้อย่างไรหรือฉันควรใช้ทั้งสองอย่างร่วมกันเพื่อป้องกันการโจมตีที่โหดร้าย?

มีการตอบสนองที่น่าสนใจเกี่ยวกับหัวข้อ ( Denyhosts vs fail2ban vs iptables- วิธีที่ดีที่สุดในการป้องกันการเข้าสู่ระบบกำลังดุร้าย? ) คำตอบที่น่าสนใจที่สุดสำหรับฉันคือ ( https://serverfault.com/a/128964 ) และการกำหนดเส้นทาง iptablesนั้นเกิดขึ้นในเคอร์เนลซึ่งตรงข้ามกับ fail2ban ซึ่งใช้เครื่องมือโหมดผู้ใช้เพื่อแยกวิเคราะห์ไฟล์บันทึก Fail2ban ใช้ iptables แน่นอน แต่ก็ยังต้องแยกวิเคราะห์ไฟล์บันทึกและจับคู่รูปแบบจนกว่าจะดำเนินการ

มันสมเหตุสมผลหรือไม่ที่จะใช้ iptables และใช้อัตรา จำกัด ( https://www.rackaid.com/blog/how-to-block-ssh-brute-force-attacks/ ) เพื่อวางคำขอจาก IP เป็นระยะเวลา เวลาที่พยายามเชื่อมต่อมากเกินไปในช่วงเวลาหนึ่งโดยไม่คำนึงถึงโปรโตคอลที่พยายามเชื่อมต่อ ถ้าเป็นเช่นนั้นมีความคิดที่น่าสนใจเกี่ยวกับการใช้ drop vs ปฏิเสธสำหรับแพ็กเก็ตเหล่านั้นที่นี่ ( http://www.chiark.greenend.org.uk/~peterb/network/drop-vs-reject ) ความคิดใด ๆ

Fail2ban อนุญาตให้มีการกำหนดค่าที่กำหนดเองในรูปแบบของความสามารถในการเขียน ' กฎ ' ที่กำหนดเองสำหรับบริการที่อาจไม่ได้ระบุไว้ในการกำหนดค่าเริ่มต้น มันเป็นเรื่องง่ายในการติดตั้งและการตั้งค่าและมีประสิทธิภาพ แต่มันอาจจะเป็น overkill ถ้าทั้งหมดที่ฉันกำลังพยายามที่จะบรรลุคือ ' บล็อก ' ไอพีจากเซิร์ฟเวอร์ถ้าพวกเขาทำ 2 ครั้งการเข้าถึงล้มเหลวในการให้บริการใด ๆ / โปรโตคอลกว่าxจำนวน เวลา

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

ขอบคุณที่สละเวลา


3
คุณอาจพบว่าเหตุใดฉันจึงต้องใช้ไฟร์วอลล์หากเซิร์ฟเวอร์ของฉันได้รับการกำหนดค่าอย่างดี สามารถหลั่งน้ำตาแสงบางอย่างเกี่ยวกับปัญหา
MadHatter

คำตอบ:


21

ฉันควรใช้ fail2ban หรือ iptables อย่างไร

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

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

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

วิธีการที่แตกต่างกันเพื่อให้มีข้อมูลเชิงลึกไฟร์วอลล์ระดับแอพลิเคชันจะโดยวิธีการตรวจจับการบุกรุกระบบป้องกัน /


ตัวอย่างเช่นเว็บเซิร์ฟเวอร์เป็นบริการสาธารณะทั่วไปและในไฟร์วอลล์พอร์ต TCP 80 และ 443 ของคุณเปิดสำหรับอินเทอร์เน็ตที่มีขนาดใหญ่
โดยทั่วไปแล้วคุณไม่มีข้อ จำกัด อัตราใด ๆ บนพอร์ต HTTP / HTTPS เนื่องจากผู้ใช้ที่ถูกต้องหลายรายสามารถมีต้นกำเนิดเดียวเมื่ออินสแตนซ์นั้นอยู่หลังเกตเวย์ NAT หรือเว็บพรอกซี

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

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


นี่คือความเข้าใจที่ฉันกำลังมองหามันทำให้รู้สึกที่สมบูรณ์แบบสำหรับฉันขอบคุณที่สละเวลา
kingmilo

2
แม้ว่าจะมีแอพพลิเคชันไฟร์วอลล์ (หรือที่รู้จักกันในชื่อแอพพลิเคชันเกตเวย์) ที่สามารถทำการตรวจสอบแพ็คเก็ตได้
gardenhead

@gardenhead เห็นด้วยและ +1; เนื่องจากการiptablesที่ OP กล่าวถึงฉันได้มุ่งเน้นไปที่การสร้างตัวกรอง packet ของ Linux ลงในเคอร์เนล ในไฟร์วอลล์"ความเห็น"แอปพลิเคชันของฉันไม่ได้ตรวจสอบแพ็คเก็ตค่อนข้างเป็นโปรโตคอลแอปพลิเคชันที่รับรู้และควรตรวจสอบคำขอที่สมบูรณ์ ในเว็บคุณจะต้องจัดการกับผลิตภัณฑ์เช่น mod_security ของอาปาเช่, เครื่องใช้ F5 และ Bluecoat และแม้แต่ผู้รับมอบฉันทะย้อนกลับ "ต่ำต้อย"
HBruijn

@HBruijn คุณถูกต้อง - ฉันใช้แพ็กเก็ตคำศัพท์ในทางที่ผิด ฉันไม่ทราบรายละเอียดเกี่ยวกับวิธีการสร้างเกตเวย์แอปพลิเคชัน แต่ฉันคิดว่าพวกเขารอรับแพ็คเก็ตเพียงพอที่จะรวบรวมข้อความเลเยอร์แอปพลิเคชันที่สมบูรณ์ก่อนการตรวจสอบ + การส่งต่อ
Gardenhead

1
Protip: ใช้โมดูลล่าสุดของ iptables สำหรับ ssh แม้ว่าคุณจะใช้ fail2ban สำหรับบริการอื่น ๆ อาจมีโหมดความล้มเหลวที่น่าสนใจที่กฎไม่ได้ล้างอย่างถูกต้องและมีการเข้าสู่ระบบได้รับผลกระทบจากที่จะน่ารำคาญจริงๆ (และยังทำให้ปัญหายากที่จะแก้จุดบกพร่อง) เมื่อเร็ว ๆนี้กฎที่แท้จริงไม่จำเป็นต้องเปลี่ยนดังนั้นคุณจึงมีโอกาสดีที่จะได้รับการเข้าถึงกลับ
Simon Richter

8

ฉันควรใช้ fail2ban หรือ iptables อย่างไร

นี่คล้ายกับการถามว่า "ฉันควรใช้เข็มขัดนิรภัยหรือรถยนต์หรือไม่"

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

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

คุณสามารถใช้ fail2ban เพื่อเพิ่ม (และลบ) กฎ iptables ตามต้องการ คุณยังสามารถเพิ่มและลบกฎ iptables ด้วยมือหรือคุณสามารถใช้ fail2ban เพื่อทำสิ่งที่แตกต่างกันโดยสิ้นเชิงในการตอบสนอง นั่นคือทั้งหมดที่เกี่ยวกับวิธีการกำหนดค่า

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

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

กล่าวอีกนัยหนึ่งคุณสามารถแยกทั้งสองออกจากกันได้อย่างง่ายดายตั้งแต่แรกคุณต้องการทั้งสองอย่าง

มันจะเกินความจริงหรือไม่ถ้าทั้งหมดที่ฉันพยายามบรรลุคือ 'บล็อก' IP จากเซิร์ฟเวอร์ถ้าพวกเขาพยายามเข้าถึง 2 ครั้งที่ล้มเหลวในบริการ / โปรโตคอลใด ๆ ในช่วงระยะเวลาขวาน?

นั่นคือว่า fail2ban ใช้กรณีได้รับการออกแบบมาเพื่อแก้ การใช้เครื่องมือเพื่อจุดประสงค์นั้นแทบไม่เคยเกินความจำเป็น

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

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


ขอบคุณคำติชมที่กว้างขวางฉันคิดว่าฉันไม่เคยคิดถึงทั้งสองเลยว่ามีฟังก์ชั่นที่แยกจากกันโดยสิ้นเชิง
kingmilo

4

ฉันแก้ไขคำถามเดิมเมื่อหลายปีก่อน ฉันตัดสินใจใช้ iptables กับโมดูลล่าสุดเนื่องจากประสิทธิภาพและการตั้งค่าที่ง่าย ฉันต้องปกป้องคอนเทนเนอร์เสมือนจำนวนมากบนโฮสต์ โปรดจำไว้ว่าอย่าเปิดเวกเตอร์ DOS ใด ๆ ด้วยกฎของคุณ ยังใช้ ipset เพื่อจับคู่รายการเครือข่ายหรือรายการ ip ในกฎ ฉันใช้มันเพื่อรายการสีขาว เครือข่ายทั้งหมดของหนึ่งประเทศในหนึ่งรายการนั้นยอดเยี่ยมสำหรับการจูนแบบละเอียด และมันเป็นเรื่องง่ายมากที่จะปกป้องบริการอื่น ๆ ด้วย ruleset เดียวกันโดยเพิ่มพอร์ตอีกหนึ่งพอร์ตเพื่อจับคู่ ดังนั้นฉันไม่ชอบที่จะเปลี่ยนกับ fail2ban แต่บางทีคนที่มีความต้องการอื่น ๆ จะมีความสุขกับ fail2ban

นี่คือตัวอย่างบางส่วน:

  #
  # SSH tracking sample
  #
  #################################################################################
  iptables -X IN_SSH
  iptables -N IN_SSH
  iptables -A IN_SSH -m set --match-set net_blacklist src -p tcp -j REJECT
  iptables -A IN_SSH -m set --match-set net_whitelist src -p tcp --match limit --limit 5/second -j LOG --log-prefix whitelist_de_prefix
  iptables -A IN_SSH -m set --match-set net_whitelist src -p tcp -j ACCEPT
  # filter update
  iptables -A IN_SSH -m recent --name sshbf --set --rsource
  # connlimit
  iptables -A IN_SSH -m connlimit --connlimit-above 4 --match limit --limit 5/second -j LOG --log-prefix ssh_connlimit_per_ip_above_4
  iptables -A IN_SSH -m connlimit --connlimit-above 4 -j REJECT
  # filter
  iptables -A IN_SSH -m recent --name sshbf --rttl --rcheck --hitcount 13 --seconds 60 --match limit --limit 5/second -j LOG --log-prefix ssh_filtered_13in60sec
  iptables -A IN_SSH -m recent --name sshbf --rttl --rcheck --hitcount 13 --seconds 60 -j REJECT
  iptables -A IN_SSH -j ACCEPT

iptables -A FORWARD -p tcp --dport ssh --syn --jump IN_SSH
# iptables -A INPUT -p tcp --dport ssh --syn --jump IN_SSH

ผลลัพธ์ของข้อความบันทึกของคุณสามารถรวมกับ fail2ban คุณสามารถใช้มันสำหรับกฎอินพุตได้เช่นกัน

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