NGINX log phân tích — ai vào nhiều, IP nào tấn công

Tài liệu » Quản trị VPS - Server » NGINX log phân tích — ai vào nhiều, IP nào tấn công

Vì sao cần phân tích NGINX log ngay?

Bạn đang đau đầu vì website bị tấn công, truy cập lạ tăng đột biến nhưng không biết nguồn gốc từ đâu? Việc phân tích NGINX log là bước cực kỳ quan trọng để bảo vệ server và website của bạn.

  • 🔍 Xác định nguồn tấn công: Biết IP nào đang cố gắng xâm nhập.
  • 📈 Phát hiện truy cập bất thường: Nhận diện bot, scraper, hoặc các hành vi độc hại.
  • 🛡️ Tăng cường bảo mật: Đóng chặn IP xấu, tinh chỉnh cấu hình NGINX.
  • 🚀 Tối ưu hiệu suất: Hiểu rõ traffic để có chiến lược phù hợp.
  • 💡 Phòng ngừa rủi ro: Ngăn chặn các cuộc tấn công trước khi chúng gây thiệt hại.

Hiểu cấu trúc NGINX log

Tóm gọn: NGINX log ghi lại chi tiết mọi yêu cầu đến server. Hiểu định dạng log giúp bạn trích xuất thông tin cần thiết.

Mặc định, NGINX sử dụng định dạng combined hoặc common.

Định dạng log combined

Đây là định dạng phổ biến nhất, cung cấp nhiều thông tin hữu ích.

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';
  • $remote_addr: Địa chỉ IP của client.
  • $remote_user: Tên người dùng xác thực (thường là -).
  • $time_local: Thời gian yêu cầu được ghi nhận.
  • "$request": Yêu cầu HTTP (phương thức, URL, giao thức).
  • $status: Mã trạng thái HTTP (200, 404, 500…).
  • $body_bytes_sent: Kích thước response body (bytes).
  • "$http_referer": Trang web trước đó mà client truy cập.
  • "$http_user_agent": Thông tin trình duyệt/client.

Định dạng log common

Đơn giản hơn, thiếu thông tin referer và user agent.

log_format common '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent';

⚠️ Cảnh báo: Nếu bạn chưa cấu hình lại định dạng log, NGINX thường mặc định dùng combined. Hãy kiểm tra file cấu hình NGINX của bạn (nginx.conf hoặc file trong conf.d/).

Phân tích IP truy cập nhiều nhất

Tóm gọn: Sử dụng các công cụ dòng lệnh Linux để đếm và sắp xếp IP theo số lượng yêu cầu.

Sử dụng awksort

Đây là cách nhanh chóng để thống kê IP.

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
  • awk '{print $1}': Trích xuất cột đầu tiên (địa chỉ IP) từ mỗi dòng log.
  • sort: Sắp xếp các IP theo thứ tự bảng chữ cái.
  • uniq -c: Đếm số lần xuất hiện của mỗi IP duy nhất.
  • sort -nr: Sắp xếp kết quả theo số đếm (số lượng yêu cầu) ngược (từ cao xuống thấp).
  • head -n 10: Lấy 10 IP có số lượng yêu cầu cao nhất.

Output mẫu:

  15432 192.168.1.100
   9876 10.0.0.5
   5432 203.0.113.45
   3210 198.51.100.12
   1024 172.16.0.1
    512 192.0.2.10
    256 1.1.1.1
    128 8.8.8.8
     64 93.184.216.34
     32 151.101.1.69

Phân tích theo khoảng thời gian

Bạn có thể lọc log theo ngày hoặc giờ để có cái nhìn chi tiết hơn.

# Lọc log trong 24h qua (giả sử logrotate đã chạy)
grep "$(date -d 'yesterday' '+%d/%b/%Y')" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10

# Lọc log trong 1 giờ qua (nếu log có timestamp chi tiết)
# Cần điều chỉnh awk để so sánh timestamp

💡 Mẹo: Nếu bạn sử dụng log_format tùy chỉnh, hãy đảm bảo awk trích xuất đúng cột chứa địa chỉ IP.

Phát hiện IP tấn công (Brute-force, DDoS)

