วิธีรักษาความปลอดภัยเซิร์ฟเวอร์ Linux ของคุณด้วย fail2ban
เผยแพร่แล้ว: 2022-01-29
ด้วย fail2ban
คอมพิวเตอร์ Linux ของคุณจะบล็อกที่อยู่ IP ที่มีความล้มเหลวในการเชื่อมต่อมากเกินไปโดยอัตโนมัติ เป็นการรักษาความปลอดภัยที่ควบคุมตนเอง! เราจะแสดงวิธีใช้งานให้คุณดู
ความปลอดภัย ความปลอดภัย ความปลอดภัย
ดัชเชสแห่งวินด์เซอร์ วาลลิส ซิมป์สัน เคยกล่าวไว้ว่า "คุณไม่สามารถรวยหรือผอมเกินไปได้" เราได้อัปเดตสิ่งนี้สำหรับโลกสมัยใหม่ที่เชื่อมต่อถึงกัน: คุณไม่สามารถระมัดระวังหรือปลอดภัยเกินไปได้
หากคอมพิวเตอร์ของคุณยอมรับคำขอเชื่อมต่อขาเข้า เช่น การเชื่อมต่อ Secure Shell (SSH) หรือทำหน้าที่เป็นเว็บหรือเซิร์ฟเวอร์อีเมล คุณต้องปกป้องคอมพิวเตอร์จากการโจมตีแบบเดรัจฉานและผู้คาดเดารหัสผ่าน
ในการดำเนินการดังกล่าว คุณจะต้องตรวจสอบคำขอเชื่อมต่อที่ไม่สามารถเข้าสู่บัญชีได้ หากพวกเขาไม่ผ่านการตรวจสอบสิทธิ์ซ้ำแล้วซ้ำเล่าภายในระยะเวลาสั้นๆ พวกเขาควรถูกแบนจากการพยายามต่อไป
วิธีเดียวที่สามารถทำได้ในทางปฏิบัติคือทำให้กระบวนการทั้งหมดเป็นไปโดยอัตโนมัติ ด้วยการกำหนดค่าที่เรียบง่ายเล็กน้อย fail2ban
จะจัดการการตรวจสอบ การแบน และการเลิกแบนสำหรับคุณ
fail2ban
รวมเข้ากับไฟร์วอลล์ลินุกซ์ iptables
มันบังคับใช้การแบนที่อยู่ IP ที่น่าสงสัยโดยเพิ่มกฎให้กับไฟร์วอลล์ เพื่อให้คำอธิบายนี้ไม่กระจัดกระจาย เรากำลังใช้ iptables
กับชุดกฎที่ว่างเปล่า
แน่นอน หากคุณกังวลเกี่ยวกับความปลอดภัย คุณอาจมีไฟร์วอลล์ที่กำหนดค่าด้วยชุดกฎที่มีข้อมูลเพียงพอ fail2ban
เพิ่มและลบกฎของตัวเองเท่านั้น ฟังก์ชันไฟร์วอลล์ปกติของคุณจะไม่ถูกแตะต้อง
เราสามารถเห็นชุดกฎที่ว่างเปล่าของเราโดยใช้คำสั่งนี้:
sudo iptables -L
ที่เกี่ยวข้อง: คู่มือเริ่มต้นสำหรับ iptables, Linux Firewall
การติดตั้ง fail2ban
การติดตั้ง fail2ban
นั้นง่ายสำหรับการกระจายทั้งหมดที่เราใช้ในการวิจัยบทความนี้ บน Ubuntu 20.04 คำสั่งจะเป็นดังนี้:
sudo apt-get ติดตั้ง fail2ban
บน Fedora 32 พิมพ์:
sudo dnf ติดตั้ง fail2ban
บน Manjaro 20.0.1 เราใช้ pacman
:
sudo pacman -Sy fail2ban
การกำหนดค่า fail2ban
การติดตั้ง fail2ban
มีไฟล์การกำหนดค่าเริ่มต้นที่เรียกว่า jail.conf ไฟล์นี้จะถูกเขียนทับเมื่อมีการอัปเกรด fail2ban
ดังนั้นเราจะสูญเสียการเปลี่ยนแปลงของเราหากเราทำการปรับแต่งไฟล์นี้
เราจะคัดลอกไฟล์ jail.conf ไปยังไฟล์ชื่อ jail.local แทน การเปลี่ยนแปลงการกำหนดค่าของเราใน jail.local จะคงอยู่ตลอดการอัปเกรด ไฟล์ทั้งสองจะถูกอ่านโดยอัตโนมัติโดย fail2ban
นี่คือวิธีการคัดลอกไฟล์:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
ตอนนี้เปิดไฟล์ในตัวแก้ไขที่คุณชื่นชอบ เราจะใช้ gedit
:
sudo gedit /etc/fail2ban/jail.local
เราจะค้นหาสองส่วนในไฟล์: [ค่าเริ่มต้น] และ [sshd] ดูแลเพื่อค้นหาส่วนจริงแม้ว่า ป้ายกำกับเหล่านั้นยังปรากฏใกล้กับด้านบนสุดในส่วนที่อธิบายด้วย แต่นั่นไม่ใช่สิ่งที่เราต้องการ
คุณจะพบส่วน [ค่าเริ่มต้น] อยู่ที่แถวๆ 40 ซึ่งเป็นส่วนยาวที่มีความคิดเห็นและคำอธิบายมากมาย
เลื่อนลงไปประมาณบรรทัดที่ 90 และคุณจะพบกับการตั้งค่าสี่อย่างต่อไปนี้ที่คุณต้องรู้:
- ละเว้น: รายการที่อนุญาตพิเศษของที่อยู่ IP ที่จะไม่มีวันถูกแบน พวกเขามีการ์ด Get Out of Jail Free ถาวร ที่อยู่ IP localhost (
127.0.0.1
) อยู่ในรายการโดยค่าเริ่มต้น พร้อมกับ IPv6 ที่เทียบเท่า (::1
) หากมีที่อยู่ IP อื่นๆ ที่คุณรู้ว่าไม่ควรถูกแบน ให้เพิ่มในรายการนี้และเว้นช่องว่างระหว่างแต่ละที่อยู่ - bantime: ระยะเวลาที่ที่อยู่ IP ถูกแบน (ตัว "m" หมายถึงนาที) หากคุณพิมพ์ค่าโดยไม่มี “m” หรือ “h” (เป็นชั่วโมง) จะถือว่าเป็นวินาที ค่า -1 จะแบนที่อยู่ IP อย่างถาวร ระวังอย่าปิดกั้นตัวเองอย่างถาวร
- findtime: ระยะเวลาที่พยายามเชื่อมต่อที่ล้มเหลวหลายครั้งเกินไปจะทำให้ที่อยู่ IP ถูกแบน
- maxretry: ค่าสำหรับ "ความพยายามที่ล้มเหลวมากเกินไป"
หากการเชื่อมต่อจากที่อยู่ IP เดียวกันทำให้ maxretry
ล้มเหลวในการเชื่อมต่อภายในช่วงเวลาที่ findtime
จะถูกแบนในช่วง bantime
ข้อยกเว้นเพียงอย่างเดียวคือที่อยู่ IP ในรายการ ignoreip
fail2ban
ใส่ที่อยู่ IP ไว้ในคุกตามระยะเวลาที่กำหนด fail2ban
รองรับคุกที่แตกต่างกันมากมาย และแต่ละอันแสดงถึงการตั้งค่าที่ใช้กับประเภทการเชื่อมต่อเดียว ซึ่งจะทำให้คุณมีการตั้งค่าที่แตกต่างกันสำหรับประเภทการเชื่อมต่อต่างๆ หรือคุณสามารถให้มอนิเตอร์ fail2ban
เฉพาะชุดประเภทการเชื่อมต่อที่เลือก
คุณอาจเดาได้จากชื่อส่วน [ค่าเริ่มต้น] แต่การตั้งค่าที่เราตรวจสอบเป็นค่าเริ่มต้น ตอนนี้ มาดูการตั้งค่าสำหรับการคุมขัง SSH
ที่เกี่ยวข้อง: วิธีแก้ไขไฟล์ข้อความแบบกราฟิกบน Linux ด้วย gedit
การกำหนดค่าคุก
Jails ให้คุณย้ายประเภทการเชื่อมต่อเข้าและออกจากการตรวจสอบ fail2ban's
หากการตั้งค่าเริ่มต้นไม่ตรงกับที่คุณต้องการใช้กับคุก คุณสามารถตั้งค่าเฉพาะสำหรับ bantime
, findtime
และ maxretry
เลื่อนลงไปที่บรรทัดที่ 280 แล้วคุณจะเห็นส่วน [sshd]
นี่คือที่ที่คุณสามารถตั้งค่าสำหรับคุกการเชื่อมต่อ SSH หากต้องการรวมคุกนี้ในการเฝ้าติดตามและแบน เราต้องพิมพ์บรรทัดต่อไปนี้:
เปิดใช้งาน = จริง
เรายังพิมพ์บรรทัดนี้:
maxretry = 3
การตั้งค่าเริ่มต้นคือห้า แต่เราต้องการให้ระมัดระวังในการเชื่อมต่อ SSH ให้มากขึ้น เราลดลงเหลือสาม จากนั้นบันทึกและปิดไฟล์
เราได้เพิ่มการคุมขังนี้ในการตรวจสอบ fail2ban's
และแทนที่การตั้งค่าเริ่มต้นอย่างใดอย่างหนึ่ง คุกสามารถใช้การตั้งค่าเริ่มต้นและการตั้งค่าเฉพาะของคุกร่วมกันได้
เปิดใช้งาน fail2ban
จนถึงตอนนี้ เราได้ติดตั้ง fail2ban
และกำหนดค่าแล้ว ตอนนี้ เราต้องเปิดใช้งานเพื่อให้ทำงานเป็นบริการเริ่มต้นอัตโนมัติ จากนั้นเราต้องทดสอบเพื่อให้แน่ใจว่าใช้งานได้ตามที่คาดไว้
ในการเปิดใช้งาน fail2ban
เป็นบริการ เราใช้คำสั่ง systemctl
:

