Phân biệt bị tấn công DDoS với quá tải do chính hệ thống

Hệ thống chậm hẳn hoặc không truy cập được. Câu hỏi đầu tiên không phải “chống đỡ thế nào” mà “có đúng là bị tấn công không”. Trả lời sai câu này thì mọi việc sau đó đi lệch hướng, và mất thêm thời gian trong lúc dịch vụ đang dừng.

Bài này đưa ra cách phân biệt dựa trên số đo, không dựa trên cảm nhận.

1. Vì sao câu hỏi này quan trọng

Hai loại sự cố, hai cách xử lý ngược nhau:

Bị tấn công từ ngoài Quá tải do chính hệ thống
Nguồn lưu lượng Nhiều địa chỉ lạ, phân tán Lưu lượng bình thường, hoặc một tiến trình nội bộ
Cách xử lý Lọc, chặn, đưa qua lớp bảo vệ Tìm chỗ nghẽn bên trong, sửa truy vấn, thêm tài nguyên
Ai xử lý chính Cloudzone, ở lớp mạng Quý Khách hàng, ở lớp ứng dụng

Đưa một đợt quá tải nội bộ qua lớp chống tấn công thì lưu lượng vẫn tới, vì nó là lưu lượng thật. Ngược lại, thêm máy chủ cho một đợt tấn công thật chỉ là trả thêm tiền để bị đánh sập chậm hơn một chút.

2. Bốn trường hợp thường gặp, không chỉ hai

Thực tế không chỉ có “bị đánh” hay “tự quá tải”. Có bốn trường hợp, và hai trường hợp giữa hay bị nhận lầm là tấn công:

Trường hợp Dấu hiệu nhận ra
Tấn công thật Lưu lượng vào tăng vọt, từ rất nhiều địa chỉ, nội dung yêu cầu vô nghĩa hoặc lặp lại
Tăng tải thật, hợp lệ Lưu lượng tăng nhưng từ các địa chỉ và vùng quen, có lý do: chiến dịch quảng cáo, bài viết lan truyền, ngày cuối tháng
Rô bốt quét hàng loạt Lưu lượng vừa phải nhưng tập trung vào một đường dẫn, dấu nhận dạng trình duyệt giống nhau, có khi là công cụ thu thập dữ liệu
Tự quá tải Lưu lượng vào không tăng, nhưng hệ thống vẫn chậm. Nguyên nhân nằm bên trong

Trường hợp thứ hai và thứ ba không phải tấn công, nhưng cũng làm dịch vụ không truy cập được. Xử lý chúng như tấn công là chặn mất khách thật.

3. Bước một: lưu lượng vào có tăng không

Đây là câu hỏi phân nhánh quan trọng nhất. Lưu lượng không tăng mà hệ thống vẫn chậm thì gần như chắc chắn không phải tấn công.

# Luu luong tren card mang, lay mau moi giay
# Can goi iproute2 va sysstat
sar -n DEV 1 10

# Hoac xem nhanh, lap lai hai lan roi tru
cat /proc/net/dev

Xem số kết nối đang mở:

# Dem ket noi theo trang thai
ss -ant | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn

# Dem ket noi theo dia chi nguon, 20 dia chi nhieu nhat
ss -ant | awk 'NR>1 {print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20

Cách đọc kết quả lệnh cuối:

Thấy gì Nghĩa là
Hàng nghìn kết nối rải trên hàng nghìn địa chỉ khác nhau Dấu hiệu tấn công phân tán
Hàng nghìn kết nối từ vài chục địa chỉ Có thể là rô bốt quét, hoặc một ứng dụng khách cấu hình sai
Số kết nối bình thường Không phải vấn đề lưu lượng. Sang mục 5
Rất nhiều kết nối ở trạng thái SYN-RECV Dấu hiệu tấn công vào quá trình bắt tay kết nối

4. Bước hai: lưu lượng tăng, nhưng của ai

