CHIA SẺ:

Để kết nối với VPS chúng ta thường sử dụng port 22. Đây chính là lỗ hổng chết người các hacker có thể sử dụng để dò tìm password đăng nhập vào VPS của bạn.

Một biện pháp hạn chế việc này đó là thay đổi port SSH từ 22 sang một port khác (HocVPS Script đã tự động đổi sang port 2222 khi cài đặt). Tuy nhiên, việc này chỉ hạn chế một chút thôi vì nếu muốn, hacker có thể scan open port để biết được bạn đang sử dụng port nào để tấn công tiếp.

Giải pháp để chúng ta chấm dứt vấn đề này đó là sử dụng một công cụ tự động block IP khi VPS bị tấn công, đó là Fail2Ban. Hôm nay, mình sẽ giới thiệu cách hướng dẫn và cài đặt trong bài này.

Fail2Ban là một ứng dụng chạy nền theo dõi log file để phát hiện những địa chỉ IP đăng nhập sai password SSH nhiều lần. Sau đó, Fail2Ban sử dụng iptable firewall rules để block ngay địa chỉ IP với một khoảng thời gian định trước.

HocVPS Script đặt vấn đề bảo mật và sự đơn giản lên hàng đầu, do đó khi sử dụng bạn không cần phải quan tâm gì nữa nhé. Yên tâm phát triển website thôi.

Cài đặt Fail2Ban

Chúng ta sẽ cài đặt Fail2Ban thông qua Repo EPEL

yum install epel-release
yum install fail2ban

Cấu hình Fail2Ban

Sau khi cài đặt xong, bạn mở file cấu hình của Fail2Ban lên sẽ thấy một số thông số như sau:

nano /etc/fail2ban/jail.conf
[DEFAULT]

# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
# ban a host which matches an address in this list. Several addresses can be
# defined using space separator.
ignoreip = 127.0.0.1

# "bantime" is the number of seconds that a host is banned.
bantime = 600

# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime = 600

# "maxretry" is the number of failures before a host get banned.
maxretry = 3

Trong đó

  • ignoreip: không block những địa chỉ này, thường địa chỉ IP ở VN là địa chỉ động, nên chúng ta không sử dụng được option này.
  • bantime: khoảng thời gian (giây) block IP
  • findtime: khoảng thời gian (giây) một IP phải login thành công
  • maxretry: số lần login false tối đa

Cấu hình mặc định của Fail2Ban khá là ổn rồi, chúng ta không cần thiết phải cập nhật mà đến bước tiếp theo.

Cấu hình Fail2Ban bảo vệ SSH

Tạo file cấu hình

nano /etc/fail2ban/jail.local

Và sử dụng nội dung sau:

[ssh-iptables]

enabled  = true
filter   = sshd
action   = iptables[name=SSH, port=ssh, protocol=tcp]
#           sendmail-whois[name=SSH, dest=root, sender=fail2ban@example.com]
logpath  = /var/log/secure
maxretry = 2
bantime = 3600

Trong đó

  • enabled: kích hoạt bảo vệ, nếu muốn tắt bạn hãy chuyển thành false
  • filter: giữ mặc định để sử dụng file cấu hình /etc/fail2ban/filter.d/sshd.conf
  • action: fail2ban sẽ ban địa chỉ IP nếu match filter /etc/fail2ban/action.d/iptables.conf. Nếu bạn đã thay đổi port ssh, sửa đoạn port=ssh bằng port mới, ví dụ port=2222
  • logpath: đường dẫn file log fail2ban sử dụng để theo dõi
  • maxretry: số lần login false tối đa

Khởi động Service Fail2Ban

chkconfig --level 23 fail2ban on
service fail2ban start

Cuối cùng check lại iptables xem đã có rule của Fail2Ban chưa:

iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
f2b-SSH tcp -- anywhere anywhere tcp dpt:EtherNet/IP-1

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain f2b-SSH (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere

Theo dõi SSH login

– Bạn có thể sử dụng lệnh sau để biết được VPS/Server đã từng bị tấn công SSH chưa:

cat /var/log/secure | grep 'Failed password' | sort | uniq -c

Kết quả thường sẽ là như bên dưới, đã từng có rất nhiều đợt tấn công:

 1 Aug 19 14:18:42 vultr sshd[24424]: Failed password for root from 61.160.223.66 port 1283 ssh2
 1 Aug 19 14:18:45 vultr sshd[24424]: Failed password for root from 61.160.223.66 port 1283 ssh2
 1 Aug 19 14:18:47 vultr sshd[24424]: Failed password for root from 61.160.223.66 port 1283 ssh2
 1 Aug 19 14:18:57 vultr sshd[24426]: Failed password for root from 61.160.223.66 port 1388 ssh2
 1 Aug 19 14:18:59 vultr sshd[24426]: Failed password for root from 61.160.223.66 port 1388 ssh2
 1 Aug 19 14:19:02 vultr sshd[24426]: Failed password for root from 61.160.223.66 port 1388 ssh2
 1 Aug 19 14:19:03 vultr sshd[24426]: Failed password for root from 61.160.223.66 port 1388 ssh2
 1 Aug 19 14:19:05 vultr sshd[24426]: Failed password for root from 61.160.223.66 port 1388 ssh2
 1 Aug 19 14:19:08 vultr sshd[24485]: Failed password for root from 61.160.223.66 port 1536 ssh2
 1 Aug 19 14:19:10 vultr sshd[24485]: Failed password for root from 61.160.223.66 port 1536 ssh2
 1 Aug 19 14:19:12 vultr sshd[24485]: Failed password for root from 61.160.223.66 port 1536 ssh2
 1 Aug 19 14:19:14 vultr sshd[24485]: Failed password for root from 61.160.223.66 port 1536 ssh2
 1 Aug 19 14:19:16 vultr sshd[24485]: Failed password for root from 61.160.223.66 port 1536 ssh2
 1 Aug 19 14:19:29 vultr sshd[24490]: Failed password for root from 61.160.223.66 port 1629 ssh2
 1 Aug 19 14:19:31 vultr sshd[24490]: Failed password for root from 61.160.223.66 port 1629 ssh2
 1 Aug 19 14:19:34 vultr sshd[24490]: Failed password for root from 61.160.223.66 port 1629 ssh2
 1 Aug 19 14:19:36 vultr sshd[24490]: Failed password for root from 61.160.223.66 port 1629 ssh2
 1 Aug 19 14:19:38 vultr sshd[24490]: Failed password for root from 61.160.223.66 port 1629 ssh2

– Để xem IP đã bị banned bởi Fail2Ban bạn sử dụng lệnh:

fail2ban-client status ssh-iptables

Output trả về sẽ có dạng như thế này:

Status for the jail: ssh-iptables
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     3
|  `- File list:        /var/log/secure
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   103.207.68.41

– Để xóa IP khỏi danh sách banned, bạn sử dụng lệnh sau

fail2ban-client set ssh-iptables unbanip 103.207.68.41

Hi vọng với Fail2Ban, chúng ta sẽ không còn thấy thông báo login false mỗi lần login SSH nữa.

Mọi thông tin chi tiết, hãy tham khảo thêm trên trang chủ của Fail2Ban. Chúc bạn thành công.

Nếu bạn sử dụng dịch vụ cài đặt VPS của Học VPS, sẽ được tự động cấu hình bảo mật VPS rồi nhé.

56 Comments

  1. Khoiwr 23

    Chào Luân!

    Lời đầu tiên cảm ơn Luân đã có bài viết hay này.
    Mình xin hỏi. Minh lỡ tay xóa mất thư mục fail2ban trên Filezilla. Giờ làm sao để cài đặt lại vậy Luân?

    Trân Trọng!

    1. Luân Trần Admin

      Bạn hãy xóa Fail2Ban với lệnh yum remove fail2ban rồi cài đặt lại nhé.

      1. Lê Minh Tấn Khởi 23

        Thanks Luân đã làm thành công.

        Và xin hỏi luân mình chạy lệnh ” cat /var/log/secure | grep ‘Failed password’ | sort | uniq -c ”

        Kết quả:

        1 Aug 23 19:34:49 CENTOS65MIN-001 sshd[2537]: Failed password for root from 45.114.11.22 port 50298 ssh2

        Như vậy là đã từng bị tấn công hả Luân?

          1. Lê Minh Tấn Khởi 23

            Thanks Luân nha. May mà mình theo dõi bài viết của Luân thường xuyên. Mình xem kỹ thì hôm nay mới bị. hihi thanks Luân nhiều

  2. Luân Trần Admin

    Tình hình là mình tiết kiệm được hơn 130MB RAM sau khi tiến hành bảo vệ SSH, block thẳng tay IP dò pass login 😀

    1. Vector 4

      Bài viết rất hay, mấy ngày gần đây đọc log file secure thấy có IP từ HK brute force liên tục trong khoảng thời gian ngắn khiến rất nhiều file log secure được tạo ra , có vẻ là đang dùng tools. em đã cài Fail2Ban hy vọng có thể tiết kiệm được nhiều dung lượng!. Anh có thể cho e biết cách xem những IP mà F2B banned ở đâu không? để em kiểm tra xem F2B có làm việc không đó mà 😀

      1. Luân Trần Admin

        Mình mới bổ sung bài viết nhé, bạn tham khảo lệnh này: iptables -L -n

        1. Vector 4

          Mặc dù e vẫn để port 22 nhưng các brutter vẫn chăm chăm brute vào port 5 số.
          Nhìn chung tác dụng hơn mong muốn, trưa nay set bantime 1 tiếng thì xem log ban đúng 1 tiếng, giờ để ban 1 ngày là nuột…

          1. Luân Trần Admin

            Ngay đoạn đầu phần Cấu hình Fail2Ban có bantime đó bạn, tính bằng giây – second nhé.

  3. thanhlt 6

    – Chương trình này update như thế nào trên ssh vậy bác Luân? Mình dùng hocvps Script ver 1.1 mới nhất thì khỏi đổi đoạn: port=ssh nhỉ?

    – Lệnh: cat /var/log/secure | grep ‘Failed password’ | sort | uniq -c mình thấy báo login rất nhiều và liên tục vậy có nên đổi pass ko? Thân!

    1. Luân Trần Admin

      Pass SSH của bạn phức tạp ko sợ nó đoán ra thì ko cần đổi.

      Nếu bạn login SSH sử dụng port 22 thì để nguyên port=ssh, không cần đổi.

      1. thanhlt 6

        cập nhật Fail2Ban thế nào nếu có bản nâng cấp qua SSH cho VPS của mình vậy bác Luân? Thân!

        1. Luân Trần Admin

          Nó là một chương trình bình thường, nên bạn cập nhật qua yum:
          yum upgrade fail2ban

  4. canhdx 3

    Cho mình hỏi là nếu như mình dùng CentOs7 sau đó mình disable FirewallD đi và sử dụng Iptables thì các rules của thằng fail2ban này sinh ra hoạt động có ổn định không vậy bạn?

  5. thanhlt 6

    Bác luân cho mình hỏi, sao khi mình dùng lệnh trong SSH để check nhưng kết quả trả về lại không giống trong bài viết của bác:

    Ví dụ:

    iptables -L -n, thì xuất hiện các dòng:

    Chain INPUT (policy ACCEPT)
    target prot opt source destination

    Chain FORWARD (policy ACCEPT)
    target prot opt source destination

    Chain OUTPUT (policy ACCEPT)
    target prot opt source destination

    Và lệnh: iptables -L, cũng xuất hiện:

    Chain INPUT (policy ACCEPT)
    target prot opt source destination

    Chain FORWARD (policy ACCEPT)
    target prot opt source destination

    Chain OUTPUT (policy ACCEPT)
    target prot opt source destination

    Cảm ơn bác!9

        1. thanhlt 6

          Fail2ban mình kiểm tra lại đã hoạt động, sau khi mình reboot lại VPS. Hiện chưa ban Mình muốn hỏi thêm là, nội dung trong file jail.conf của mình là thế này chứ không như của bác chia sẻ:

          # “ignoreip” can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
          # ban a host which matches an address in this list. Several addresses can be
          # defined using space separator.
          ignoreip = 127.0.0.1/8

          # External command that will take an tagged arguments to ignore, e.g. ,
          # and return true if the IP is to be ignored. False otherwise.
          #
          # ignorecommand = /path/to/command
          ignorecommand =

          # “bantime” is the number of seconds that a host is banned.
          bantime = 600

          # A host is banned if it has generated “maxretry” during the last “findtime”
          # seconds.
          findtime = 600

          # “maxretry” is the number of failures before a host get banned.
          maxretry = 5

          – Mình để nguyên vẫn được chứ? có nên sửa lại như nội dung file bác đã chia sẻ ở trên không? Thân!

  6. Nguyen Tung 35

    Bác Luân cho em hỏi chút với.
    Phần mềm này so với CSF thì như thế nào ạ
    EM setup CSF rồi thì có nên setup thêm phần mềm này nữa không ạ

  7. Le Trung 3

    Sau khi cài xong và kiểm tra file log thì thấy thế này, có phải fail2ban bị lỗi ko bạn
    Sep 26 06:41:05 netstore fail2ban.action[13509]: ERROR iptables -D INPUT -p tcp –dport ssh -j f2b-SSH#012iptables -F f2b-SSH#012ipt ables -X f2b-SSH — stdout: ”
    Sep 26 06:41:05 netstore fail2ban.action[13509]: ERROR iptables -D INPUT -p tcp –dport ssh -j f2b-SSH#012iptables -F f2b-SSH#012ipt ables -X f2b-SSH — stderr: ”
    Sep 26 06:41:05 netstore fail2ban.action[13509]: ERROR iptables -D INPUT -p tcp –dport ssh -j f2b-SSH#012iptables -F f2b-SSH#012ipt ables -X f2b-SSH — returned 1

          1. Le Trung 3

            Đây là bảng iptables
            DROP all — 222.219.184.71 anywhere
            DROP all — 40.23.96.123.broad.zs.zj.dynamic.163data.com.cn anywhere
            DROP all — 182.100.67.113 anywhere
            DROP all — 23.246.244.126-static.reverse.softlayer.com anywhere
            DROP all — hotel564.startdedicated.net anywhere
            DROP all — webstage.ca anywhere
            DROP all — dsl-209-205-186-212.i-55.com anywhere
            DROP all — fixed-203-240-181.iusacell.net anywhere
            DROP all — 45.63.48.15.vultr.com anywhere
            DROP all — c1114054-25742.cloudatcost.com anywhere
            DROP all — hosted-by.ecatel.net anywhere
            DROP all — 42.123.82.179 anywhere
            DROP all — 182.73.199.250 anywhere
            DROP all — 183.37.251.173 anywhere
            DROP all — 176.101.237.123 anywhere
            DROP all — 117.79.146.58 anywhere
            DROP all — 206.191.151.226 anywhere
            DROP all — 61.139.5.22 anywhere
            DROP all — 123.142.167.44 anywhere
            DROP all — 1.255.87.242 anywhere
            DROP all — dns165.online.tj.cn anywhere

          2. Luân Trần Admin

            Có vẻ đang hoạt động bình thường và đã block vài địa chỉ IP rồi đó.

  8. tu vu 28

    Mình thấy kết bài bạn có câu:
    “Nếu bạn sử dụng dịch vụ cài đặt VPS của Học VPS, sẽ được tự động cấu hình bảo mật VPS rồi nhé.”
    – vậy mình có cần phải cài cái này để bảo mật nữa không bạn LT ơi

  9. thanh ho 5

    Hi ban,
    iptables -D f2b-SSH -s banned_ip -j DROP dùng lệnh này để gỡ bỏ IP bị ban thì nó báo lỗi : iptables v1.4.21: host/network `banned_ip’ not found
    Try `iptables -h’ or ‘iptables –help’ for more information.
    Mình thử delete rules trong chain của f2b-SSH nhưng restart fail2ban thì nó vẫn hiện lại IP bị ban.Vậy làm thế nào đây?

  10. dantruongx 1

    Bài viết có 2 chổ chưa chuẩn:

    Thứ nhất: iptables -L chỉ để liệt kệ rule và chain của iptables chứ ko phải để ktra IP đã bị banned, để kiểm tra ip banned các bạn vào /var/log/fail2ban.
    Thứ hai: việc chỉ sử dụng cấu hình mặc định của fail2ban thì chỉ có banned ip trong 1 thời gian nhất định, mà đa số các ip scan chắc chắn là chạy theo script nó sẽ quay lại scan các bạn nhiều và nhiều lần nữa, các bạn nên tìm hiểu kỹ cách tạo action trên f2b kết hợp với iptables và ipset để blog vĩnh viễn ip scan (đương nhiên là mình có thể unblock manual đc), sau này đỡ tốn tài nguyên banned rồi lại unbaned.
    Thân.

  11. Tommy Nguyen 28

    Muốn ban vĩnh viễn 1 IP thì làm sao hả Luân?
    Hiện tại mình thấy VPS đang bị tấn công bởi 1 IP từ Trung Quốc.

  12. Bảo 17

    VPS của mình bị scan nhiều quá
    Có tùy chỉnh nào giúp banned vĩnh viễn ip nếu login fail nhiều quá không Luân ?

    1. Luân Trần Admin

      Bạn tăng thời gian ban lên gấp 1.000 lần trong file /etc/fail2ban/jail.conf là xong 😀

  13. dung 9

    cho em hỏi.
    iptables -D f2b-SSH -s banned_ip -j DROP
    lệnh này xóa tất cả các ip band.
    còn nếu mình muốn xóa 1 IP trong dãy ip đó thì làm sao nhỉ

    1. Luân Trần Admin

      Cái này là thông báo website không truy cập được, dùng Google Apps chứ đâu liên quan đến Fail2ban nhỉ?

  14. Lữ Phú Hòa 17

    Tương tự áp dụng bảo vệ ftpserver luôn nhé.

    [vsftpd-iptables]

    enabled = true
    filter = vsftpd
    action = iptables[name=VSFTPD, port=21,
    # sendmail-whois[name=VSFTPD, dest=you@example.com]
    logpath = /var/log/vsftpd.log
    maxretry = 5
    bantime = 1800

    1. Lữ Phú Hòa 17

      làm tương tự để bảo vệ ftpserver luôn, đây là đính chính thêm!
      ==========
      #thêm vào bên dưới file này luôn
      nano /etc/fail2ban/jail.local
      [vsftpd-iptables]
      enabled = true
      filter = vsftpd
      action = iptables[name=VSFTPD, port=21, protocol=tcp]
      # sendmail-whois[name=VSFTPD, dest=you@example.com]
      logpath = /var/log/vsftpd.log
      maxretry = 5
      bantime = 1800

      ==========
      /var/log/vsftpd.log
      các bạn mở file /etc/vsftpd/vsftpd.conf ra thêm dual_log_enable=YES nếu chưa có để tạo thêm file log này nhé
      ==========
      tương tự dùng lệnh này để kiểm tra ip và xóa ip bị banip:
      fail2ban-client status vsftpd-iptables
      fail2ban-client set vsftpd-iptables unbanip 103.207.68.41

  15. Cedric 2

    Cảm ơn bài viết của bạn. Mình đang tìm hiểu tính năng send email notification khi ban 1 ip cố gắng truy cập SSH. Nhưng vẫn chưa thành công nhờ bạn có thể chia sẽ thêm về phần thiết lập send email notification được không.

    1. Luân Trần Admin

      Thường ít người dùng send mail notification vì như vậy chả mấy chốc mà ngập hòm mail mất. Nếu bạn vẫn muốn, hãy bỏ dấu # trước sendmail-whois và điền email dest, sender nhé.
      Restart lại fail2ban nữa.

  16. Ngọc Trâm 2

    Anh luân cho em hỏi là em cài đặt xong nhưng không hiện file fail2ban trong filezilla, remove cài lại vẫn không thấy hiện là sao vậy ạ?

      1. Ngọc Trâm 2

        Lần đầu tiên cài thì có, nhưng mình cài sai nên xoá và remove xong cài lại thì k thấy hiện nữa ạ

        1. Việt Phương Moderator

          Bạn hãy xóa Fail2Ban với lệnh #yum remove fail2ban rồi cài đặt lại nhé.

Comment của bạn

Your email address will not be published. Required fields are marked *