sudo systemctl เปิดใช้งาน fail2ban
เรายังใช้เพื่อเริ่มบริการ:
sudo systemctl start fail2ban
เราสามารถตรวจสอบสถานะของบริการโดยใช้ systemctl
ได้เช่นกัน:
สถานะ sudo systemctl fail2ban.service
ทุกอย่างดูดี—เรามีไฟเขียว ทุกอย่างก็เรียบร้อย
มาดูกันว่า fail2ban
เห็นด้วยหรือไม่:
sudo fail2ban- สถานะไคลเอนต์
สิ่งนี้สะท้อนถึงสิ่งที่เราตั้งขึ้น เราได้เปิดใช้งานคุกเดียวชื่อ [sshd] หากเรารวมชื่อคุกไว้ในคำสั่งก่อนหน้านี้ เราสามารถเจาะลึกลงไปได้:
sudo fail2ban- สถานะไคลเอ็นต์ sshd
แสดงรายการจำนวนความล้มเหลวและที่อยู่ IP ที่ถูกแบน แน่นอนว่าสถิติทั้งหมดเป็นศูนย์ในขณะนี้
การทดสอบคุกของเรา
ในคอมพิวเตอร์เครื่องอื่น เราจะทำการร้องขอการเชื่อมต่อ SSH ไปยังเครื่องทดสอบของเราและตั้งใจพิมพ์รหัสผ่านผิด คุณได้รับรหัสผ่านสามครั้งในการเชื่อมต่อแต่ละครั้ง
ค่า maxretry
จะทริกเกอร์หลังจากพยายามเชื่อมต่อล้มเหลวสามครั้ง ไม่ใช่พยายามใช้รหัสผ่านล้มเหลวสามครั้ง ดังนั้น เราต้องพิมพ์รหัสผ่านที่ไม่ถูกต้องสามครั้งเพื่อไม่ให้การเชื่อมต่อล้มเหลว
จากนั้นเราจะพยายามเชื่อมต่ออีกครั้งและพิมพ์รหัสผ่านไม่ถูกต้องอีกสามครั้ง การพยายามใช้รหัสผ่านที่ไม่ถูกต้องครั้งแรกของคำขอเชื่อมต่อที่สามควรทริกเกอร์ fail2ban.
หลังจากรหัสผ่านไม่ถูกต้องครั้งแรกในคำขอเชื่อมต่อครั้งที่สาม เราไม่ได้รับการตอบกลับจากเครื่องระยะไกล เราไม่ได้รับคำอธิบายใดๆ เราเพิ่งได้รับไหล่เย็น
คุณต้องกด Ctrl+C เพื่อกลับไปที่พรอมต์คำสั่ง หากเราลองอีกครั้ง เราจะได้คำตอบที่ต่างออกไป:
ssh [email protected]
ก่อนหน้านี้ ข้อความแสดงข้อผิดพลาดคือ "การอนุญาตถูกปฏิเสธ" คราวนี้ การเชื่อมต่อถูกปฏิเสธทันที เราเป็นคนไม่มีพรสวรรค์ เราถูกห้าม
ดูรายละเอียดของคุก [sshd] อีกครั้ง:
sudo fail2ban- สถานะไคลเอ็นต์ sshd
มีความล้มเหลวสามครั้งและหนึ่งที่อยู่ IP (192.168.4.25) ถูกแบน
ดังที่เราได้กล่าวไว้ก่อนหน้านี้ fail2ban
บังคับใช้การแบนโดยเพิ่มกฎให้กับชุดกฎของไฟร์วอลล์ ลองดูชุดกฎอีกครั้ง (ก่อนหน้านี้ว่างเปล่า):
sudo iptables -L
มีการเพิ่มกฎในนโยบาย INPUT โดยส่งทราฟฟิก SSH ไปยัง f2b-sshd
กฎในสายโซ่ f2b-sshd
ปฏิเสธการเชื่อมต่อ SSH จาก 192.168.4.25 เราไม่ได้เปลี่ยนการตั้งค่าเริ่มต้นสำหรับ bantime
ดังนั้นใน 10 นาที ที่อยู่ IP นั้นจะถูกยกเลิกและสามารถส่งคำขอเชื่อมต่อใหม่ได้
หากคุณกำหนดระยะเวลาการแบนที่นานขึ้น (เช่น หลายชั่วโมง) แต่ต้องการให้ที่อยู่ IP ทำการร้องขอการเชื่อมต่ออื่นเร็วกว่านี้ คุณสามารถรอรับโทษก่อนได้
เราพิมพ์ข้อมูลต่อไปนี้เพื่อทำสิ่งนี้:
sudo fail2ban-client ตั้งค่า sshd unbanip 192.168.5.25
บนคอมพิวเตอร์ระยะไกลของเรา หากเราทำการร้องขอการเชื่อมต่อ SSH อื่นและพิมพ์รหัสผ่านที่ถูกต้อง เราจะได้รับอนุญาตให้เชื่อมต่อ:
ssh [email protected]
เรียบง่ายและมีประสิทธิภาพ
ความเรียบง่ายมักจะดีกว่า และ fail2ban
เป็นวิธีการแก้ปัญหาที่ซับซ้อน ใช้การกำหนดค่าเพียงเล็กน้อยและแทบไม่มีค่าใช้จ่ายในการดำเนินการใดๆ ทั้งสิ้น ทั้งกับคุณหรือคอมพิวเตอร์ของคุณ
คำสั่งลินุกซ์ | ||
ไฟล์ | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · เข้าร่วม · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · ดู · strings · พิมพ์ · เปลี่ยนชื่อ · zip · unzip · เมานต์ · umount · ติดตั้ง · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · แพทช์ · แปลง · rclone · ฉีก · srm | |
กระบวนการ | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · หมดเวลา · ผนัง · ใช่ · ฆ่า · หลับ · sudo · su · เวลา · groupadd · usermod · กลุ่ม · lshw · ปิดระบบ · รีบูต · หยุด · poweroff · passwd · lscpu · crontab · วันที่ · bg · fg | |
ระบบเครือข่าย | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw |
ที่เกี่ยวข้อง: แล็ปท็อป Linux ที่ดีที่สุดสำหรับนักพัฒนาและผู้ที่ชื่นชอบ