ติดตั้ง fail2ban บน ubuntu 16.04 server

จาก Wiki Opensource

บันทึกนี้ปรับปรุงล่าสุดเมื่อวันที่ 12-07-2562
ดูแลโดย WIBOON

  • เพื่อใช้ในการตรวจสอบว่ามีการพยายามเข้าถึง port ต่าง ๆ เพื่อการโจมตีหรือเดารหัสผ่าน
  • ตัวอย่างนี้ เปิดการตรวจสอบเพียงแค่ sshd อย่างเดียว สำหรับ service อื่น ๆ ยังไม่ได้แนะนำ
  • enabled = true หมายถึง เปิดการตรวจสอบหากพบให้ banned IP นั้น
  • bantime = 3600 หมายถึง ให้ banned IP เป็นเวลา 3600 วินาที
  • maxretry = 5 หมายถึง ให้ตรวจสอบว่ามีการทำผิดปรกติซ้ำ ๆ 5 ครั้งติดต่อกัน (ค่า default)
  • fail2ban จะถูกสั่งทำงานเมื่อเปิดเครื่องทุกครั้งอัตโนมัติ


1.ติดตั้งโปรแกรม

mama@ubuntu:~$ sudo apt-get install fail2ban
The following NEW packages will be installed:
  fail2ban libpython-stdlib libpython2.7-minimal libpython2.7-stdlib python
  python-minimal python2.7 python2.7-minimal python3-pyinotify whois


2.ให้ใช้ไฟล์ jail.local ในการตั้งค่า (ตามที่ manual บอกไว้)

mama@ubuntu:~$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

หรือสร้างไฟล์ใหม่ว่างเปล่าชื่อ jail.local แล้วใส่เฉพาะที่เราต้องการแก้ไขหรือเปลี่ยนค่าใน jail.conf แต่ไม่ต้องไปแก้ไขไฟล์ jail.conf โดยตรง เช่น สร้างไฟล์สำหรับเฉพาะ sshd ก็ทำแค่นี้