Tóm gọn: Tìm kiếm các IP có số lượng yêu cầu vượt trội trong một khoảng thời gian ngắn, đặc biệt là các yêu cầu tới trang đăng nhập hoặc các endpoint nhạy cảm.

Dấu hiệu của tấn công Brute-force

  • Số lượng lớn yêu cầu POST tới trang đăng nhập: Thường là /wp-login.php, /admin, /login.
  • Nhiều mã trạng thái 401 (Unauthorized) hoặc 403 (Forbidden) từ cùng một IP.
  • Tốc độ yêu cầu cực nhanh từ một IP.

Sử dụng grepawk để lọc

# Tìm các IP gửi > 100 yêu cầu tới /wp-login.php trong 1 phút
# Cần điều chỉnh awk để xử lý timestamp nếu cần độ chính xác cao hơn
grep '/wp-login.php' /var/log/nginx/access.log | awk '{print $1, $4}' | sort | uniq -c | awk '$1 > 100 {print $2, $1}' | sort -nr
  • grep '/wp-login.php': Lọc các dòng log chứa đường dẫn đăng nhập.
  • awk '{print $1, $4}': Trích xuất IP và timestamp (cần điều chỉnh nếu timestamp không ở cột 4).
  • sort | uniq -c: Đếm số lần xuất hiện.
  • awk '$1 > 100 {print $2, $1}': Lọc ra các IP có số lượng yêu cầu > 100 và in ra IP cùng số lượng.
  • sort -nr: Sắp xếp theo số lượng yêu cầu giảm dần.

Dấu hiệu của tấn công DDoS đơn giản (HTTP Flood)

  • Một hoặc nhiều IP gửi lượng truy cập khổng lồ đến toàn bộ website hoặc các trang cụ thể.
  • Tất cả hoặc phần lớn các yêu cầu có mã trạng thái 200 (OK) nhưng không có giá trị thực tế.
  • Tăng đột biến traffic CPU/Network trên server.

Lọc IP có tỷ lệ lỗi cao

Các cuộc tấn công đôi khi cố tình tạo ra lỗi trên server.

# Tìm IP có > 50 yêu cầu trả về mã lỗi 5xx
grep -E ' 5[0-9]{2} ' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10
  • grep -E ' 5[0-9]{2} ': Tìm các dòng log chứa mã trạng thái 5xx (lỗi server). Lưu ý khoảng trắng để tránh nhầm lẫn.
  • Các lệnh tiếp theo tương tự như đếm IP truy cập nhiều nhất.

💡 Mẹo: Kết hợp phân tích mã trạng thái (4xx, 5xx) với số lượng yêu cầu để xác định IP đáng ngờ.

Phân tích User Agent và Referer

Tóm gọn: User Agent cho biết trình duyệt/bot nào đang truy cập, Referer cho biết nguồn gốc truy cập. Thông tin này giúp phát hiện bot độc hại và phân tích nguồn traffic.

Trích xuất User Agent phổ biến

awk -F'"' '{print $12}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
  • awk -F'"' '{print $12}': Sử dụng dấu nháy kép " làm dấu phân cách và lấy trường thứ 12 (thường là User Agent trong định dạng combined).
  • Các lệnh sort, uniq -c, sort -nr, head dùng để đếm và hiển thị các User Agent phổ biến nhất.

