Trong khóa học Machine Learning của Stanford, Andrew Ng đã đề cập đến việc áp dụng ML trong CNTT. Một thời gian sau khi tôi có kích thước vừa phải (khoảng 20 nghìn bot) DDoS trên trang web của chúng tôi, tôi quyết định chiến đấu chống lại nó bằng cách sử dụng trình phân loại Mạng thần kinh đơn giản.
Tôi đã viết kịch bản python này trong khoảng 30 phút:
https://github.com/SaveTheRbtz/junk/tree/master/neural_networks_vs_ddos
Nó sử dụng pyBrain và lấy 3 nginx log làm đầu vào, hai trong số chúng để huấn luyện Mạng thần kinh:
- Với các truy vấn tốt
- Với những người xấu
Và một bản ghi để phân loại
Từ các truy vấn xấu ..
0.0.0.0 - - [20/Dec/2011:20:00:08 +0400] "POST /forum/index.php HTTP/1.1" 503 107 "http://www.mozilla-europe.org/" "-"
...và tốt...
0.0.0.0 - - [20/Dec/2011:15:00:03 +0400] "GET /forum/rss.php?topic=347425 HTTP/1.0" 200 1685 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9) Gecko/2008052906 Firefox/3.0"
... nó xây dựng một từ điển:
['__UA___OS_U', '__UA_EMPTY', '__REQ___METHOD_POST', '__REQ___HTTP_VER_HTTP/1.0',
'__REQ___URL___NETLOC_', '__REQ___URL___PATH_/forum/rss.php', '__REQ___URL___PATH_/forum/index.php',
'__REQ___URL___SCHEME_', '__REQ___HTTP_VER_HTTP/1.1', '__UA___VER_Firefox/3.0',
'__REFER___NETLOC_www.mozilla-europe.org', '__UA___OS_Windows', '__UA___BASE_Mozilla/5.0',
'__CODE_503', '__UA___OS_pl', '__REFER___PATH_/', '__REFER___SCHEME_http', '__NO_REFER__',
'__REQ___METHOD_GET', '__UA___OS_Windows NT 5.1', '__UA___OS_rv:1.9',
'__REQ___URL___QS_topic', '__UA___VER_Gecko/2008052906']
Mỗi mục mà chúng tôi đào tạo mạng của chúng tôi với / mục mà chúng tôi cần phân loại ...
0.0.0.0 - - [20/Dec/2011:20:00:01 +0400] "GET /forum/viewtopic.php?t=425550 HTTP/1.1" 502 107 "-" "BTWebClient/3000(25824)"
... được chuyển đổi thành vector tính năng:
[False, False, False, False, True, False, False, True, True, False, False, False, False, False, False, False, False, True, True, False, False, False, False]
Sau tất cả những điều này, có đường dẫn tiêu chuẩn để chia dữ liệu thành tập huấn luyện và kiểm tra, đào tạo mạng lưới thần kinh và chọn ra mạng tốt nhất. Sau quá trình này (có thể mất nhiều thời gian tùy thuộc vào kích thước tập dữ liệu), cuối cùng chúng ta cũng có thể phân loại nhật ký bằng cách sử dụng mạng được đào tạo.
Nhưng đây là một số vấn đề với cách tiếp cận đó:
- Học máy được giám sát là sai đối với loại vấn đề đó, bởi vì để phát hiện các bot trước tiên tôi cần phát hiện các bot và huấn luyện Mạng thần kinh với dữ liệu đó.
- Tôi không đưa hành vi của khách hàng vào một tài khoản. Tốt hơn là xem xét biểu đồ chuyển trang từ trang này sang trang khác cho mỗi người dùng.
- Tôi không đưa khách hàng vào tài khoản. Nếu một máy tính trong mạng bị nhiễm một số vi-rút thì có nhiều khả năng các máy tính khác trong mạng đó bị nhiễm.
- Tôi không lấy dữ liệu định vị địa lý vào tài khoản. Tất nhiên nếu bạn đang điều hành trang web ở Nga thì có rất ít cơ hội của khách hàng từ Brazil.
- Tôi không biết liệu đó có phải là cách đúng đắn để sử dụng mạng lưới thần kinh và phân loại để giải quyết vấn đề như vậy. Có thể tôi đã tốt hơn với một số hệ thống phát hiện bất thường.
- Sẽ tốt hơn khi phương thức ML là "trực tuyến" (hay còn gọi là "phát trực tuyến") để nó có thể được đào tạo nhanh chóng.
Vì vậy, đây là câu hỏi:
Bạn sẽ làm gì nếu gặp phải vấn đề tương tự chống lại cuộc tấn công DDoS chỉ bằng nhật ký máy chủ web hiện tại (bao gồm các máy khách và bot tốt) và dữ liệu lịch sử (nhật ký cho ngày / tuần / tháng trước với khách hàng chủ yếu là tốt)?
Bạn sẽ chọn cách tiếp cận Machine Learning nào.
Những thuật toán bạn sẽ sử dụng?