Lưu lượng có tăng thì chưa kết luận được. Phải xem nó trông như thật hay không.

Đếm theo địa chỉ trong nhật ký máy chủ web:

# Hai muoi dia chi goi nhieu nhat trong nhat ky
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

# Hai muoi duong dan bi goi nhieu nhat
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

# Dau nhan dang trinh duyet, xem co giong nhau bat thuong khong
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -15

Trên Apache, đổi đường dẫn thành /var/log/apache2/access.log hoặc /var/log/httpd/access_log.

Bốn dấu hiệu cho thấy lưu lượng không phải khách thật:

  1. Dấu nhận dạng trình duyệt giống hệt nhau trên hàng nghìn yêu cầu, hoặc để trống, hoặc là tên một thư viện lập trình.
  2. Yêu cầu tập trung vào đúng một đường dẫn, thường là trang tìm kiếm, trang đăng nhập, hoặc một đường dẫn không tồn tại.
  3. Không tải tài nguyên kèm theo. Khách thật mở một trang thì tải theo hàng chục tệp ảnh, kiểu chữ, mã lệnh. Rô bốt chỉ gọi đúng trang đó.
  4. Phân bố theo vùng bất thường so với tập khách hàng thật.

Ngược lại, bốn dấu hiệu cho thấy lưu lượng là thật:

  1. Dấu nhận dạng trình duyệt đa dạng, đúng tỷ lệ các loại thiết bị quen thấy.
  2. Có tải tài nguyên kèm theo, tỷ lệ gần như mọi khi.
  3. Đường dẫn đa dạng, giống thói quen bình thường.
  4. Có lý do giải thích được: vừa chạy quảng cáo, vừa gửi thư hàng loạt, có bài được chia sẻ nhiều.

Dấu hiệu thứ tư ở nhóm sau là dấu hiệu bị bỏ qua nhiều nhất. Trước khi kết luận bị tấn công, hãy hỏi bộ phận kinh doanh và bộ phận nội dung xem hôm nay có chiến dịch gì không.

5. Khi lưu lượng không tăng: tìm chỗ nghẽn bên trong

Lưu lượng bình thường mà hệ thống vẫn chậm thì nguyên nhân nằm bên trong. Bốn chỗ cần soi, theo thứ tự này.

a. CPU

top -bn1 | head -20

Một tiến trình chiếm gần hết CPU thì đó là manh mối. Hay gặp: một truy vấn cơ sở dữ liệu thiếu chỉ mục, một tác vụ theo lịch chạy trùng giờ cao điểm, một vòng lặp trong mã nguồn vừa triển khai.

b. Đĩa

iostat -x 5 3
# Hoac xem tien trinh nao doc ghi nhieu
sudo iotop -o

await cao kèm %util gần một trăm nghĩa là đĩa đang nghẽn. Thường vì nhật ký ghi quá nhiều, hoặc cơ sở dữ liệu phải đọc cả bảng.

c. RAM và phần đổi ra đĩa

free -h
vmstat 5 5

Nếu cột si và so trong vmstat khác không liên tục thì hệ thống đang đổi dữ liệu ra đĩa. Đây là nguyên nhân làm chậm rất nặng mà nhìn vào CPU không thấy.

d. Cơ sở dữ liệu

-- MySQL, MariaDB: xem truy van dang chay
SHOW FULL PROCESSLIST;
-- PostgreSQL
SELECT pid, now() - query_start AS chay_bao_lau, state, query
FROM pg_stat_activity
WHERE state <> 'idle'
ORDER BY chay_bao_lau DESC;

Thấy truy vấn chạy hàng chục giây, hoặc nhiều truy vấn cùng chờ nhau, thì đây là chỗ nghẽn. Trường hợp này thêm tài nguyên chỉ giúp tạm thời, phải sửa truy vấn hoặc thêm chỉ mục.

Một nguyên nhân đơn giản hay bị bỏ sót: hết chỗ trên đĩa. Đầy đĩa làm nhiều phần mềm hỏng theo cách rất khó hiểu.

