Chƣơng 2 : TẤN CÔNG TỪ CHỐI DỊCH VỤ TỐC ĐỘ THẤP
2.3 Giải thuật RRED
Nhƣ đã đề cập, các dịng gói tin tấn cơng DoS tốc độ thấp có tốc độ gửi gói tin trung bình thấp nhƣng truyền các gói tin theo các xung tốc độ cao trong những khoảng thời gian ngắn. Các mẫu lƣu lƣợng nhƣ vậy có thể đƣợc các thuật tốn ở router xác định là tấn công DoS hay không? Câu hỏi này sẽ đƣợc giải đáp ở đây. Các cơ chế xử lý gói tin theo dịng ở router có thể đƣợc phân loại thành cơ chế xếp lịch và cơ chế loại bỏ gói tin theo ƣu tiên. Thực hiện cơ chế loại bỏ gói tin theo ƣu tiên dễ hơn so với thực hiện cơ chế xếp lịch. Cùng với các lợi thế khác của cơ chế loại bỏ gói tin theo ƣu tiên so với cơ chế xếp lịch, cơ chế loại bỏ gói tin theo ƣu tiên sẽ đƣợc tập trung nghiên cứu ở đây, đặc biệt dùng để phát hiện các dịng tấn cơng DoS và cơ chế này cũng đạt đƣợc sự cơng bằng giữa các dịng có khả năng thích ứng và các dịng khơng có khả năng thích ứng với điều kiện mạng. Phần này sẽ giải thích về thiết kế và thực hiện thuật tốn lọc tốc độ thấp RRED, sau đây tơi gọi là LF-RED (the Low-rate Filter LF-RED), 2 tên gọi này có thể dùng hốn đổi vị trí cho nhau và cùng là một thuật tốn.
Hình 2.4: Kiến trúc của LF-RED
Hình 2.4 mơ tả kiến trúc cơ bản của thuật tốn LF-RED. Một khối phát hiện và lọc gói tin (DF) đƣợc đặt trƣớc khối RED thông thƣờng trên một router. Ý tƣởng cơ bản của thuật toán LF-RED là phát hiện và lọc ra các gói tin đang đến router từ các dịng tấn cơng DoS tốc độ thấp trƣớc khi nó đƣợc chuyển đến khối RED.
Các gói tin TCP đến router thuộc các dịng gói tin khác nhau. Có 5 yếu tố đƣợc sử dụng để định nghĩa một dịng gói tin bao gồm: địa chỉ IP nguồn, địa chỉ cổng nguồn, địa chỉ IP đích, địa chỉ cổng đích, giao thức của gói tin. Một biến F.I đƣợc dùng để xác định dịng gói tin F là dịng TCP thơng thƣờng hay là dịng tấn cơng DoS tốc độ thấp. F.I đƣợc tính nhƣ sau:
Nếu một gói tin từ dịng F đƣợc coi là một gói tin tấn cơng thì F.I giảm một đơn vị (F.I = F.I - 1).
Nếu một gói tin từ dịng F đƣợc coi là một gói tin bình thƣờng thì F.I đƣợc tăng lên một đơn vị (F.I = F.I + 1).
Khi đó một gói tin đến router từ một dòng với giá trị F.I < 0 sẽ bị lọc ra. Các gói tin khác từ các dòng với F.I ≥ 0 sẽ tiếp tục đƣợc chuyển đến khối RED. Một gói tin đến router từ một dịng F đƣợc coi là một gói tin tấn công nếu một trong hai điều kiện sau đây xảy ra:
1. Gói tin này đến trong khoảng thời gian ngắn kể từ thời điểm cuối cùng một gói tin của dịng F bị lọc ra bởi khối DF.
2. Gói tin này đến trong khoảng thời gian ngắn kể từ thời điểm cuối cùng một gói tin của bất kỳ dịng nào đến router bị lọc ra bởi khối RED.
Khoảng thời gian ngắn đƣợc định nghĩa là [Tmax, Tmax + T*], trong đó: Tmax = MAX(F.T1, T2)
Trong cơng thức này, với mỗi dịng F (khơng phân biệt là dịng TCP thơng thƣờng hay dịng tấn cơng DoS tốc độ thấp):
F.T1 là thời gian đến của gói tin cuối cùng từ dịng F bị loại ra bởi khối DF.
T2 là thời gian đến của gói tin cuối cùng từ bất kỳ dòng nào bị loại ra bởi khối RED.
T* là một hằng số và đƣợc chọn sao cho có thể lọc ra hầu hết các gói tin tấn công và không lọc hầu hết các gói tin thơng thƣờng. Theo [3] chọn T* = 10 (ms) đạt đƣợc hiệu quả lọc ra các gói tin tấn cơng tốc độ thấp.
Nếu thời gian đến của một gói tin thuộc dịng F rơi vào khoảng này thì gói tin đó đƣợc coi là gói tin tấn cơng. Chú ý rằng giá trị T1 là khác nhau đối với mỗi dòng còn giá trị T2 là chung cho tất cả các dòng, chúng lần lƣợt lƣu giữ đặc điểm cơ bản của dòng tấn công DoS tốc độ thấp và ảnh hƣởng tổng thể của cuộc tấn cơng đối với tồn bộ mạng.
Để lƣu thông tin của một số lƣợng lớn các dịng gói tin đến router ngƣời ta sử dụng kỹ thuật Bloom-filters [2].
Bộ lọc Bloom đƣợc đƣa ra năm 1970 bởi H. Bloom.
Bộ lọc Bloom là một cấu trúc dữ liệu đƣợc sử dụng để hỗ trợ cho các truy vấn để kiểm tra xem một phần tử có thuộc vào một tập hợp hay khơng. Các đặc điểm chính của bộ lọc Bloom là:
Khơng gian bộ nhớ dùng để lƣu bộ lọc Bloom nhỏ hơn so với tổng số dữ liệu thuộc tập hợp.
Thời gian để kiểm tra một phần tử có thuộc vào một tập hợp hay khơng khơng phụ thuộc vào số phần tử của tập hợp đó.
Nếu phần tử thuộc vào tập hợp thì câu trả lời ln đúng.
Nếu phần tử không thuộc vào tập hợp thì câu trả lời vẫn có thể là có thuộc vào tập hợp vì cách sử dụng hàm băm, trong thực tế ln có một tần suất lỗi này và có thể điều khiển đƣợc.
Một bộ lọc Bloom dựa trên một mảng gồm m bít (b1, b2, …, bm) đƣợc khởi tạo là vectơ không (0, 0, …, 0).
Ngƣời ta sử dụng k hàm băm (h1, h2, …, hk) mỗi hàm trả về giá trị từ 1 đến m. Để lƣu một phần tử vào mảng bít trên, mỗi hàm băm sẽ đƣợc áp dụng vào phần tử đó. Dựa trên mảng giá trị trả về (r1, r2, …, rk) đặt các bít trong mảng b ở các vị trí tƣơng ứng thành 1. Bởi vì có k hàm băm nên nhiều nhất là k bít trong mảng b đƣợc đặt giá trị là 1 (có thể ít hơn vì một vài hàm băm có thể trả về cùng một giá trị). Hình 2.5 mô tả một bộ lọc Bloom với m = 16, k = 4 và e là phần tử cần lƣu vào mảng bít.
Hình 2.5: Một bộ lọc Bloom
Để kiểm tra một phần tử e đã đƣợc lƣu vào mảng bít hay chƣa, áp dụng k hàm băm này vào phần tử e đƣợc k giá trị trả về (r1, r2, …, rk), kiểm tra xem các bít ở các vị trí tƣơng ứng có giá trị là 1 hay khơng, nếu đều là 1 thì e thuộc tập hợp, nếu có bất kỳ giá trị nào là 0 thì e khơng thuộc tập hợp.
Trong thuật tốn LF-RED, bộ lọc Bloom đƣợc xây dựng với L mức, mỗi mức bao gồm N biến. Ở mỗi mức có một hàm băm riêng biệt. Một dịng gói tin sẽ đƣợc ánh xạ tới L biến, mỗi biến nằm trên một mức.
Nếu một gói tin thuộc một dịng đƣợc coi là gói tin tấn cơng, tất cả L biến của dịng F đó sẽ giảm đi một đơn vị. Ngƣợc lại, tất cả L biến của dòng F sẽ tăng lên một đơn vị nếu gói tin đƣợc coi là gói tin thơng thƣờng.
Trong một mức cụ thể, một dịng tấn cơng DoS tốc độ thấp có thể cùng chia sẻ một biến với dịng thơng thƣờng. Chính vì vậy có thể xảy ra tình huống một dịng thơng thƣờng bị “đầu độc” bởi một dịng tấn cơng DoS tốc độ thấp do biến chia sẻ này. Để tránh tình huống này ngƣời ta đặt cận trên là 10 và cận dƣới là -1 cho mỗi biến. Vì vậy một dịng tấn cơng DoS tốc độ thấp không thể “đầu độc” một dịng bình thƣờng bằng việc giảm giá trị biến chia sẻ tới một giá trị âm quá thấp. Khi đó biến F.I của một dòng F là giá trị lớn nhất của L biến tƣơng ứng với dịng F đó. Giả mã của thuật tốn LF-RED nhƣ sau:
LFRED − ENQUE(pkt)
1: f ← LFRED–FLOWHASH(pkt) 2: Tmax ← MAX(Flow[f].T1, T2)
3: if pkt.arrivaltime [Tmax, Tmax + T*] then
4: Giảm chỉ số cục bộ đi 1 cho mỗi ô nhớ của luồng f 5: else
6: Tăng chỉ số cục bộ lên 1 cho mỗi ô nhớ của luồng f 7: end if
8: Flow[f].I ← Giá trị lớn nhất của các chỉ số cục bộ của luồng f 9: if Flow[f].I ≥ 0 then
10: RED−ENQUE(pkt) //pass pkt to the RED block 11: if RED drops pkt then
13: end if 14: else 15: Flow[f].T1 ← pkt.arrivaltime 16: drop(pkt) 17: end if 18: return