Machine Learning với tôi chỉ là 1 công cụ để phục vụ Security

Lâu lắm rồi kể từ ngày xạo chó về phong cách thi mới lạ của Đại học Y, đến hôm nay tôi mới bắt đầu quay lại và từ giờ sẽ thực sự bắt đầu viết đều đặn hơn. Lý do rất đơn giản là do chỉ thị của cấp trên yêu cầu viết mỗi tuần 1 bài trên Medium về những j mình nghiên cứu và làm.

Trong bài viết này, tôi sẽ khái quát qua 1 loạt về việc sử dụng Machine Learning trong Security. Bản thân tôi với main skill là Security, do đó Machine Learning đối với tôi cũng chỉ mới dừng lại ở mức là 1 công cụ để ứng dụng vào Security mà thôi. Tôi ko nghiên cứu nó từ những năm đại học, mà mới chỉ tự mò mẫm từ hồi đầu tháng 4, cũng chẳng nghiên cứu chuyên sâu lý thuyết về nó, cũng chẳng có ý định đi học PhD về ngành này, ...; do đó, mục tiêu cũng khá đơn giản. Chỉ cần hiểu và sử dụng được các kết quả nghiên cứu đã đc công bố để đem áp dụng vào Security là được. Ngoài ra thì cũng sẽ tìm hiểu mở rộng hơn vài tí để nhỡ đâu có khi lại kiếm đc cái j hay ho sử dụng được.

Ở đây, tôi sẽ ko trình bày theo kiểu "dạy" lại toàn bộ về Machine Learning, do đó nếu muốn học Machine Learning thực sự, các bạn có thể học khóa Machine Learning trên Coursera của giáo sư Andrew Ng, tiếp cận để lấy cái nhìn tổng quan thông qua quyển Hands-On Machine Learning with Scikit-Learn and TensorFlow hoặc Machine Learning cơ bản nếu sợ tiếng Anh. Sau đó, để thực sự tu luyện theo "võ học chính tông" của Machine Learning, bạn có thể đọc quyền Machine Learning: A Probabilistic Perspective.

Vì sao lại là "võ học chính tông"? Liệu bạn đã từng nghe đến khái niệm "Deep Learning"? Chính cái Deep Learning này cùng với bọn truyền thông ngu học đã làm nhiều người sa vào tà đạo vì cứ ngỡ Deep Learning là vạn năng. Kỳ thực Deep Learning cũng chỉ là 1 kỹ thuật trong các kỹ thuật học của Machine Learning. Nói ko phải có ý cà khịa các bạn chuyên về Deep Learning đâu, nhưng mà thằng bạn đại học mình có nói vs mình đại ý là "hiện tại đang có 2 trường phái chính về Machine Learning, 1 là Deep Learning, còn lại là theo kiểu Generative Model và Bayesian Inference. Trường phái thứ nhất thì chả có chứng minh đúng đắn bằng Toán học j cả, cứ code ra cái mạng neural trông nguy hiểm, chạy lòi kèn được cái model có tính fitting hiệu quả 1 chút thì là xong. Còn cái trường phai kia thì nặng về Toán, cụ thể như Thống kê, Xác suất, cũng như nhiều mô hình Toán học, có chứng minh Toán học rõ ràng; thế nên nó khó hơn hẳn, và rất ít người dám theo trường phái này".

Để các bạn có thể tin tưởng hơn về quan điểm này, các bạn có thể đọc bài viết này của GS Truyền Trần về cách nhìn của các chuyên gia với Deep Learning. Giáo sư cùng với thầy của thằng bạn mình đều là thành viên trong nhóm nghiên cứu VinAI của Mr Vượng; họ đều có hiểu biết sâu rộng về Generative Model. Các bạn cũng có thể thấy ngay 1 hiện tượng thực tế là trong các forum về Machine Learning của người Việt, đa số các bài đăng đều nói về mạng neural và Deep Learning, rất hiếm khi thấy bài đăng nào về trường phái kia.

Do đó, nếu muốn học thực sự về Machine Learning, các bạn nên đọc thêm những quyển sách viết theo kiểu của quyển Machine Learning: A Probabilistic Perspective. Ở đây, người ta chỉ coi Deep Learning là 1 công cụ rất nhỏ bé và ko có tí Toán nào trong rất nhiều công cụ Machine Learning khác.

Ứng dụng của Machine Learning vào Security (Nguồn: PentestMag)
Hình ảnh trên thể hiện một cách tiếp cận bottom-up về việc sử dụng Machine Learning vào Security. Có lẽ nhiều bạn ko thích cách tiếp cận này lắm, nhưng rất tiếc là tôi chưa tích lũy đủ hiểu biết về cả 2 lĩnh vực này để có thể đưa ra 1 cách tiếp cận theo kiểu top-down nào đó thật rõ ràng. Thời buổi này, thường thì những người làm Security sẽ ko rành về Machine Learning, còn những ông giỏi về Machine Learning thì lại ko có đủ kiến thức về Security; còn bản thân tôi thì gà cả 2 nên đành phải đọc thêm nhiều hơn thôi.

Tóm lược những khái niệm cơ bản.

Supervised Learning.

Hay còn gọi là "học có giám sát". Đây là thuật ngữ nói về nhóm các thuật toán được dùng để xử lý những dữ liệu có nhãn. Ví dụ như việc 1 email được coi là spam hoặc ko, hành vi gọi các hàm hệ thống như này được xem là bất thường hay bình thường, ... 

Học có giám sát thường được dùng để dự đoán kết quả chưa biết với những dữ kiện đã biết. Ví dụ 1 email sẽ bị coi là spam nếu có những từ thuộc 1 tập nào đó, 1 service bị coi là bất thường nếu ta thấy nó gọi đến 1 tập các hàm api nào đó của hệ thống. Loại kết quả dự đoán sẽ phụ thuộc tương ứng vào từng loại thuật toán. Nếu là Regression, kết quả dự đoán sẽ là 1 giá trị nào đó nằm trong 1 khoảng liên tục xác định (ví dụ như thông lượng đi qua 1 switch tại thời điểm nào đó trong ngày); nếu là Classification, kết quả dự đoán sẽ chỉ gói gọn trong 1 tập giá trị cho trước (ví dụ email là spam hay ko, hành vi của service thuộc loại nào trong các loại {scan, compromise, exploit}).

Mấu chốt của Học có giám sát nằm ở việc dữ liệu để học phải có nhãn, và lượng dữ liệu đầu vào để huấn luyện cũng phải khá lớn để đảm bảo model có thể đưa ra những dự đoán khả thi với những dữ liệu chưa có nhãn mà ta cần dự đoán nhãn.

Unsupervised Learning.

Hay còn gọi là "học không giám sát". Đây là thuật ngữ nói về nhóm các thuật toán được dùng để xử lý những tập dữ liệu không có nhãn. Ví dụ như họ các loại mã độc khác nhau sẽ có những khuôn mẫu hành vi khá giống nhau, do đó tập hợp các hành vi này thường có thể được nhóm thành 1 cụm lớn.

Học ko giám sát thường được dùng nhiều cho việc phân cụm và nén dữ liệu. Do dữ liệu đầu vào ko hề có nhãn, chỉ là tập các hành vi quan sát được mà chưa biết có j nguy hiểm hay ko. Do đó người ta thường phân cụm các hành vi lại thành các nhóm mà các hành vi trong cùng 1 nhóm thì sẽ có mục đích gần tương tự nhau (ví dụ như đều mở port, hoặc đều gọi đến 1 số hàm nào đó của hệ thống). 

Còn đối với việc nén dữ liệu, thì những dữ liệu quan trọng và có nhiều ý nghĩa sẽ được giữ lại, những dữ liệu ít quan trọng sẽ được loại bỏ bớt để lưu trữ tiết kiệm và sử dụng nhanh hơn. Ví dụ để đánh giá tổng quan hành vi của 1 khu vực mạng, người ta chỉ cần quan tâm đến các máy tính có nhiều hoạt động trong mạng hơn là các máy tính chỉ có rất ít hoạt động. Vì log hệ thống sẽ ghi lại toàn bộ các hoạt động trong hệ thống mạng, nên ta có thể nén log xuống, giảm kích thước và chỉ giữ lại những thông tin log liên quan đến những máy tính có nhiều hoạt động nhất.

Phân cụm thì đương nhiên quan trọng nhất là số lượng cụm mà người ta mong muốn xác định; cũng như quan trọng nhất trong nén dữ liệu là số lượng thành phần quan trọng mà người ta muốn giữ lại. Sau khi đã phân cụm, ta sẽ có cái nhìn khái quát hơn về hình trạng của dữ liệu. Ngoài ra thì việc phân cụm cũng có thể giúp gán nhãn cho dữ liệu trước khi muốn sử dụng kỹ thuật Học có giám sát vào.

Về mặt tự nhiên thì học ko giám sát có hành vi "giống con người học" hơn là học có giám sát.

Reinforcement Learning.

Rất tiếc, phần này mình mới chỉ đọc qua chút ít ở quyển Hands-on nên chưa có đủ cái nhìn khái quát về nó. 

Ứng dụng như thế nào!

Dựa vào những đặc tính trên, người ta cũng tìm ra nhiều cách để có thể ứng dụng Machine Learning vào Security. 

Ví dụ như với các thuật toán Học có giám sát:
  • Phát hiện gian lận: kiểu như phân loại hành vi theo 1 khuôn mẫu nào đó có bị coi là bất thường hay ko. Ví dụ như 1 chương trình thực thi nào đó mà có thực hiện mở port, tạo kết nối ra bên ngoài tới những ip ko có trong whitelist, gọi đến hàm lấy dữ liệu gõ phím, ghi âm, ... thì có thể coi đây là một chương trình bất thường; vì những chương trình bình thường sẽ chỉ thực hiện 1 lượng nhỏ hành vi nào đó, ko thực hiện hàng loạt các hành vi làm cho ta cảm giác nó đang gửi dữ liệu cá nhân ra bên ngoài như vậy.
  • Phân tích traffic mạng: dự đoán lưu lượng mạng tại một thời điểm nào đó trong ngày, hoặc có thể là 1 khoảng thời gian nào đó trong ngày. Từ đó, nếu thấy lưu lượng mạng thực tế bị lệch khá nhiều so với lưu lượng mạng dự đoán, ta cần kiểm tra xem hiện tượng bất thường đó có nguyên nhân do đâu, có thực sự là mất an toàn ko.
Còn với các thuật toán Học ko giám sát:
  • Phân cụm: nhóm các hành vi, các địa chỉ IP, ... lại thành từng cụm với những đặc tính khác nhau, từ đó có thêm thông tin tổng quan về hiện trạng của hệ thống/mạng.
  • Đưa ra khuyến nghị: từ những thông tin đã thu được, máy tính sẽ đưa ra một số các khuyến nghị xử lý trong tập các khuyến nghị cho trước sao cho liên quan nhất đến những thông tin đầu vào. Ví dụ khi phát hiện máy tính mở kết nối đến 1 địa chỉ IP độc hại nào đó đã có trong blacklist, máy tính sẽ tự đưa ra thông tin khuyến nghị có liên quan, như toàn bộ thông tin về IP đó, lịch sử các vụ mất an toàn thông tin mà liên quan đến IP đó, các bước khắc phục khi gặp phải sự cố liên quan đến IP đó.
  • Nén dữ liệu log để dễ dàng phân tích với ít nhiễu và thừa hơn. Tuy nhiên trong nhiều trường hợp, ta lại ko cần quan tâm đến những thành phần dữ liệu chính, mà phải quan tâm đến những thành phần dữ liệu ít xuất hiện! Bất thường là ít khi xảy ra hơn bình thường, do đó những hành vi hay xảy ra thì đã có Học có giám sát lo; còn những hành vi bất thường thì ít xảy ra hơn, nên ta cần phải khai thác sâu hơn.

Về cách tôi sử dụng.

Người đặt nền móng cho hầu hết các công việc sử dụng Machine Learning vào Security của tôi trong thời gian qua chính là Tổng giám đốc cũ của công ty: sếp Triệu Trần Đức - huyền thoại võ lâm IT VN. Sếp có đưa ra 1 quan điểm rất dị thường mà tôi vẫn đang sử dụng.

Phát hiện hành vi bất thường thông qua Topic Modeling của NLP!

Nghe qua thì khá hư cấu, thế nào mà lại dùng kỹ thuật của Xử lý ngôn ngữ tự nhiên vào Security, ko biết móc đâu ra văn bản chữ hay là âm thanh! Nhưng thực tế thì dữ liệu log cũng được biểu diễn và lưu trữ ở dạng text (văn bản), nên việc sử dụng các kỹ thuật của NLP vào cũng ko có j là bất khả thi cả. 

Như các bạn nếu đã tìm hiểu, Topic Modeling thuộc loại Generative Model, là Học ko giám sát. Mục đích của Topic Modeling là xác định ra phân phối xác suất của các topic trong mỗi văn bản, và phân phối xác suất của các từ trong mỗi topic. Muốn làm đc điều đó, ta phải có từ ngữ. Log là dữ liệu thô, ko có sẵn từ thì ta phải tạo ra từ; chứ ko thể nhét nguyên cả mớ log vào Topic Modeling được.

Việc làm này rất khả thi, và thực tế thì đã thu được kết quả rất khả quan, chỉ đợi clean lại để đưa thành product! Vì ko ai có thể ngồi check từng địa chỉ IP nguy hiểm bên ngoài, từng giao thức kết nối với khuôn mẫu cụ thể (máy chủ nguồn, máy chủ đích, cổng, ...). Các hành vi bất thường thì xuất hiện ko nhiều, thêm nữa là những hành vi ít xuất hiện cũng chưa chắc đã là bất thường; do đó Topic Modeling với Latent Dirichlet Allocation là sự lựa chọn hợp lý cho việc phát hiện hành vi bất thường.

Phát hiện diễn biến bất thường thông qua phân tích dữ liệu Time Series.

Cái này thì liên quan đến Deep Learning với kỹ thuật mạng RNN (Recurrent Neural Network) này. Vâng, chả có căn cứ Toán học mẹ nào cả, thấy thế giới dùng thì mình cũng thử dùng xem sao thôi. Cả cái của khỉ LSTM vs GRU nữa; code ra model cho hoành tráng rồi training lòi kèn trên GPU với Tensorflow là xong. Nói chung thì kết quả cũng chỉ ở mức tạm, ko có j quá đặc sắc. Vì thực tế, mình chặn ngưỡng nguy hiểm bằng độ lệch chuẩn của dữ liệu rồi. Hơn nữa còn có các phương pháp thống kê khác như STL Decomposition hoặc ARIMA/SARIMA, nên mình dùng mấy cái RNN này cũng chỉ để làm màu cho nguy hiểm thôi! :3

Nhận xét

Bài đăng phổ biến từ blog này

Trên con đường tu đạo luôn cực kỳ theo đuổi!

C++ Con trỏ (Pointer) toàn thư: Phần 4: Con trỏ "đa cấp". Đánh nhau bằng con trỏ.

Vừa ngộ ra sự vi diệu của Padding Oracle Attack thì được tin crush hồi lớp 12 sắp cưới.