Mục lục

    Cách Bảo Vệ Server Nginx Với Fail2Ban Trên Ubuntu 20.04

    Đăng bởi: Hoàng Thị Anh Thư

    Ngày đăng: 9 tháng 9 năm 2022

    description image

    Giới thiệu

    Khi thiết lập một server, thường có các phần của trang web bạn muốn hạn chế quyền truy cập. Các ứng dụng web thường cung cấp các phương thức xác thực và ủy quyền của riêng, nhưng chính server web có thể được sử dụng để hạn chế quyền truy cập nếu các phương thức này không đủ hoặc không khả dụng. Tuy nhiên, việc xác thực server web cũng đại diện cho sự tấn công bề mặt (attack surface) hoặc tấn công vector, thông qua những gì mà mọi người có thể cố gắng truy cập lại. Bất kỳ service nào tiếp xúc với Internet đều là mục tiêu tiềm năng của việc tấn công này. Nếu bạn xem lại nhật kí lưu lượng truy cập của web server, bạn sẽ thấy sự lặp lại thường xuyên, việc nỗ lực đăng nhập vào hệ thống đại diện cho các cuộc tấn công của user và bots là như nhau. Trước khi thiết lập VPN, bạn có thể triển khai một công cụ được gọi là Fail2ban. Fail2ban có thể giảm thiểu đáng kể các cuộc tấn công brute force bằng cách tạo các quy tắc tự động thay đổi cấu hình tường lửa của bạn để cấm các IP cụ thể sau một số lần đăng nhập không thành công. Điều này sẽ cho phép server của bạn tự chống lại trước những nỗ lực truy cập này mà không cần sự can thiệp của bạn. Qua bài hướng dẫn này chúng tôi sẽ chỉ cho bạn cách cài đặt fail2ban trên Ubuntu 20.04 và cấu hình chúng để giám sát log Nginx của bạn tìm các nỗ lực xâm nhập. Yêu cầu

    • Môi trường máy chủ Ubuntu 20.04 và một user non-root với quyền sudo
    • Cài đặt Nginx vào hệ thống của bạn

    Bước 1: Cài đặt và cấu hình Fail2ban

    Fail2ban có sẵn trong kho phần mềm của Ubuntu. Bắt đầu chạy lệnh với user không phải root để cập nhật danh sách các gói và cài đặt Fail2ban:

    sudo apt update
    sudo apt install fail2ban
    

    Fail2ban sẽ tự động thiết lập background service sau khi được cài đặt. Tuy nhiên nó sẽ tắt theo mặc định, vì một số cài đặt mặc định của nó có thể gây ra các hiệu ứng không mong muốn. Bạn có thể kiểm chứng bằng cách sử dụng lệnh systemctl:

    systemctl status fail2ban.service
    
     fail2ban.service - Fail2Ban Service
         Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled
         Active: inactive (dead)
           Docs: man:fail2ban(1)
    

    Bạn có thể bật Fail2ban ngay bây giờ, nhưng đầu tiên, bạn sẽ xem xét một số tính năng của nó. Fail2ban giữ các tệp cấu hình của nó trong thư mục / etc / fail2ban. Đây là file mặc định được gọi là jail.conf. Đi đến thư mục đó và in 20 dòng đầu tiên của file đó bằng cách sử dụng head -20:

    cd /etc/fail2ban
    head -20 jail.conf
    
    #
    # WARNING: heavily refactored in 0.9.0 release.  Please review and
    #          customize settings for your setup.
    #
    # Changes:  in most of the cases you should not modify this
    #           file, but provide customizations in jail.local file,
    #           or separate .conf files under jail.d/ directory, e.g.:
    #
    # HOW TO ACTIVATE JAILS:
    #
    # YOU SHOULD NOT MODIFY THIS FILE.
    #
    # It will probably be overwritten or improved in a distribution update.
    #
    # Provide customizations in a jail.local file or a jail.d/customisation.local.
    # For example to change the default bantime for all jails and to enable the
    # ssh-iptables jail the following (uncommented) would appear in the .local file.
    # See man 5 jail.conf for details.
    #
    # [DEFAULT]
    

    Chúng ta thấy, một số dòng đầu tiên của file này là commented out - Chúng bắt đầu với các kí tự # chỉ ra rằng chúng sẽ được đọc dưới dạng tài liệu thay vì dưới dạng cài đặt. Bạn cũng thấy rằng những nhận xét này đang hướng dẫn bạn không được trực tiếp sửa đổi file này. Thay vào đó có hai tuỳ chọn: tạo các cấu hình riêng lẻ cho Fail2ban trong nhiều file trong thư mục jail.d / hoặc tạo và thu thập tất cả các cài đặt local của bạn trong một file jail.local. File jail.conf sẽ được cập nhật định kỳ vì chính Fail2ban được cập nhật và sẽ được sử dụng làm nguồn cài đặt mặc định mà bạn chưa tạo bất kỳ overrides nào. Trong hướng dẫn này, bạn sẽ tạo jail.local. Bạn có thể copy jail.conf:

    sudo cp jail.conf jail.local
    

    Bây giờ bạn có thể bắt đầu thực hiện các thay đổi cấu hình. Mở file trong nano hoặc trình soạn thảo văn bản mà bạn thích:

    sudo nano jail.local
    

    Thay đổi mặc định Bạn sẽ bắt đầu bằng cách đánh giá các giá trị mặc định trong tệp. Bạn sẽ tìm thấy [DEFAULT] trong file. Các mục này được đặt chính sách chung và có thể được overrides trên mỗi ứng dụng cơ bản. Nếu bạn sử dụng nano, bạn có thể tìm kiếm trong file bằng cách nhấn Ctrl + W, nhập tìm kiếm, sau đó nhấn enter. Một trong những mục đầu tiên bạn cần xem xét là danh sách khách hàng không theo chính sách Fail2ban. Được cài đặt bởi ignoreip. Đôi khi bạn nên thêm địa chỉ IP hoặc mạng vào danh sách các trường hợp ngoại lệ để tránh tự khóa mình. Điều này sẽ xảy ra ít vấn đề hơn SSH khi đăng nhập với web server. Vì nếu bạn có thể duy trì quyền truy cập shell, bạn có thể đảo ngược lệnh cấm. Bạn có thể bỏ ghi chú dòng này và thêm các địa chỉ IP hoặc mạng bổ sung được phân cách bằng dấu cách, vào danh sách hiện có:

    [DEFAULT]
    
    . . .
    #ignoreip = 127.0.0.1/8 your_home_IP
    

    Ngoài ra có một mục có thể bạn muốn điều chỉnh bantime. Bởi nó sẽ kiểm soát có sau bao nhiêu giây có một thành viên vi phạm. Thiết lập tốt nhất là cài đặt một khoảng thời gian đủ dài để làm để làm gián đoạn các nổ lực tự động đồng thời đủ ngắn để user có thể sửa lỗi. Bạn có thể tăng hoặc giảm giá trị này:

    [DEFAULT]
    
    . . .
    bantime = 10m
    

    Hai mục tiếp theo sẽ xác định phạm vi dòng nhật kí sử dụng nhằm xác định client vi phạm. findtime chỉ định một lượng thời gian tính bằng giây và maxretry cho biết số lần thử được chấp nhận trong thời gian đó. Nếu client cố gắng thực hiện nhiều hơn maxretry trong khoảng thời gian được thiết lập bởi findtime, họ sẽ bị chặn:

    [DEFAULT]
    
    . . .
    findtime = 10m
    maxretry = 5
    

    Thiết lập thông báo mail ( không bắt buộc) Bạn có thể tùy chọn bật thông báo qua email để nhận thư bất cứ khi nào có lệnh cấm. Trước tiên, bạn sẽ phải thiết lập MTA trên server của mình để nó có thể gửi email. Để tìm hiểu cách sử dụng Postfix cho tác vụ này tham khảo cách cài đặt và cấu hình Postfix trên ubuntu 22.04. Sau khi bạn đã thiết lập MTA của mình, bạn phải điều chỉnh một số cài đặt bổ sung trong phần [DEFAULT] của file /etc/fail2ban/jail.local. Bắt đầu bằng cách thiết lập chỉ thị mta`. Nếu bạn thiết lập Postfix, giống như hướng dẫn ở trên, hãy thay đổi giá trị này thành “mail”:

    [DEFAULT]
    
    . . .
    mta = mail
    

    Cung cấp địa chỉ email sẽ nhận thư trong trường destemail. sender tùy chọn cấu hình địa chỉ mà mail sẽ được gửi, cần phải tương thích với cấu hình Postfix của bạn:

    [DEFAULT]
    
    . . .
    destemail = [email protected]
    sendername = [email protected]<fq-hostname>
    

    action tham số cấu hình hành động mà Fail2ban thực hiện khi nó muốn thực hiện lệnh cấm. Giá trị action_ được xác định trong file ngay trước tham số này. Hành động mặc định là cập nhật cấu hình tường lửa của bạn để từ chối lưu lượng truy cập từ host vi phạm cho đến khi hết thời gian cấm.

    [DEFAULT]
    . . .
    action = $(action_)s
    . . .
    

    Có các tập lệnh action_ khác được cung cấp theo mặc định bạn có thể thay thế bằng $ (action_) ở trên:

    …
    # ban & send an e-mail with whois report to the destemail.
    action_mw = %(action_)s
                %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
    
    # ban & send an e-mail with whois report and relevant log lines
    # to the destemail.
    action_mwl = %(action_)s
                 %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
    …
    

    Cả hai action_mwaction_mwl sẽ xử lý việc gửi email bằng cấu hình bạn đã cung cấp. Bước tiếp theo, bạn sẽ chuyển sang cấu hình dành riêng cho Nginx

    Bước 2: Cấu hình Fail2Ban để theo dõi nhật ký Nginx

    Bây giờ bạn đã có một số cài đặt Fail2ban chung, bạn có thể kích hoạt Nginx-specific theo dõi nhật ký server web của bạn để biết các mẫu cụ thể. Mỗi Mỗi jail trong file cấu hình được đánh dấu bằng tiêu đề chứa tên jail trong dấu ngoặc vuông, nhưng [DEFAULT] phần cho biết cấu hình của một jail cụ thể. Theo mặc định, chỉ có [ssh] jail được kích hoạt. Để bật theo dõi nhật ký cho các lần đăng nhập Nginx, kích hoạt jail [nginx-http-auth. Thêm enabled = true chỉ thị trong phần này:

    …
    [nginx-http-auth]
    
    enabled  = true
    port     = http,https
    logpath = %(nginx_error_log)s
    . . .
    

    Khi bạn hoàn thành việc sửa đổi, lưu và đóng file. Nếu bạn sử dụng nano nhấn Ctrl+X sau khi được nhắc nhấn y và ENTER. Tiếp theo, bạn sẽ xem xét cấu hình bộ lọc cho nginx-http-auth.

    Bước 3: Xem lại bộ lọc cho Nginx Jails

    Bạn có thể nhận thấy rằng khối [nginx-http-auth] trong jail.local không chứa bất kỳ quy tắc nào dành riêng cho Nginx. Các quy tắc này không tự động được mã hóa cứng bên trong Fail2ban, trên thực tế tiêu đề [nginx-http-auth] tương ứng trực tiếp với tên file bên trong Fail2ban’s, filter.dbộ lọc đóng gói sẵn của Fail2ban’s filter. Nếu bạn liệt kê nội dung của thư mục này, bạn có thể thấy các bộ lọc đóng gói có sẵn, nếu bạn cần sử dụng chúng:

    ls /etc/fail2ban/filter.d
    
    3proxy.conf                freeswitch.conf         proftpd.conf
    apache-auth.conf           froxlor-auth.conf       pure-ftpd.conf
    apache-badbots.conf        gitlab.conf             qmail.conf
    apache-botsearch.conf      grafana.conf            recidive.conf
    apache-common.conf         groupoffice.conf        roundcube-auth.conf
    apache-fakegooglebot.conf  gssftpd.conf            scanlogd.conf
    apache-modsecurity.conf    guacamole.conf          screensharingd.conf
    apache-nohome.conf         haproxy-http-auth.conf  selinux-common.conf
    apache-noscript.conf       horde.conf              selinux-ssh.conf
    apache-overflows.conf      ignorecommands          sendmail-auth.conf
    apache-pass.conf           kerio.conf              sendmail-reject.conf
    apache-shellshock.conf     lighttpd-auth.conf      sieve.conf
    assp.conf                  mongodb-auth.conf       slapd.conf
    asterisk.conf              monit.conf              softethervpn.conf
    bitwarden.conf             murmur.conf             sogo-auth.conf
    …
    

    Bây giờ, hãy xem nginx-http-auth.conf:

    cat /etc/fail2ban/filter.d/nginx-http-auth.conf
    
    # fail2ban filter configuration for nginx
    
    
    [Definition]
    
    
    failregex = ^ \[error\] \d+#\d+: \*\d+ user "(?:[^"]+|.*?)":? (?:password mismatch|was not found in "[^\"]*"), client: <HOST>, server: \S*, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"(?:, referrer: "\S+")?\s*$
    
    ignoreregex =
    
    datepattern = {^LN-BEG}
    …
    

    Những file này chứa những biểu thức chính quy (regular expressions) xác định xem một dòng trong nhật ký có phải là một lần xác thực không thành công hay không. Chúng có thể được sửa đổi trực tiếp khi cần thiết. Trong bước tiếp theo, bạn sẽ kích hoạt và kiểm tra Fail2ban.

    Bước 4: Kích hoạt Nginx Jails của bạn

    Tại thời điểm này, bạn có thể kích hoạt dịch vụ Fail2ban của mình để nó sẽ tự động chạy từ bây giờ. Đầu tiên, chạy systemctl enable:

    sudo systemctl enable fail2ban
    

    Sau đó, khởi động bằng tay vào lần đầu tiên với systemctl start:

    sudo systemctl start fail2ban
    

    Bạn có thể xác minh rằng nó đang chạy với systemctl status

    sudo systemctl status fail2ban
    
    ● fail2ban.service - Fail2Ban Service
         Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled
         Active: active (running) since Fri 2022-07-08 17:19:38 UTC; 7s ago
           Docs: man:fail2ban(1)
       Main PID: 5962 (fail2ban-server)
          Tasks: 7 (limit: 2327)
         Memory: 12.6M
            CPU: 195ms
         CGroup: /system.slice/fail2ban.service
                 └─5962 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
    
    **Note:** Để thực hiện bất kỳ thay đổi cấu hình nào trong tương lai, bạn cần khởi động lại dịch vụ fail2ban. Bạn có thể làm bằng cách sử dụng `sudo systemctl restart fail2ban` 
    

    Nhận thông tin về Jails đã bật Bạn có thể xem tất cả các jails đã kích hoạt của mình bằng cách sử dụng lệnh fail2ban-client

    sudo fail2ban-client status
    

    Bạn sẽ thấy danh sách jails:

    Status
    |- Number of jail:      2
    `- Jail list:           nginx-http-auth, sshd
    

    Nếu bạn muốn xem chi tiết về các lệnh cấm được thi hành bởi bất kỳ jail nào, Sử dụng lại lệnh fail2ban-client":

    sudo fail2ban-client status nginx-http-auth
    
    Status for the jail: nginx-http-auth
    |- filter
    |  |- File list:        /var/log/nginx/error.log 
    |  |- Currently failed: 0
    |  `- Total failed:     0
    `- action
       |- Currently banned: 0
       |  `- IP list:
       `- Total banned:     0
    

    Trong bước hướng dẫn tiếp theo, bạn sẽ phải kiểm tra việc bị cấm để xác minh rằng cấu hình Fail2ban của bạn đang hoạt động.

    Bước 5: Thử nghiệm Fail2Ban Policies

    Điều quan trọng là phải kiểm tra các chính sách Fail2ban của bạn để đảm bảo chúng chặn lưu lượng truy cập như mong đợi. Để thực hiện việc này, hãy điều hướng đến server của bạn trong trình duyệt web cục bộ. Ở lời nhắc xác thực Nginx, liên tục nhập thông tin đăng nhập không chính xác. Sau vài lần thử, server sẽ hoàn toàn ngừng phản hồi cho bạn, như thể kết nối của bạn bị ngắt: description image Nếu bạn nhìn vào trạng thái của cấu hình nginx-http-auth với fail2ban-client. Bạn sẽ thấy địa chỉ IP của mình bị cấm trên trang web:

    sudo fail2ban-client status nginx-http-auth
    
    Status for the jail: nginx-http-auth
    |- Filter
    |  |- Currently failed: 0
    |  |- Total failed:     5
    |  `- File list:        /var/log/nginx/error.log
    `- Actions
       |- Currently banned: 1
       |- Total banned:     1
       `- Banned IP list:   108.172.85.62
    

    Bạn cũng có thể xem quy tắc mới bằng cách kiểm tra đầu ra iptables. iptables là lệnh tương tác với các quy tắc tường lửa và port cấp thấp trên server của bạn. Nếu bạn đã làm theo hướng dẫn của chúng tôi để thiết lập server ban đầu, bạn sẽ sử dụng ufw để quản lý các quy tắc tường lửa ở cấp cao hơn. chạy iptables -S sẽ hiển thị cho bạn tất cả các quy tắc tường lửa mà ufw đã tạo:

    sudo iptables -S
    
    -P INPUT DROP
    -P FORWARD DROP
    -P OUTPUT ACCEPT
    -N f2b-nginx-http-auth
    -N ufw-after-forward
    -N ufw-after-input
    -N ufw-after-logging-forward
    -N ufw-after-logging-input
    -N ufw-after-logging-output
    -N ufw-after-output
    -N ufw-before-forward
    -N ufw-before-input
    -N ufw-before-logging-forward
    -N ufw-before-logging-input
    -N ufw-before-logging-output
    …
    

    Nếu bạn chuyển đầu ra của iptables -S thành grep để tìm kiếm trong các quy tắc đó cho chuỗi f2b. Bạn có thể thấy các quy tắc đã được thêm vào bởi fail2ban:

    sudo iptables -S | grep f2b
    
    -N f2b-nginx-http-auth
    -A INPUT -p tcp -m multiport --dports 80,443 -j f2b-nginx-http-auth
    -A f2b-nginx-http-auth -s 108.172.85.62/32 -j REJECT --reject-with icmp-port-unreachable
    -A f2b-nginx-http-auth -j RETURN
    

    Dòng chứa REJECT --reject-with icmp-port- không thể truy cập đã được Fail2ban thêm vào và sẽ phản ánh địa chỉ IP của máy cục bộ của bạn. Khi bạn hài lòng với các rules đang hoạt động, bạn có thể bỏ cấm địa chỉ IP của mình với fail2ban-client bằng cách nhập:

    sudo fail2ban-client set nginx-http-auth unbanip 108.172.85.62
    

    Bây giờ bạn có thể thử xác thực lại một lần nữa.

    Kết luận

    Fail2ban cung cấp rất nhiều tính năng linh hoạt để xây dựng các chính sách phù hợp với nhu cầu bảo mật cụ thể của bạn. Bằng cách xem xét các biến và mẫu trong file /etc/fail2ban/jail.local và các tệp mà nó phụ thuộc vào trong /etc/fail2ban/filter.d và thư mục /etc/fail2ban/action.d. Bạn có thể tìm thấy nhiều phần để điều chỉnh và thay đổi khi nhu cầu của bạn cao hơn. Bảo vệ server của bạn bằng fail2ban có thể cung cấp cho bạn một hướng cơ sở bảo mật hữu ích.

    0 câu trả lời