[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.2.0/23

#
# SSH servers
#
[sshd]
enabled = true
bantime  = 3600
maxretry = 6
port    = ssh
logpath = %(sshd_log)s

และเมื่อมี service อื่น ๆ ก็นำมาเติมลงในไฟล์ jail.local อย่างนี้จะทำให้การ upgrade version ทำได้ง่ายขึ้น (เค้าว่ามา)

3.เข้าไปเพื่อแก้ไขค่า ตัวอย่างนี้สำหรับ sshd
แก้ไขโดยไปที่ประมาณบรรทัดที่ 217 ใต้หัวข้อ [sshd] ให้เพิ่ม
enabled = true
bantime = 3600
เป็นแบบนี้

mama@ubuntu:~$ sudo vi /etc/fail2ban/jail.local
enabled = true
bantime = 3600
port    = ssh
logpath = %(sshd_log)s


4.สั่งให้ fail2ban ทำงาน

mama@ubuntu:~$ sudo systemctl start fail2ban.service


5.ตรวจสอบสถานะ

mama@ubuntu:~$ sudo systemctl status fail2ban.service
- fail2ban.service - Fail2Ban Service
   Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2016-08-11 13:26:16 ICT; 2h 15min ago
     Docs: man:fail2ban(1)
  Process: 2949 ExecStop=/usr/bin/fail2ban-client stop (code=exited, status=0/SUCCESS)
  Process: 2994 ExecStart=/usr/bin/fail2ban-client -x start (code=exited, status=0/SUCCESS)
 Main PID: 2999 (fail2ban-server)
    Tasks: 3
   Memory: 11.3M
      CPU: 1.199s
   CGroup: /system.slice/fail2ban.service
           └─2999 /usr/bin/python3 /usr/bin/fail2ban-server -s /var/run/fail2ban/fail2ban.sock -p /var/run/fail2ban/fail2ban.pid -x -b

Aug 11 13:26:16 ubuntu systemd[1]: Starting Fail2Ban Service...
Aug 11 13:26:16 ubuntu fail2ban-client[2994]: 2016-08-11 13:26:16,337 fail2ban.server         [2997]: INFO    Starting Fail2ban v0.9.3
Aug 11 13:26:16 ubuntu fail2ban-client[2994]: 2016-08-11 13:26:16,337 fail2ban.server         [2997]: INFO    Starting in daemon mode


6.จะเกิด log ไว้ตรวจสอบที่นี่

mama@ubuntu:~$ tail -f /var/log/fail2ban.log
2016-08-11 13:26:16,379 fail2ban.filter         [2999]: INFO    Set jail log file encoding to UTF-8
2016-08-11 13:26:16,381 fail2ban.jail           [2999]: INFO    Initiated 'pyinotify' backend
2016-08-11 13:26:16,417 fail2ban.filter         [2999]: INFO    Added logfile = /var/log/auth.log
2016-08-11 13:26:16,423 fail2ban.filter         [2999]: INFO    Set maxRetry = 5
2016-08-11 13:26:16,423 fail2ban.filter         [2999]: INFO    Set findtime = 600
2016-08-11 13:26:16,423 fail2ban.filter         [2999]: INFO    Set jail log file encoding to UTF-8
2016-08-11 13:26:16,424 fail2ban.actions        [2999]: INFO    Set banTime = 3600
2016-08-11 13:26:16,424 fail2ban.filter         [2999]: INFO    Set maxlines = 10
2016-08-11 13:26:16,463 fail2ban.server         [2999]: INFO    Jail sshd is not a JournalFilter instance
2016-08-11 13:26:16,467 fail2ban.jail           [2999]: INFO    Jail 'sshd' started


7.ใช้คำสั่งตรวจสอบดูว่ามีการ login ผิด ๆ บ่อย ๆ บ้างหรือไม่ เพื่อเทียบกับที่ fail2ban ได้ banned IP นั้นไป
mama@ubuntu:~$ grep Failed /var/log/auth.log

วิธียกเว้นไม่เช็คบางเครื่อง
ตัวอย่างเช่น ไม่เช็คเครื่องที่มี IP คือ 10.0.100.4 หรือ บางเน็ต เช่น 10.0.200.x เป็นต้น
ที่ไฟล์ /etc/fail2ban/jail.local ประมาณบรรทัดที่ 50
เดิม
ignoreip = 127.0.0.1/8
ให้แก้ไขเพิ่ม IP ต่อท้าย

ignoreip = 127.0.0.1/8  10.0.100.4  10.0.200.0/24


ขั้นตอนข้างล่างนี้ เป็นการตรวจสอบสถานะว่ามีการแบน IP และสามารถสั่งให้ส่งอีเมลแจ้งได้ แต่อาจได้รับเยอะมากนะ โปรดตัดสินใจเอง
หมายเหตุ server ต้องพร้อมมี Mail Transfer Agent ติดตั้งแล้ว เช่น ติดตั้ง postfix แล้ว เป็นต้น

8.ตั้งค่าให้ส่งอีเมลแจ้งด้วย (ถ้าต้องการ)

mama@ubuntu:~$ sudo vi /etc/fail2ban/jail.local

บรรทัดที่ 129
ให้ระบุชื่ออีเมลแอดเดรสที่จะรับและให้ระบุชื่ออีเมลแอดเดรสของผู้ส่ง เช่น

destemail = username@domain
sender = root@localhost.yourdomain

แต่หากไม่ต้องการส่งออกไปเมลเซิร์ฟเวอร์อื่น ๆ ทันที ก็ให้ตั้ง destemail กับ sender เป็นค่าเดียวกัน คือ root@localhost.yourdomain
โดยให้เปลี่ยนคำว่า localhost.yourdomain ให้เป็นชื่อเซิร์ฟเวอร์และโดเมนจริงของหน่วยงานที่คุณใช้งาน

หากเก็บอีเมลไว้ที่ local user ชื่อ root ตรวจสอบได้ด้วยคำสั่งนี้

root@ubuntu:~# grep -A1 "\[Fail2Ban\] .* banned" /var/mail/root
Subject: [Fail2Ban] wp-login: banned 91.200.12.83 from ubuntu
Date: Sun, 28 Aug 2016 01:38:52 +0700


บรรทัดที่ 205
เดิม
action = %(action_)s
เปลี่ยนเป็น

action = %(action_mw)s


9.รีสตาร์ท fail2ban และตรวจสอบ

mama@ubuntu:~$ sudo systemctl restart fail2ban.service
mama@ubuntu:~$ sudo systemctl status fail2ban.service


10.ทดสอบจากเครื่อง 10.168.1.22 ลอง ssh เข้ามาแบบคีย์รหัสผ่านผิดซ้ำ ๆ

11.กลับมาที่เครื่องที่ติดตั้ง fail2ban ไว้ เปิดดู log file

mama@ubuntu:~$ tail /var/log/fail2ban.log
2016-08-17 14:38:41,695 fail2ban.filter         [5227]: INFO    Set maxlines = 10
2016-08-17 14:38:41,735 fail2ban.server         [5227]: INFO    Jail sshd is not a JournalFilter instance
2016-08-17 14:38:41,739 fail2ban.jail           [5227]: INFO    Jail 'sshd' started
2016-08-17 14:41:00,805 fail2ban.filter         [5227]: INFO    [sshd] Found 10.168.1.22
2016-08-17 14:41:02,228 fail2ban.filter         [5227]: INFO    [sshd] Found 10.168.1.22
2016-08-17 14:41:12,100 fail2ban.filter         [5227]: INFO    [sshd] Found 10.168.1.22
2016-08-17 14:41:13,502 fail2ban.filter         [5227]: INFO    [sshd] Found 10.168.1.22
2016-08-17 14:41:22,280 fail2ban.filter         [5227]: INFO    [sshd] Found 10.168.1.22
2016-08-17 14:41:22,986 fail2ban.actions        [5227]: NOTICE  [sshd] Ban 10.168.1.22
2016-08-17 14:41:24,392 fail2ban.filter         [5227]: INFO    [sshd] Found 10.168.1.22


ผลลัพธ์ log file เมื่อ ssh จาก IP ที่ได้ใส่ไว้ใน ignoreip

2016-08-17 14:49:29,500 fail2ban.filter         [5227]: INFO    [sshd] Ignore 10.0.100.4 by ip


12.ตรวจสอบสถานะว่ามีอะไรถูกแบน

mama@ubuntu:~$ sudo fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:   sshd


13.ตรวจสอบสถานะเฉพาะ sshd

mama@ubuntu:~$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     6
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   10.168.1.22
mama@ubuntu:~$


14.ตัวอย่างอีเมลที่ได้รับ หลังจาก fail2ban พบว่ามี IP ที่บุกรุก

[Fail2Ban] sshd: banned 10.168.1.22 from ubuntu
Fail2Ban <fail2ban@localhost.yourdomain>
2:51 PM (0 minutes ago)
Hi,
The IP 10.168.1.22 has just been banned by Fail2Ban after
5 attempts against sshd.

Here is more information about 10.168.2.22 :
#
# ARIN WHOIS data and services are subject to the Terms of Use
#
# The following results may also be obtained via:
# https://whois.arin.net/rest/nets;q=10.168.1.22?showDetails=true&showARIN=false&showNonArinTopLevelNet=false&ext=netref2
#


เมื่อ fail2ban start หรือ stop จะมีอีเมลส่งให้ด้วย
[Fail2Ban] sshd: started on ubuntu
หรือ
[Fail2Ban] sshd: stopped on ubuntu


ผลลัพธ์จากการใช้ fail2ban จะมี iptables rules ดังนี้

root@ubuntu:/etc/fail2ban# service fail2ban start
root@ubuntu:/etc/fail2ban# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
f2b-sshd   tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain f2b-sshd (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

และเมื่อมี ip โดน Ban ด้วย sshd จะมี iptables rule เพิ่มดังนี้

root@ubuntu:~# iptables -n -L f2b-sshd
Chain f2b-sshd (1 references)
target     prot opt source               destination
REJECT     all  --  192.168.6.19         0.0.0.0/0            reject-with icmp-port-unreachable
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

เพิ่มเติมให้สักนิดว่า หากเราใช้ fail2ban ร่วมกับ host firewall คือ ufw หรือ shorewall มีขั้นตอนเพิ่มดังนี้
หากใช้ ufw ให้เพิ่มบรรทัด banaction = ufw ใน section [DEFAULT]

[DEFAULT]
...
banaction = ufw

และตรวจสอบด้วยว่าจะมี config อยู่ที่ /etc/fail2ban/action.d/ufw.conf

หากใช้ shorewall ให้เพิ่มบรรทัด banaction = shorewall ใน section [DEFAULT]

[DEFAULT]
...
banaction = shorewall

และตรวจสอบด้วยว่าจะมี config อยู่ที่ /etc/fail2ban/action.d/shorewall.conf

ดังนั้นหากใช้ร่วมกับ host firewall ตัวใด ก็จะมี iptables rules แบบนั้น จะไม่มี rule ที่ขึ้นต้นด้วย f2b-xxx

ตัวอย่าง IP 192.168.192.150 ถูก block จะอยู่ใน chain ชื่อ ufw-user-input

Chain ufw-user-input (1 references)
target     prot opt source               destination
REJECT     all  --  192.168.192.150      0.0.0.0/0            reject-with icmp-port-unreachable
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:5666
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:21
ACCEPT     tcp  --  192.168.0.0/16       0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  172.16.0.0/12        0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  10.0.0.0/8           0.0.0.0/0            tcp dpt:22
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:161
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:1022


References:
1.Intro to fail2ban with ufw https://zaiste.net/intro_fail2ban_with_ufw/
2.fail2ban with Shorewall http://rsabalburo.blogspot.com/2014/07/fail2ban-with-shorewall.html