Để 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
  • bantime: thời gian ban IP 3600 giây = 1 giờ, bạn có thể điều chỉnh lại nếu muốn

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é.

Comment của bạn

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

88 Comments

    1. Việt Phương Moderator

      Bạn kiểm tra Log của Fail2Ban tại /var/log xem log có note về xung đột gì không?

      1. Cong Minh Vuong 21 comment

        Log ghi lại như vậy. Có rất nhiều đoạn giống tương tự như vậy. Hình như sau khi cài CSF nó vô hiệu hóa iptables. Fail2Ban chỉ làm việc với iptables thôi hay sao ý.
        2017-04-18 07:02:25,381 fail2ban.action [26829]: ERROR iptables -w -n -L INPUT | grep -q ‘f2b-SSH[ \t]’ — stdout: ”
        2017-04-18 07:02:25,381 fail2ban.action [26829]: ERROR iptables -w -n -L INPUT | grep -q ‘f2b-SSH[ \t]’ — stderr: ”
        2017-04-18 07:02:25,381 fail2ban.action [26829]: ERROR iptables -w -n -L INPUT | grep -q ‘f2b-SSH[ \t]’ — returned 1
        2017-04-18 07:02:25,382 fail2ban.CommandAction [26829]: ERROR Invariant check failed. Trying to restore a sane environment
        2017-04-18 07:02:25,485 fail2ban.action [26829]: ERROR iptables -w -D INPUT -p tcp –dport 2222 -j f2b-SSH
        iptables -w -F f2b-SSH
        iptables -w -X f2b-SSH — stdout: ”
        2017-04-18 07:02:25,486 fail2ban.action [26829]: ERROR iptables -w -D INPUT -p tcp –dport 2222 -j f2b-SSH
        iptables -w -F f2b-SSH
        iptables -w -X f2b-SSH — stderr: “iptables v1.4.21: Couldn’t load target `f2b-SSH’:No such file or directory\n\nTry `iptables -h’ or ‘iptables –help’ for more information.\niptables: No chain/target/match by that name.\niptables: No chain/target/match by that name.\n”
        2017-04-18 07:02:25,486 fail2ban.action [26829]: ERROR iptables -w -D INPUT -p tcp –dport 2222 -j f2b-SSH
        iptables -w -F f2b-SSH
        iptables -w -X f2b-SSH — returned 1
        2017-04-18 07:02:25,486 fail2ban.actions [26829]: ERROR Failed to execute unban jail ‘ssh-iptables’ action ‘iptables’ info ‘{‘matches’: ‘Apr 16 15:57:30 li1638-81 sshd[13683]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=1.180.206.195 user=rootApr 16 15:57:32 li1638-81 sshd[13683]: Failed password for root from 1.180.206.195 port 33885 ssh2Apr 16 15:57:35 li1638-81 sshd[13683]: Failed password for root from 1.180.206.195 port 33885 ssh2Apr 16 15:57:36 li1638-81 sshd[13683]: Failed password for root from 1.180.206.195 port 33885 ssh2Apr 16 15:57:39 li1638-81 sshd[13683]: Failed password for root from 1.180.206.195 port 33885 ssh2Apr 16 15:57:41 li1638-81 sshd[13683]: Failed password for root from 1.180.206.195 port 33885 ssh2’, ‘ip’: ‘1.180.206.195’, ‘time’: 1492472183.912033, ‘failures’: 6}’: Error stopping action

        1. Việt Phương Moderator

          Đúng vậy, Fail2Ban dùng rule bên Iptables bạn nhé. Bên cạnh đó, Iptables được cài đặt mặc định ở các server CentOS nên được sử dụng từ đầu

          1. Việt Phương Moderator

            Mình nghĩ không. Fail2Ban/CSF đều hoạt động dựa trên Iptables. Bạn dùng Fail2Ban thì thôi CSF và ngược lại. Nếu muốn cấu hình sâu/chi tiết, bạn sử dụng CSF nhé. Bên cạnh đó, bạn có dùng Cloudfare không?

          2. Việt Phương Moderator

            1. Bạn dùng CSF hoặc Fail2Ban nhé. Nếu cấu hình sâu thì bạn sử dụng CSF.
            2. Nếu bạn dùng CSF thì phải cho các IP của Cloudfare vào list allow của CSF

  1. HUY NGUYỄN 1 comment

    Mình bật iptables và fail2ban lên nhưng chỉ connect đc port 22, các services http mysql đều không hoạt động. Nếu mình tắt iptables thì hoạt động bình thường.
    Giúp mình với.

    1. Việt Phương Moderator

      Mình nghĩ iptables bạn đã block các port của service khác, enable mỗi port SSH 22. Bạn có thể check iptables -L để biết các port enable/disable. Hướng dẫn qua bài viết này : https://hocvps.com/iptables/

  2. kinh 16 comment

    cho mình hỏi, h bị chính fail2ban ngăn ko cho đăng nhập SSH của mình thì mình phải làm sao ạ. xin cám ơn.

    1. Việt Phương Moderator

      Bạn chờ 1 giờ hoặc vào VPS terminal qua web console trên trang quản lý VPS (nếu NCC VPS có hỗ trợ chức năng này)

  3. tncong 24 comment

    file cấu hình fail2ban của hocvps script ở đường dẫn nào thế, mình muốn chỉnh block từ 1 tiếng lên tận 3 ngày 🙁 tự nhiên bị dò pass nhiều quá

      1. tncong 24 comment

        Thank bác Phương, cho e hỏi thêm là sửa xong thì dùng lệnh gì để có hiệu lực ạ? Stop rồi start hay dùng mỗi lệnh reload ạ?

  4. tncong 24 comment

    Sao chúng nó cứ dò vps mình nhiều thế nhỉ, hôm nào cũng đăng nhập vào vps mà cứ thấy báo vài chục lần loggin fail là thấy sợ sợ sao đó 🙁

    Status for the jail: ssh-iptables
    |- Filter
    | |- Currently failed: 1
    | |- Total failed: 1591
    | `- File list: /var/log/secure
    `- Actions
    |- Currently banned: 20
    |- Total banned: 432
    `- Banned IP list: ………….

    1. Việt Phương Moderator

      Fail2Ban vẫn hoạt động tốt mà, giúp bạn ban đến 432 còn gì 🙂 Còn bạn e ngại thì có thể dùng SSH Keys, disable luôn đăng nhập sử dụng password

  5. 34 comment

    Ad có hướng dẫn ban Ip 1 số nước không ad ơi 🙂 ban hết ip mấy nước đi cho khỏi bị tấn công

  6. V An. 8 comment

    Hocvps script có được tự động cài đặt chức năng này hay không bạn nhỉ? Hay là nếu mình muốn thì mới cài thêm vào?

  7. Hien Thanh 1 comment

    Mình không dùng F2B mà cấu hình thẳng iptables ntn:

    # iptables -I INPUT -p tcp –dport 22 -i eth0 -m state –state NEW -m recent –set
    # iptables -I INPUT -p tcp –dport 22 -i eth0 -m state –state NEW -m recent –update –seconds 60 –hitcount 4 -j DROP

    Đến nay vẫn hoạt động bình thường, kiểm tra ssh hết bị attack, mình có cần phải cấu hình thêm F2B ko?

    1. Việt Phương Moderator

      Tùy nhu cầu của bạn thôi, cấu hình iptables trên của bạn chắc là 4 lần fail?

  8. Gà Con 8 comment

    Hello , Em bị block khi vào website nhưng vào bằng ip us hay eu thì vẫn bình thường . Check trên fail2ban thì ko thấy xuất hiện ip . Các bác cho em xin cách khắc phục với ạ

    1. Việt Phương Moderator

      Website bạn là gì? Có thể bạn dùng module chặn theo quốc gia. Và bạn stop fail2ban xem ntn. kiểm tra cả rule bên iptables