Cách Tôi Phát Hiện và Ngăn Chặn Tấn Công Brute-Force (Tổng kết 6 tháng)

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Hồi Chuông Cảnh Tỉnh: Một Cuộc Tấn Công Lúc Nửa Đêm

Một loạt cảnh báo từ máy chủ lúc 2 giờ sáng là một trải nghiệm khó chịu. Đó là thực tế của tôi sáu tháng trước, khi hộp thư của tôi bùng nổ với hơn 500 thông báo về các lần đăng nhập thất bại trên một máy chủ hoàn toàn mới. Đó là một cuộc tấn công brute-force vào SSH kinh điển và không ngừng nghỉ.

Các kịch bản tự động đang hoạt động hết công suất, thử hàng ngàn tổ hợp mật khẩu. Mặc dù chúng không thể xâm nhập, sự cố này đã dạy cho tôi một bài học quan trọng: bảo mật mặc định không phải là bảo mật thực sự. Đêm đó đã củng cố cam kết của tôi trong việc ưu tiên bảo mật ngay từ khi một máy chủ đi vào hoạt động.

Trong sáu tháng qua, tôi đã tinh chỉnh một chiến lược phòng thủ nhiều lớp, biến những máy chủ ồn ào, liên tục bị dò quét thành những pháo đài yên tĩnh. Đây không phải là về các công cụ phức tạp cấp doanh nghiệp. Đây là một thiết lập thực tế mà bất kỳ chuyên gia IT hoặc người dùng cá nhân nào cũng có thể triển khai. Đây là câu chuyện về thiết lập đó, những gì hiệu quả, và cách bạn cũng có thể làm được.

Tìm Hiểu Về Chiến Trường: Tấn Công Brute-Force là gì?

Trước khi xây dựng hệ thống phòng thủ, chúng ta cần biết kẻ thù là ai. Một cuộc tấn công brute-force về cơ bản là một công cụ công phá kỹ thuật số. Kẻ tấn công sử dụng các kịch bản tự động để thử một số lượng lớn các tổ hợp nhằm đoán ra thông tin đăng nhập của bạn. Chúng chủ yếu có hai dạng:

  • Tấn công từ điển (Dictionary Attack): Kịch bản duyệt qua một danh sách các mật khẩu phổ biến hoặc đã bị rò rỉ trước đó, như `password`, `123456`, hoặc `qwerty`.
  • Brute-Force thuần túy (Pure Brute-Force): Kịch bản thử một cách có phương pháp mọi tổ hợp ký tự có thể (aaa, aab, aac…). Cách này chậm hơn nhưng toàn diện hơn nhiều.

Các mục tiêu phổ biến nhất là các dịch vụ được tiếp xúc với internet, như SSH, RDP, FTP và các trang đăng nhập ứng dụng web—đặc biệt là WordPress. Một cuộc tấn công thành công có nghĩa là truy cập trái phép, đánh cắp dữ liệu và làm tiêu hao tài nguyên CPU và bộ nhớ của máy chủ một cách đáng kể. Mục tiêu của chúng ta là làm cho các cuộc tấn công này trở nên kém hiệu quả đến mức kẻ tấn công phải từ bỏ và chuyển sang mục tiêu khác.

Chiến Lược Của Tôi: Phòng Thủ Chủ Động, Nhiều Lớp

Phương pháp của tôi rất đơn giản: làm cho cánh cửa chính cực kỳ vững chắc, sau đó đặt một người bảo vệ tự động để đuổi bất kỳ ai lảng vảng. Đó là một sự kết hợp hiệu quả cao đã được chứng minh là cực kỳ đáng tin cậy.

Lớp 1: Củng Cố Cửa Chính Bằng Khóa SSH

Thay đổi quan trọng nhất bạn có thể thực hiện là vô hiệu hóa xác thực bằng mật khẩu cho SSH và thay vào đó sử dụng khóa mã hóa. Một mật khẩu, đặc biệt là mật khẩu yếu, có thể bị đoán ra. Một khóa mã hóa được tạo đúng cách thì không. Một cặp khóa SSH bao gồm một khóa riêng tư (private key, được giữ an toàn trên máy cục bộ của bạn) và một khóa công khai (public key, được đặt trên máy chủ). Máy chủ chỉ cấp quyền truy cập cho người có thể chứng minh họ sở hữu khóa riêng tư chính xác.

1. Tạo Cặp Khóa Của Bạn

Nếu bạn chưa có, hãy tạo một cặp khóa trên máy tính cục bộ của bạn. Mở một terminal và chạy:

ssh-keygen -t rsa -b 4096

Lệnh này tạo ra một khóa RSA 4096-bit mạnh mẽ. Bạn sẽ được nhắc lưu tệp và đặt một cụm mật khẩu (passphrase) tùy chọn. Tôi thực sự khuyên bạn nên sử dụng cụm mật khẩu để có thêm một lớp bảo mật.

2. Sao Chép Public Key Của Bạn Lên Máy Chủ

Tiếp theo, cài đặt khóa công khai trên máy chủ của bạn. Cách dễ nhất là dùng tiện ích `ssh-copy-id`.

ssh-copy-id user@your_server_ip

Nó sẽ yêu cầu mật khẩu của bạn lần cuối cùng. Lệnh này tự động thêm khóa công khai của bạn vào tệp `~/.ssh/authorized_keys` trên máy chủ.

3. Vô Hiệu Hóa Xác Thực Bằng Mật Khẩu