df -h
df -i   # het so luong tep cung gay loi tuong tu

6. Bảng tra nhanh

Dùng bảng này trong lúc đang có sự cố.

Triệu chứng Khả năng cao là Việc tiếp theo
Lưu lượng vào tăng vọt, hàng nghìn địa chỉ lạ Tấn công phân tán Báo Cloudzone ngay, xem bài “Nghi bị tấn công DDoS”
Rất nhiều kết nối SYN-RECV Tấn công vào bắt tay kết nối Báo Cloudzone ngay
Lưu lượng tăng, địa chỉ và hành vi đều trông thật, có chiến dịch đang chạy Tăng tải hợp lệ Thêm tài nguyên, bật bộ đệm. Đừng chặn
Lưu lượng vừa phải, dồn vào một đường dẫn, dấu nhận dạng giống nhau Rô bốt quét Giới hạn tần suất theo địa chỉ, chặn theo dấu nhận dạng
Lưu lượng không tăng, CPU đầy vì một tiến trình Tự quá tải Tìm nguyên nhân theo mục 5a
Lưu lượng không tăng, đĩa nghẽn Tự quá tải Mục 5b
Lưu lượng không tăng, cơ sở dữ liệu treo truy vấn Tự quá tải Mục 5d
Mọi thứ bình thường nhưng đĩa đầy Hết chỗ lưu Dọn chỗ, rồi đặt cảnh báo dung lượng

7. Việc nên làm trước, lúc hệ thống còn bình thường

Việc phân biệt ở trên chỉ nhanh nếu có số liệu nền để so. Không biết lúc bình thường lưu lượng là bao nhiêu thì không biết hôm nay có bất thường hay không.

Ba việc đáng làm ngay khi chưa có sự cố:

Việc Vì sao
Ghi lại mức nền: lưu lượng, số kết nối, CPU, số yêu cầu mỗi giây ở giờ cao điểm và giờ thấp Đây chính là thước để so sánh. Không có nó thì mọi con số đều vô nghĩa
Giữ nhật ký máy chủ web đủ lâu, ít nhất hai tuần Nhật ký là bằng chứng duy nhất cho biết lưu lượng của ai
Đặt cảnh báo tự động khi lưu lượng hoặc CPU vượt ngưỡng Biết sớm hơn khách hàng gọi tới

Ghi mức nền không cần hệ thống giám sát phức tạp. Chạy vài lệnh ở mục 3 và mục 4 vào một ngày bình thường, lưu kết quả lại kèm ngày tháng, là đã có cái để so.

8. Khi cần hỗ trợ

Chưa phân biệt được là loại nào, hãy nhắn qua khung chat ở góc phải màn hình và gửi kèm:

  1. Kết quả sar -n DEV 1 10 hoặc số liệu lưu lượng của card mạng.
  2. Kết quả lệnh đếm kết nối theo địa chỉ ở mục 3.
  3. Hai mươi dòng đầu của hai lệnh đếm nhật ký ở mục 4.
  4. Thời điểm bắt đầu có hiện tượng.
  5. Có thay đổi gì trên hệ thống trong hai mươi bốn giờ trước đó không: triển khai mã mới, đổi cấu hình, chạy chiến dịch.

Thông tin thứ năm thường giải quyết được sự việc nhanh hơn bốn thông tin đầu cộng lại.

Nếu đã xác định là tấn công thì xem bài “Nghi bị tấn công DDoS: cần làm gì và báo gì cho Cloudzone” để biết gửi gì và chờ gì.

Hướng dẫn này có ích cho bạn?

Cần đặt dịch vụ? Xem cấu hình và giá tại bảng giá Cloudzone - đặt gói trực tuyến, nhận dịch vụ ngay sau thanh toán. Cần tư vấn, mở khung chat ở góc phải màn hình.

Hướng dẫn liên quan