Mặc dù việc kết nối với máy chủ qua ssh có thể rất an toàn, nhưng daemon ssh bản thân nó là một dịch vụ cần phải được mở ra Internet để hoạt động đúng cách. Điều này mang theo một số rủi ro nội tại và tạo ra một vector tấn công cho các kẻ xâm nhập.
Bất kỳ dịch vụ nào được mở ra mạng đều có thể trở thành mục tiêu. Nếu bạn chú ý đến các log của ứng dụng cho những dịch vụ này, bạn thường sẽ thấy các nỗ lực đăng nhập lặp đi lặp lại, có tính hệ thống, thể hiện các cuộc tấn công brute force từ cả người dùng và bot.
Một dịch vụ có tên fail2ban có thể giảm thiểu vấn đề này bằng cách tạo ra các quy tắc tự động thay đổi cấu hình Firewall của iptables dựa trên một số lượng đăng nhập không thành công được định sẵn. Điều này cho phép máy chủ của bạn phản hồi lại các nỗ lực truy cập trái phép mà không cần sự can thiệp của bạn.
Để bảo vệ VPS Linux khỏi tấn công brute force, Fail2Ban là giải pháp tuyệt vời. Nếu bạn đang tìm kiếm một VPS mạnh mẽ để triển khai, hãy khám phá các gói mua VPS tại DataOnline với hiệu suất cao, bảo mật tối ưu, giúp bạn yên tâm quản lý hệ thống.
Trong hướng dẫn này, chúng ta sẽ cùng nhau cài đặt và sử dụng fail2ban trên máy chủ ubuntu 14.04.
Cài đặt Fail2Ban trên Ubuntu 14.04
Quá trình cài đặt công cụ này khá đơn giản vì nhóm đóng gói của Ubuntu đã duy trì một gói trong kho lưu trữ mặc định.
Trước tiên, chúng ta cần cập nhật chỉ mục gói cục bộ và sau đó sử dụng apt để tải về và cài đặt gói:
sudo apt-get update sudo apt-get install fail2ban
Như bạn thấy, quá trình cài đặt rất đơn giản. Chúng ta bây giờ có thể bắt đầu cấu hình tiện ích này cho riêng mình.
Cấu hình Fail2Ban với các cài đặt dịch vụ của bạn
Dịch vụ fail2ban lưu các tệp cấu hình của nó trong thư mục /etc/fail2ban. Có một tệp mặc định có tên là jail.conf.
Vì tệp này có thể bị ghi đè bởi các bản nâng cấp gói, chúng ta không nên chỉnh sửa trực tiếp tệp này, mà hãy sao chép nó ra để có thể thay đổi một cách an toàn. Để hai tệp này hoạt động cùng nhau một cách thành công, tốt nhất chỉ bao gồm các cài đặt bạn muốn ghi đè trong tệp jail.local. Tất cả các tùy chọn mặc định sẽ được lấy từ tệp jail.conf.
Mặc dù chúng ta chỉ nên bao gồm những điểm lệch so với mặc định trong tệp jail.local, nhưng việc tạo một tệp jail.local dựa trên tệp jail.conf hiện có sẽ dễ dàng hơn. Vậy chúng ta sẽ sao chép tệp đó, với nội dung được chú thích, làm cơ sở cho tệp jail.local. Bạn có thể thực hiện việc này bằng cách gõ:
awk '{ printf "# "; print; }' /etc/fail2ban/jail.conf | sudo tee /etc/fail2ban/jail.local
Sau khi tệp đã được sao chép, chúng ta có thể mở tệp jail.conf gốc để xem cách các cài đặt được thiết lập theo mặc định:
sudo nano /etc/fail2ban/jail.conf
Trong tệp này, có một số cài đặt bạn có thể muốn điều chỉnh. Các cài đặt nằm dưới phần [DEFAULT] sẽ được áp dụng cho tất cả các dịch vụ được kích hoạt cho fail2ban mà không bị ghi đè trong phần riêng của dịch vụ đó.
/etc/fail2ban/jail.conf
[DEFAULT] . . . ignoreip = 127.0.0.1/8 . . .
Trong cài đặt ignoreip, fail2ban cấu hình các địa chỉ nguồn mà nó sẽ bỏ qua. Theo mặc định, nó được cấu hình để không chặn bất kỳ lưu lượng nào đến từ máy cục bộ. Bạn có thể thêm các địa chỉ bổ sung để bỏ qua bằng cách thêm một phần [DEFAULT] với cài đặt ignoreip trong tệp jail.local. Bạn có thể thêm địa chỉ bằng cách nối thêm chúng vào cuối chỉ thị, cách nhau bằng dấu cách.
/etc/fail2ban/jail.conf
[DEFAULT] . . . bantime = 600 . . .
Tham số bantime đặt thời gian (tính bằng giây) mà một khách hàng sẽ bị chặn khi họ không đăng nhập thành công. Theo mặc định, nó được đặt là 600 giây, tức là 10 phút.
/etc/fail2ban/jail.conf
[DEFAULT] . . . findtime = 600 maxretry = 3 . . .
Hai tham số tiếp theo bạn cần chú ý là findtime và maxretry. Chúng hoạt động cùng nhau để thiết lập điều kiện mà một khách hàng được xác định là người dùng không hợp lệ và nên bị chặn.
Biến maxretry đặt số lần thử đăng nhập mà khách hàng được phép trong một khoảng thời gian được xác định bởi findtime, trước khi bị chặn. Với các cài đặt mặc định, dịch vụ fail2ban sẽ chặn một khách hàng nếu họ đăng nhập không thành công 3 lần trong vòng 10 phút.
/etc/fail2ban/jail.conf
[DEFAULT] . . . destemail = root@localhost sendername = Fail2Ban mta = sendmail . . .
Bạn sẽ muốn đánh giá lại các cài đặt destemail, sendername và mta nếu bạn muốn cấu hình cảnh báo qua email. Tham số destemail đặt địa chỉ email sẽ nhận các thông báo chặn. sendername đặt giá trị của trường “From” trong email. Tham số mta cấu hình dịch vụ thư sẽ được sử dụng để gửi mail. Lại một lần nữa, thêm các cài đặt này vào tệp jail.local, dưới tiêu đề [DEFAULT] và đặt giá trị thích hợp nếu bạn muốn điều chỉnh chúng.
/etc/fail2ban/jail.conf
[DEFAULT] . . . action = $(action_)s . . .
Tham số này cấu hình hành động mà fail2ban thực hiện khi nó muốn thực hiện chặn. Giá trị action_ được định nghĩa trong tệp ngay trước tham số này. Hành động mặc định là chỉ cấu hình Firewall để từ chối lưu lượng từ host gây lỗi cho đến khi thời gian chặn hết hạn.
Nếu bạn muốn cấu hình cảnh báo qua email, hãy thêm hoặc bỏ chú thích mục action trong tệp jail.local và thay đổi giá trị của nó từ action_ thành action_mw. Nếu bạn muốn email bao gồm các dòng log liên quan, bạn có thể thay đổi thành action_mwl. Hãy đảm bảo rằng bạn đã cấu hình các cài đặt mail thích hợp nếu chọn sử dụng cảnh báo qua email.
Cài đặt riêng cho từng “jail”
Cuối cùng, chúng ta đến phần của tệp cấu hình xử lý các dịch vụ riêng lẻ. Chúng được chỉ định bởi các tiêu đề phần, như [ssh].
Mỗi phần này có thể được kích hoạt bằng cách bỏ chú thích tiêu đề trong tệp jail.local và thay đổi dòng enabled thành “true”:
/etc/fail2ban/jail.local
[jail_to_enable] . . . enabled = true . . .
Theo mặc định, dịch vụ SSH đã được kích hoạt và tất cả các dịch vụ khác đều bị vô hiệu.
Các phần này hoạt động bằng cách sử dụng các giá trị được thiết lập trong phần [DEFAULT] làm cơ sở và điều chỉnh chúng theo nhu cầu. Nếu bạn muốn ghi đè bất kỳ giá trị nào, bạn có thể thêm phần tương ứng của dịch vụ đó vào tệp jail.local và điều chỉnh giá trị của nó.
Một số cài đặt khác được thiết lập ở đây là filter dùng để xác định xem một dòng trong log có biểu thị một lần đăng nhập không thành công hay không và logpath cho biết fail2ban tìm log của dịch vụ cụ thể đó ở đâu.
Giá trị filter thực sự là tham chiếu đến một tệp nằm trong thư mục /etc/fail2ban/filter.d với phần mở rộng .conf bị bỏ đi. Các tệp này chứa các biểu thức chính quy xác định xem một dòng log có phải là một nỗ lực đăng nhập không thành công hay không. Chúng ta sẽ không đi sâu vào các tệp này trong hướng dẫn vì chúng khá phức tạp và các cài đặt có sẵn đã phù hợp với các dòng cần kiểm tra.
Tuy nhiên, bạn có thể xem các bộ lọc có sẵn bằng cách mở thư mục đó:
ls /etc/fail2ban/filter.d
Nếu bạn thấy một tệp có vẻ liên quan đến dịch vụ mà bạn đang sử dụng, bạn nên mở nó bằng trình soạn thảo văn bản. Hầu hết các tệp đều có chú thích rõ ràng và bạn có thể ít nhất xác định được loại điều kiện mà script được thiết kế để bảo vệ. Phần lớn các bộ lọc này có các phần (bị vô hiệu) thích hợp trong tệp jail.conf mà chúng ta có thể kích hoạt trong tệp jail.local
nếu cần.
Ví dụ, giả sử chúng ta đang phục vụ một website sử dụng Nginx và nhận ra rằng một phần được bảo vệ bằng mật khẩu của trang web đang bị tấn công với quá nhiều nỗ lực đăng nhập. Chúng ta có thể yêu cầu fail2ban sử dụng tệp nginx-http-auth.conf để kiểm tra điều kiện này trong tệp log /var/log/nginx/error.log.
Điều này đã được thiết lập trong một phần có tên [nginx-http-auth]
trong tệp /etc/fail2ban/jail.conf
. Chúng ta chỉ cần bỏ chú thích phần này trong tệp jail.local và thay đổi tham số enabled thành “true” để bảo vệ dịch vụ của mình:
/etc/fail2ban/jail.local
. . . [nginx-http-auth] enabled = true . . .
Nếu bạn kích hoạt điều này, hãy khởi động lại dịch vụ fail2ban để đảm bảo các quy tắc được xây dựng chính xác.
Tích hợp các bước lại với nhau
Bây giờ, khi bạn đã hiểu ý tưởng cơ bản đằng sau fail2ban, hãy cùng thực hiện một thiết lập cơ bản.
Chúng ta sẽ cấu hình một chính sách tự động chặn đối với SSH và Nginx, như đã mô tả ở trên. Chúng ta muốn fail2ban gửi email cho chúng ta khi một địa chỉ IP bị chặn.
Đầu tiên, hãy cài đặt tất cả phần mềm liên quan.
Nếu bạn chưa có, bạn sẽ cần cài đặt nginx, vì chúng ta sẽ giám sát log của nó, và bạn sẽ cần sendmail để gửi thông báo. Chúng ta cũng sẽ lấy iptables-persistent để cho phép máy chủ tự động thiết lập các quy tắc Firewall khi khởi động. Các gói này có thể được lấy từ kho lưu trữ mặc định của Ubuntu:
sudo apt-get update sudo apt-get install nginx sendmail iptables-persistent
Tạm dừng dịch vụ fail2ban một lúc để chúng ta có thể thiết lập một Firewall cơ bản mà không có các quy tắc do fail2ban thêm vào:
sudo service fail2ban stop
Thiết lập Firewall cơ bản
Khi việc cài đặt xong, chúng ta nên triển khai một Firewall mặc định. Bạn có thể tìm hiểu cách cấu hình một iptables Firewall trên Ubuntu 14.04 ở đây. Chúng ta sẽ tạo một Firewall cơ bản cho hướng dẫn này.
Chúng ta sẽ cho phép các kết nối đã được thiết lập, lưu lượng do chính máy chủ tạo ra, lưu lượng đến các cổng SSH và máy chủ web. Tất cả lưu lượng khác sẽ bị loại bỏ. Chúng ta có thể thiết lập Firewall cơ bản này bằng cách gõ:
sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT sudo iptables -A INPUT -j DROP
Các lệnh này sẽ triển khai chính sách nêu trên. Bạn có thể xem các quy tắc hiện tại của Firewall bằng cách gõ:
sudo iptables -S
Output
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP
Bạn có thể lưu các quy tắc Firewall để chúng tồn tại sau khi khởi động lại bằng cách gõ:
sudo dpkg-reconfigure iptables-persistent
Sau đó, bạn có thể khởi động lại fail2ban để áp dụng các quy tắc bao bọc:
sudo service fail2ban start
Chúng ta có thể xem các quy tắc Firewall hiện tại bằng cách gõ:
sudo iptables -S
Output
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP -A fail2ban-ssh -j RETURN
Chúng ta đã có chính sách mặc định cho mỗi chuỗi, và sau đó là 5 quy tắc cơ bản mà chúng ta đã thiết lập. Phần đánh dấu màu đỏ là cấu trúc mặc định được fail2ban thiết lập, vì nó đã triển khai chính sách chặn SSH theo mặc định. Những quy tắc này có thể xuất hiện hoặc không xuất hiện ngay lập tức, vì đôi khi fail2ban không thêm cấu trúc cho đến khi lần chặn đầu tiên được thực hiện.
Điều chỉnh cấu hình fail2ban
Bây giờ, chúng ta cần cấu hình fail2ban theo các cài đặt mà chúng ta mong muốn. Mở tệp jail.local:
sudo nano /etc/fail2ban/jail.local
Chúng ta có thể đặt thời gian chặn nghiêm khắc hơn ở đây. Tìm và bỏ chú thích phần [DEFAULT].
Dưới phần mặc định, thay đổi cài đặt bantime để dịch vụ của chúng ta chặn khách hàng trong nửa giờ:
/etc/fail2ban/jail.local
[DEFAULT] . . . bantime = 1800 . . .
Chúng ta cũng cần cấu hình thông tin email cảnh báo. Đầu tiên, tìm tham số destemail, cũng nằm dưới phần [DEFAULT]. Điền vào địa chỉ email mà bạn muốn sử dụng để nhận các thông báo này:
/etc/fail2ban/jail.local
[DEFAULT] . . . destemail = admin@example.com . . .
Bạn có thể đặt sendername thành một giá trị khác nếu muốn. Điều này hữu ích để có một giá trị có thể dễ dàng lọc bằng dịch vụ email của bạn, nếu không hộp thư đến của bạn có thể bị ngập thông báo nếu có nhiều nỗ lực xâm nhập từ nhiều nơi.
Tiếp theo, chúng ta cần điều chỉnh tham số action để chuyển sang một trong các hành động gửi email cho chúng ta. Lựa chọn là giữa action_mw (thực hiện chặn và sau đó gửi email báo cáo “whois” về host gây lỗi) hoặc action_mwl (thực hiện như trên, nhưng cũng gửi các dòng log liên quan).
Chúng ta sẽ chọn action_mwl vì các dòng log sẽ giúp chúng ta khắc phục sự cố và thu thập thêm thông tin nếu có vấn đề:
/etc/fail2ban/jail.local
[DEFAULT] . . . action = %(action_mwl)s . . .
Tiếp theo, chuyển sang phần SSH. Nếu bạn muốn điều chỉnh số lần thử đăng nhập không thành công cho phép trước khi áp dụng chặn, bạn có thể chỉnh sửa mục maxretry. Nếu bạn đang sử dụng một cổng khác ngoài “22”, hãy điều chỉnh tham số port cho phù hợp. Như đã nói trước, dịch vụ này đã được kích hoạt theo mặc định, vì vậy chúng ta không cần phải chỉnh sửa thêm.
Sau đó, tìm kiếm phần nginx-http-auth. Bỏ chú thích tiêu đề và thay đổi tham số enabled thành “true”:
/etc/fail2ban/jail.local
. . . [nginx-http-auth] enabled = true . . .
Nếu máy chủ web của bạn đang hoạt động trên cổng không tiêu chuẩn hoặc nếu bạn đã di chuyển đường dẫn log mặc định, có thể cần điều chỉnh thêm. Nhưng với thiết lập mặc định, chỉ cần cấu hình như trên là đủ.
Khởi động lại dịch vụ fail2ban
Khi bạn đã hoàn tất, hãy lưu và đóng tệp.
Bây giờ, khởi động hoặc khởi động lại dịch vụ fail2ban. Đôi khi, việc tắt hoàn toàn dịch vụ rồi khởi động lại lại hiệu quả hơn:
sudo service fail2ban stop
Bây giờ, chúng ta có thể khởi động lại dịch vụ bằng cách gõ:
sudo service fail2ban start
Có thể mất vài khoảnh khắc để tất cả các quy tắc Firewall của bạn được áp dụng. Đôi khi, các quy tắc không được thêm vào cho đến khi lần chặn đầu tiên của loại đó được thực hiện. Tuy nhiên, sau một thời gian, bạn có thể kiểm tra các quy tắc mới bằng cách gõ:
sudo iptables -S
Output
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-nginx-http-auth -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP -A fail2ban-nginx-http-auth -j RETURN -A fail2ban-ssh -j RETURN
Các dòng được đánh dấu màu đỏ là những quy tắc do fail2ban tạo ra. Hiện tại, chúng chỉ định hướng lưu lượng đến các chuỗi mới, hầu như trống, sau đó cho phép lưu lượng quay trở lại chuỗi INPUT.
Tuy nhiên, các chuỗi mới này là nơi các quy tắc chặn sẽ được thêm vào.
Kiểm tra các chính sách chặn
Từ một máy chủ khác, một máy không cần đăng nhập vào máy chủ fail2ban của bạn, chúng ta có thể kiểm tra các quy tắc bằng cách khiến máy chủ thứ hai của chúng ta bị chặn.
Sau khi đăng nhập vào máy chủ thứ hai, hãy thử kết nối ssh vào máy chủ fail2ban. Bạn có thể thử kết nối bằng cách sử dụng một tên không tồn tại, ví dụ:
ssh blah@fail2ban_server_IP
Nhập các ký tự ngẫu nhiên vào cửa sổ nhập mật khẩu. Lặp lại vài lần. Vào một thời điểm nào đó, máy chủ fail2ban sẽ ngừng phản hồi với thông báo “Permission denied”. Điều này cho thấy máy chủ thứ hai của bạn đã bị chặn khỏi máy chủ fail2ban.
Trên máy chủ fail2ban, bạn có thể kiểm tra quy tắc mới bằng cách xem lại iptables:
sudo iptables -S
Output
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-nginx-http-auth -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP -A fail2ban-nginx-http-auth -j RETURN -A fail2ban-ssh -s 203.0.113.14/32 -j REJECT --reject-with icmp-port-unreachable -A fail2ban-ssh -j RETURN
Như bạn thấy ở dòng được đánh dấu, chúng ta có một quy tắc mới trong cấu hình, từ chối lưu lượng đến cổng SSH từ địa chỉ IP của máy chủ thứ hai. Bạn cũng nên nhận được email thông báo về việc chặn ở tài khoản đã cấu hình.
Kết luận
Giờ đây, bạn đã có thể cấu hình các chính sách bảo vệ cơ bản cho các dịch vụ của mình. Fail2ban là một công cụ mạnh mẽ và dễ cài đặt, giúp bảo vệ hệ thống của bạn khỏi các cuộc tấn công brute force và các truy cập trái phép bằng cách chặn IP có hành vi đáng ngờ. Đây là một giải pháp tuyệt vời để bảo vệ các dịch vụ sử dụng xác thực, chẳng hạn như SSH, FTP, và dịch vụ web, đảm bảo an toàn cho máy chủ của bạn.
Sau khi cấu hình Fail2Ban, bạn cần một VPS đáng tin cậy để đảm bảo an toàn. Khám phá dịch vụ thuê VPS giá rẻ tại DataOnline, cung cấp cấu hình mạnh, hỗ trợ 24/7 và chi phí hợp lý, giúp bạn dễ dàng bảo vệ SSH và tối ưu hóa hệ thống.