Output mẫu:

  15432 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
   9876 Googlebot/2.1 (+http://www.google.com/bot.html)
   5432 curl/7.68.0
   3210 Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1
   1024 python-requests/2.25.1

Phát hiện User Agent giả mạo hoặc độc hại

Các bot độc hại thường giả dạng trình duyệt phổ biến hoặc sử dụng User Agent lạ.

# Tìm các User Agent không phải là trình duyệt phổ biến hoặc bot search engine
awk -F'"' '{print $12}' /var/log/nginx/access.log | grep -v -E 'Googlebot|Bingbot|Slurp|DuckDuckBot|Chrome|Firefox|Safari|MSIE|Edge' | sort | uniq -c | sort -nr
  • grep -v -E '...': Loại bỏ các User Agent đã biết (Googlebot, Chrome, Firefox…).
  • Các User Agent còn lại có thể là bot độc hại hoặc scraper.

Phân tích Referer

awk -F'"' '{print $10}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
  • awk -F'"' '{print $10}': Trích xuất Referer (thường ở trường thứ 10).

Output mẫu:

  15432 https://www.google.com/
   9876 https://vsis.net/blog/
   5432 https://www.bing.com/
   3210 -
   1024 https://duckduckgo.com/
  • "-": Cho biết không có Referer (thường là truy cập trực tiếp hoặc từ một số ứng dụng).
  • Các Referer lạ hoặc không mong muốn có thể là dấu hiệu của spam hoặc traffic không chất lượng.

⚠️ Cảnh báo: Việc lọc User Agent hoặc Referer cần cẩn thận để không loại bỏ nhầm các bot hợp lệ (như Googlebot) hoặc các nguồn traffic thực sự.

Sử dụng công cụ chuyên dụng: GoAccess

Tóm gọn: GoAccess là công cụ phân tích log thời gian thực mạnh mẽ, cung cấp giao diện web trực quan và nhiều thông tin chi tiết.

Cài đặt GoAccess

sudo apt update
sudo apt install -y goaccess

Chạy GoAccess để phân tích log

goaccess /var/log/nginx/access.log -o /var/www/html/goaccess/index.html --log-format=COMBINED --real-time-html
  • /var/log/nginx/access.log: Đường dẫn đến file log NGINX của bạn.
  • -o /var/www/html/goaccess/index.html: Xuất báo cáo HTML ra thư mục web server. Bạn cần đảm bảo thư mục này có thể truy cập được qua trình duyệt.
  • --log-format=COMBINED: Chỉ định định dạng log (phải khớp với cấu hình NGINX).
  • --real-time-html: Cập nhật báo cáo theo thời gian thực.

Truy cập báo cáo GoAccess

Mở trình duyệt và truy cập địa chỉ IP của server bạn, theo sau là đường dẫn đến file HTML đã xuất (ví dụ: http://your_server_ip/goaccess/index.html).

GoAccess cung cấp các biểu đồ và bảng thống kê chi tiết về:

  • Tổng quan traffic.
  • IP truy cập nhiều nhất.
  • Các trang được truy cập nhiều nhất.
  • User Agent, Referer.
  • Mã trạng thái HTTP.
  • Vị trí địa lý của IP (nếu bật GeoIP).

💡 Mẹo: Cấu hình NGINX để phục vụ thư mục chứa báo cáo GoAccess một cách an toàn, có thể đặt mật khẩu hoặc giới hạn IP truy cập.

Pitfalls & lỗi thường gặp

Tóm gọn: Phân tích log không phải lúc nào cũng suôn sẻ, bạn có thể gặp các vấn đề về định dạng, quyền truy cập hoặc hiểu sai dữ liệu.

  1. Sai định dạng log:
    • Lỗi: Lệnh awk hoặc goaccess không trích xuất đúng thông tin vì định dạng log không khớp với cấu hình.
    • Fix: Luôn kiểm tra định dạng log NGINX (log_format trong nginx.conf) và điều chỉnh các lệnh cho phù hợp. Ví dụ, nếu IP không ở cột 1, bạn cần sửa awk '{print $1}'.
  2. Logrotate làm mất dữ liệu cũ:
    • Lỗi: Khi file log được xoay vòng (logrotate), các file cũ có thể bị nén hoặc xóa, khiến việc phân tích lịch sử dài hạn trở nên khó khăn.
    • Fix: Cấu hình logrotate để giữ lại các file log cũ lâu hơn hoặc nén chúng một cách phù hợp. Bạn cũng có thể cấu hình NGINX ghi log vào một file duy nhất hoặc sử dụng các giải pháp tập trung log như ELK stack.
  3. Quyền truy cập file log:
    • Lỗi: Người dùng chạy lệnh phân tích không có quyền đọc file /var/log/nginx/access.log.
    • Fix: Sử dụng sudo khi chạy các lệnh phân tích log, hoặc thêm người dùng vào nhóm adm (trên một số hệ thống).
      bash
      sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
  4. Hiệu suất khi phân tích file log lớn:
    • Lỗi: Phân tích file log hàng GB bằng các lệnh shell đơn giản có thể rất chậm và tốn tài nguyên.
    • Fix: Sử dụng các công cụ tối ưu hóa hơn như goaccess, hoặc cân nhắc các giải pháp log management chuyên nghiệp. Đối với các file cực lớn, bạn có thể cần chia nhỏ file log hoặc sử dụng các công cụ xử lý dữ liệu lớn.
  5. Nhầm lẫn giữa IP nội bộ và IP công cộng:

    • Lỗi: Nếu server của bạn nằm sau một NAT gateway hoặc load balancer, $remote_addr có thể là IP của gateway/load balancer chứ không phải IP thực của client.
    • Fix: Cấu hình NGINX sử dụng header X-Forwarded-For hoặc X-Real-IP để lấy IP thực của client. Bạn cần thêm set_real_ip_fromreal_ip_header vào cấu hình NGINX.

    nginx
    http {
    # ...
    set_real_ip_from 192.168.1.0/24; # Dải IP của proxy/load balancer
    set_real_ip_from 10.0.0.0/8;
    real_ip_header X-Forwarded-For;
    # ...
    }

    Sau đó, lệnh awk '{print $1}' sẽ trích xuất IP từ X-Forwarded-For.

Key takeaways

Tóm gọn: Phân tích NGINX log là kỹ năng thiết yếu để bảo mật và tối ưu server.

  • Hiểu rõ định dạng log NGINX (combined, common) là bước đầu tiên.
  • Sử dụng các công cụ dòng lệnh Linux (awk, sort, uniq, grep) để thống kê IP, phát hiện truy cập bất thường.
  • Theo dõi số lượng yêu cầu, mã trạng thái (4xx, 5xx), User Agent và Referer để nhận diện tấn công.
  • GoAccess là công cụ mạnh mẽ cung cấp báo cáo trực quan và phân tích thời gian thực.
  • Luôn chú ý đến các lỗi thường gặp như sai định dạng log, quyền truy cập và cấu hình proxy.

FAQ

### Làm thế nào để xem log NGINX theo thời gian thực?

Bạn có thể sử dụng lệnh tail -f /var/log/nginx/access.log để xem các dòng log mới nhất ngay khi chúng được ghi.

### IP nào đang tấn công website của tôi?

Hãy chạy các lệnh awksort để tìm IP có số lượng yêu cầu cao bất thường, đặc biệt là các yêu cầu tới trang đăng nhập hoặc trả về lỗi 4xx/5xx. Xem thêm phần “Phát hiện IP tấn công”.

### Làm sao để chặn IP xấu?

Sau khi xác định được IP tấn công, bạn có thể chặn chúng bằng iptables hoặc cấu hình NGINX để trả về 403 Forbidden.

# Chặn IP bằng iptables
sudo iptables -A INPUT -s <IP_ADDRESS> -j DROP

### GoAccess có cần cài đặt trên server không?

Có, GoAccess cần được cài đặt trên server có quyền truy cập vào file log NGINX. Bạn có thể cấu hình nó để xuất báo cáo ra thư mục web.

### Tôi có thể phân tích log NGINX từ xa không?

Có, bạn có thể sao chép file log về máy local và phân tích, hoặc sử dụng các công cụ tập trung log như Filebeat, Logstash để gửi log về server phân tích trung tâm.

### Làm thế nào để cấu hình NGINX ghi log theo định dạng tùy chỉnh?

Sử dụng directive log_format trong file cấu hình NGINX của bạn, sau đó áp dụng định dạng đó cho access log bằng access_log.

Cần VPS chạy NGINX ổn định?

Tóm gọn: Để website hoạt động trơn tru và an toàn, bạn cần một nền tảng VPS mạnh mẽ, ổn định.

Việc phân tích log giúp bạn phát hiện và xử lý sự cố kịp thời. Tuy nhiên, để hệ thống luôn hoạt động tốt, bạn cần một nhà cung cấp VPS uy tín. Tại vsis.net, chúng tôi cung cấp các giải pháp VPS hiệu năng cao, tối ưu cho NGINX, đảm bảo tốc độ và độ tin cậy.

Đừng để website của bạn bị gián đoạn. Nâng cấp lên VPS tại vsis.net/vps ngay hôm nay để trải nghiệm sự khác biệt!

Lên đầu trang