Đây là bước cuối cùng, cực kỳ quan trọng. Đăng nhập vào máy chủ của bạn và mở tệp cấu hình của daemon SSH bằng một trình soạn thảo văn bản như nano hoặc vim.

sudo nano /etc/ssh/sshd_config

Tìm dòng `PasswordAuthentication` và thay đổi giá trị của nó thành `no`. Khi đang ở trong tệp này, một thực hành tốt khác là vô hiệu hóa đăng nhập root trực tiếp bằng cách đặt `PermitRootLogin` thành `no`.

# Thay đổi dòng này
PasswordAuthentication no

# Và cả dòng này nữa
PermitRootLogin no

Lưu tệp, sau đó khởi động lại dịch vụ SSH để áp dụng các thay đổi.

sudo systemctl restart sshd

Với thay đổi này, các lần đăng nhập dựa trên mật khẩu giờ đây là không thể. Phần lớn các bot brute-force sẽ bị chặn ngay lập tức.

Lớp 2: Người Gác Cổng Tự Động, Fail2ban

Sau khi đã củng cố cửa chính, lớp phòng thủ tiếp theo của tôi là một người gác cổng tự động: Fail2ban. Công cụ tuyệt vời này quét các tệp log để tìm hoạt động độc hại, chẳng hạn như các lần đăng nhập thất bại lặp đi lặp lại. Khi phát hiện một kẻ vi phạm, nó sẽ tự động cập nhật tường lửa để chặn địa chỉ IP của họ trong một khoảng thời gian nhất định.

1. Cài Đặt

Trên Debian hoặc Ubuntu, việc cài đặt chỉ bằng một dòng lệnh.

sudo apt update && sudo apt install fail2ban -y

2. Cấu Hình

Cấu hình chính của Fail2ban nằm ở `/etc/fail2ban/jail.conf`. Đừng bao giờ chỉnh sửa trực tiếp tệp này, vì các bản cập nhật có thể ghi đè lên nó. Thay vào đó, hãy tạo một bản sao cục bộ để bạn có thể an toàn thực hiện các thay đổi của riêng mình.

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Bây giờ, mở `jail.local` để tùy chỉnh các quy tắc của bạn.

sudo nano /etc/fail2ban/jail.local

Để bắt đầu, tôi tập trung vào phần `[sshd]`. Cấu hình này là một nền tảng tuyệt vời:

[sshd]
enabled = true
port    = ssh
maxretry = 3
findtime = 300
bantime = 3600
logpath = /var/log/auth.log
  • enabled: Kích hoạt quy tắc này (được gọi là “jail”).
  • maxretry: Số lần thử thất bại trước khi cấm. Ba là một con số hợp lý và nghiêm ngặt.
  • findtime: Khoảng thời gian (tính bằng giây) để các lần thử thất bại xảy ra. Ba lần thử thất bại trong vòng 300 giây (5 phút) là một tín hiệu rõ ràng của bot.
  • bantime: Thời gian cấm kéo dài (tính bằng giây). Tôi bắt đầu với 3600 (1 giờ). Nếu tôi thấy những kẻ vi phạm lặp lại, tôi sẽ tăng lên `86400` (24 giờ).

Sau khi lưu các thay đổi, hãy khởi động lại Fail2ban để tải cấu hình mới.

sudo systemctl restart fail2ban

3. Kiểm Tra Trạng Thái

Bạn có thể theo dõi Fail2ban hoạt động. Để kiểm tra jail sshd và xem danh sách các IP bị cấm, hãy chạy:

sudo fail2ban-client status sshd

Nếu bạn vô tình tự khóa mình (điều đó có thể xảy ra!), bạn có thể gỡ cấm địa chỉ IP của mình từ console của máy chủ:

sudo fail2ban-client set sshd unbanip YOUR_IP_ADDRESS

Lớp 3: Đừng Quên Các Ứng Dụng Web

Tấn công brute-force không chỉ dành cho SSH. Các biểu mẫu đăng nhập của WordPress, Joomla và các ứng dụng web khác là những mục tiêu lớn. Nguyên tắc phòng thủ vẫn như cũ: giới hạn số lần đăng nhập. Đối với WordPress, plugin Wordfence Security cung cấp một công cụ giới hạn đăng nhập tuyệt vời. Dù nền tảng của bạn là gì, hãy tìm một công cụ tương tự. Quan trọng hơn, hãy thực thi mật khẩu mạnh và Xác thực hai yếu tố (2FA). Đối với bất kỳ tài khoản người dùng quan trọng nào, 2FA là điều bắt buộc.

Sáu Tháng Sau: Bình Yên và Tĩnh Lặng

Sự kết hợp giữa xác thực bằng khóa SSH và việc chặn tự động của Fail2ban đã cực kỳ hiệu quả. Log máy chủ của tôi đã kể lại câu chuyện. Sự ồn ào hàng ngày của hàng trăm lần đăng nhập thất bại đã biến mất, thay vào đó là sự im lặng gần như tuyệt đối. Tệp `auth.log` của tôi, từng tăng lên hàng megabyte mỗi ngày, giờ đây chỉ ghi nhận vài kilobyte. Bảo mật không phải là một sản phẩm duy nhất bạn cài đặt; đó là một quá trình xây dựng các lớp phòng thủ thông minh.

Tất nhiên, bạn vẫn cần xem xét log của mình định kỳ và cập nhật hệ thống. Nhưng bằng cách thực hiện các bước thực tế này, bạn có thể xây dựng một hệ thống phòng thủ kiên cường mang lại sự yên tâm to lớn. Điều đó chắc chắn đúng với tôi.

Share: