Khi một máy trong mạng bị nghi là đã bị chiếm quyền, câu hỏi đầu tiên thường không phải “trên ổ đĩa có gì” mà là “máy này đã nói chuyện với ai, lúc nào, và trao đổi bao nhiêu dữ liệu”. Ổ đĩa kể chuyện quá khứ đã đọng lại; lưu lượng mạng kể chuyện đang diễn ra. Bài viết giới thiệu các cách ghi nhận lưu lượng, đọc được gì khi dữ liệu đã mã hoá, và giới hạn của từng nguồn.
Bắt gói và bắt luồng: hai mức chi tiết
Bắt gói nghĩa là lưu lại toàn bộ nội dung từng gói tin đi qua một điểm trên mạng, thường thành tệp theo định dạng pcap. Đây là mức chi tiết cao nhất: có đủ phần tiêu đề lẫn phần dữ liệu, dựng lại được phiên làm việc, trích xuất được tệp đã truyền nếu không mã hoá. Công cụ quen thuộc là tcpdump để bắt và Wireshark để phân tích.
Bắt luồng thì khác hẳn về triết lý: thiết bị mạng không lưu nội dung, chỉ tóm tắt mỗi cuộc trò chuyện thành một bản ghi gồm địa chỉ nguồn và đích, cổng, giao thức, thời điểm bắt đầu và kết thúc, số gói và số byte. NetFlow là tên quen thuộc nhất của họ kỹ thuật này, bên cạnh IPFIX và sFlow.
Đánh đổi rất rõ ràng. Bắt gói cho chiều sâu nhưng ngốn dung lượng khủng khiếp, nên thực tế chỉ giữ được vài giờ đến vài ngày, hoặc chỉ bật ở vài điểm trọng yếu. Bắt luồng nhẹ hơn nhiều bậc, nên giữ được nhiều tháng và bao phủ toàn mạng — đúng lúc cần nhìn lại quá khứ xa thì nó thường là thứ duy nhất còn.
Vì vậy cách dùng hợp lý là kết hợp: dùng dữ liệu luồng để khoanh vùng thời điểm và máy liên quan, rồi dùng gói tin đã bắt được (nếu có) để xem chi tiết đúng khoảng đó. Giữa hai mức còn có nhóm công cụ ghi nhật ký giao dịch mạng: không lưu toàn bộ gói, nhưng ghi mỗi kết nối và mỗi truy vấn tên miền thành bản ghi có cấu trúc.
Mã hoá che đi cái gì, và để lộ cái gì
Phần lớn lưu lượng ngày nay đã được mã hoá, nên kỳ vọng “mở gói tin ra đọc nội dung” hầu như không còn thực tế. Nhưng mã hoá bảo vệ nội dung, chứ không xoá được sự tồn tại của cuộc trao đổi. Những thứ vẫn quan sát được:
- Địa chỉ hai đầu, cổng và giao thức. Ai nói chuyện với ai — thông tin nền tảng nhất và không mã hoá nào giấu được.
- Tên miền đích trong phần bắt tay. Ở nhiều cấu hình phổ biến, tên máy chủ mà máy khách muốn kết nối được gửi ở dạng rõ trong bước bắt tay đầu tiên. Đây là lý do trường này rất được quan tâm trong điều tra. Cần lưu ý: các cơ chế mới hơn có thể mã hoá cả phần này, nên không thấy tên miền không có nghĩa là không có kết nối.
- Truy vấn phân giải tên miền. Nếu máy dùng DNS thông thường, các truy vấn đi ở dạng rõ và cho biết máy định kết nối tới đâu, kể cả khi kết nối sau đó được mã hoá. Khi máy dùng DNS mã hoá, nguồn này biến mất.
- Đặc điểm của bước bắt tay. Cách một phần mềm đề nghị các tham số mã hoá tạo thành một dạng vân tay, nhờ đó phân biệt được lưu lượng từ trình duyệt thông thường với lưu lượng từ một chương trình tự viết — dù không đọc được nội dung.
- Kích thước và số lượng. Tổng lượng byte theo mỗi chiều cho biết đây là tải về hay tải lên. Một máy nội bộ đẩy ra ngoài lượng dữ liệu lớn bất thường là dấu hiệu đáng chú ý, dù không đọc được một chữ nào trong đó.
- Nhịp thời gian. Kết nối đều đặn theo chu kỳ cố định, gói nhỏ, lặp lại hàng giờ liền, là mẫu hành vi rất khác với việc con người duyệt web. Đây là cách nhận diện các kênh điều khiển tự động mà không cần giải mã.
Nói cách khác, phân tích chuyển từ đọc nội dung sang đọc hình dạng của lưu lượng. Kết luận rút ra vì thế cũng mang tính suy đoán nhiều hơn, và phải được diễn đạt đúng mức trong báo cáo.
Từ gói tin tới hành vi
Dữ liệu thô hiếm khi tự nói lên điều gì. Việc chuyển từ gói tin sang hành vi thường đi qua bốn bước.
- Xác định phạm vi: chọn khoảng thời gian và các máy liên quan, dựa trên cảnh báo hoặc phát hiện ban đầu.
- Lập danh sách đối tác: máy nghi vấn đã kết nối với những địa chỉ nào, tần suất ra sao, bao nhiêu dữ liệu mỗi chiều.
- Đối chiếu với nền bình thường: so với chính máy đó ở thời điểm trước, và với các máy cùng vai trò. Bất thường chỉ có nghĩa khi biết thế nào là bình thường.
- Ghép với nguồn khác: một kết nối lạ lúc nửa đêm trở nên thuyết phục hơn hẳn khi log hệ thống cho thấy có tiến trình mới khởi chạy ngay trước đó.
Khi chỉ còn log thiết bị
Trong nhiều vụ việc thực tế, không có bản bắt gói nào cả, và tất cả những gì còn lại là log của firewall, proxy hoặc bộ định tuyến. Đây là nguồn hữu ích nhưng có những giới hạn cần nêu thẳng trong báo cáo:
- Che mất máy nội bộ. Khi nhiều máy dùng chung một địa chỉ ra Internet, log biên chỉ thấy địa chỉ chung. Muốn quy về đúng máy, phải có bảng chuyển đổi địa chỉ hoặc log cấp phát địa chỉ nội bộ tương ứng — và các bảng này thường bị giữ rất ngắn.
- Lấy mẫu. Một số thiết bị chỉ ghi lại một phần lưu lượng để giảm tải. Với lưu lượng lớn thì thống kê vẫn đúng, nhưng một kết nối đơn lẻ hoàn toàn có thể không xuất hiện — không thấy trong log không đồng nghĩa với không xảy ra.
- Không có nội dung. Log cho biết có kết nối, không cho biết đã trao đổi gì.
- Thời gian lưu ngắn và không đồng bộ. Log bị xoay vòng theo dung lượng, và mỗi thiết bị có thể ghi theo một quy ước giờ khác nhau. Đây là lý do việc đồng bộ thời gian toàn hệ thống lại quan trọng đến vậy.
- Chỉ nhìn thấy lưu lượng đi qua nó. Trao đổi giữa hai máy trong cùng một phân đoạn mạng không bao giờ chạm tới thiết bị biên, nên hoàn toàn vô hình với nó.
Bảo toàn dữ liệu mạng như một chứng cứ
Dữ liệu mạng cũng là chứng cứ số, nên chịu chung các nguyên tắc: tính giá trị băm cho tệp bắt gói và tệp log ngay sau khi thu thập, ghi rõ điểm bắt nằm ở đâu trong sơ đồ mạng, thiết bị đã dùng, khoảng thời gian bao phủ, và có áp bộ lọc nào hay không. Bộ lọc đặc biệt quan trọng: nó quyết định phần lưu lượng nào không bao giờ được ghi lại.
Kết luận
Điều tra lưu lượng mạng ngày nay hiếm khi là chuyện mở gói tin ra đọc. Nó là chuyện chọn đúng mức chi tiết cho câu hỏi đang có, hiểu rõ nguồn dữ liệu trong tay thấy được gì và mù ở chỗ nào, rồi đọc hành vi qua địa chỉ, khối lượng và nhịp thời gian. Và vì các nguồn này đều phải được bật trước khi sự cố xảy ra, giá trị của chúng phụ thuộc vào công tác chuẩn bị — không ai quay ngược lại để bắt gói cho tuần trước.
