Bộ lọc Gói tin Berkeley Mở rộng (eBPF) cho An ninh Mạng
1. Tổng quan về eBPF trong Bảo mật
eBPF (extended Berkeley Packet Filter) là một công nghệ kernel-level mạnh mẽ trong Linux, cho phép chạy các đoạn mã bytecode trong không gian kernel một cách an toàn và hiệu quả. Nó cung cấp cơ chế lập trình động để quan sát, lọc và tương tác với các sự kiện hệ thống và mạng mà không cần chỉnh sửa kernel hoặc gây gián đoạn dịch vụ. Ứng dụng bảo mật chính:
Mục tiêu: Dùng eBPF để lọc gói tin, chặn hoàn toàn ping và SSH từ một máy nguồn đến một máy đích. Cấu hình Lab:
Sau khi triển khai chương trình eBPF thành công:
Bạn có thể dùng eBPF kết hợp với:
Dưới đây là sơ đồ hành vi:
sql
Copy
Edit
+-------------------+ +-------------------+ | Source (Client) | ping/ssh ---> X | Target (Linux) | | 198.18.161.6 |--------------------->| 198.18.128.3 | | | | eBPF XDP filter | +-------------------+ +-------------------+
Chương trình eBPF sẽ được gắn vào interface mạng của máy 198.18.128.3 để chặn:
Dưới đây là đoạn code eBPF mẫu sử dụng libbpf và XDP để chặn IP cụ thể:
c
Copy
Edit
SEC("xdp") int block_ip(struct xdp_md *ctx) { void *data_end = (void *)(long)ctx->data_end; void *data = (void *)(long)ctx->data; struct ethhdr *eth = data; if ((void *)eth + sizeof(*eth) > data_end) return XDP_PASS; if (eth->h_proto != htons(ETH_P_IP)) return XDP_PASS; struct iphdr *ip = data + sizeof(*eth); if ((void *)ip + sizeof(*ip) > data_end) return XDP_PASS; // Check source IP: 198.18.161.6 if (ip->saddr == htonl(0xC612A106)) { // Drop ICMP and TCP (e.g., SSH) if (ip->protocol == IPPROTO_ICMP || ip->protocol == IPPROTO_TCP) { return XDP_DROP; } } return XDP_PASS; }
Việc triển khai eBPF để kiểm soát an ninh mạng cho phép:
1. Tổng quan về eBPF trong Bảo mật
eBPF (extended Berkeley Packet Filter) là một công nghệ kernel-level mạnh mẽ trong Linux, cho phép chạy các đoạn mã bytecode trong không gian kernel một cách an toàn và hiệu quả. Nó cung cấp cơ chế lập trình động để quan sát, lọc và tương tác với các sự kiện hệ thống và mạng mà không cần chỉnh sửa kernel hoặc gây gián đoạn dịch vụ. Ứng dụng bảo mật chính:
- 🎯 Phát hiện mối đe dọa thời gian thực thông qua giám sát hành vi kernel hoặc mạng.
- 🔒 Thực thi chính sách bảo mật tùy chỉnh trên gói tin hoặc syscall.
- 🚫 Chặn truy cập trái phép hoặc hành vi bất thường mà không cần firewall truyền thống.
- 🧠 Thu thập dữ liệu quan sát chuyên sâu (deep observability) về process, container, syscall, và network flow.
Mục tiêu: Dùng eBPF để lọc gói tin, chặn hoàn toàn ping và SSH từ một máy nguồn đến một máy đích. Cấu hình Lab:
Nguồn | 198.18.161.6 | Phát sinh lưu lượng (ping, SSH) |
Đích | 198.18.128.3 | Áp dụng chương trình eBPF để lọc gói tin |
💡 eBPF được chạy trên máy đích (198.18.128.3) để chặn lưu lượng đến từ máy nguồn.
3. Mục tiêu Tác vụSau khi triển khai chương trình eBPF thành công:
- ❌ Ping từ 198.18.161.6 đến 198.18.128.3 sẽ không có phản hồi.
- ❌ Kết nối SSH từ 198.18.161.6 đến 198.18.128.3 sẽ bị từ chối hoặc không thành công.
Bạn có thể dùng eBPF kết hợp với:
- XDP (eXpress Data Path): Lọc gói tin ở tầng NIC (trước IP stack), tốc độ cao, dùng cho các tác vụ lọc thô.
- TC (Traffic Control): Lọc gói tin ở tầng cao hơn, phù hợp với chính sách phức tạp hơn như phân loại QoS hoặc lọc theo port.
- Socket filters (classic BPF): Áp dụng tại tầng socket, phù hợp khi cần kiểm soát ứng dụng layer.
Dưới đây là sơ đồ hành vi:
sql
Copy
Edit
+-------------------+ +-------------------+ | Source (Client) | ping/ssh ---> X | Target (Linux) | | 198.18.161.6 |--------------------->| 198.18.128.3 | | | | eBPF XDP filter | +-------------------+ +-------------------+
Chương trình eBPF sẽ được gắn vào interface mạng của máy 198.18.128.3 để chặn:
- ICMP Echo Request từ 198.18.161.6
- TCP kết nối đến cổng 22 từ 198.18.161.6
Dưới đây là đoạn code eBPF mẫu sử dụng libbpf và XDP để chặn IP cụ thể:
c
Copy
Edit
SEC("xdp") int block_ip(struct xdp_md *ctx) { void *data_end = (void *)(long)ctx->data_end; void *data = (void *)(long)ctx->data; struct ethhdr *eth = data; if ((void *)eth + sizeof(*eth) > data_end) return XDP_PASS; if (eth->h_proto != htons(ETH_P_IP)) return XDP_PASS; struct iphdr *ip = data + sizeof(*eth); if ((void *)ip + sizeof(*ip) > data_end) return XDP_PASS; // Check source IP: 198.18.161.6 if (ip->saddr == htonl(0xC612A106)) { // Drop ICMP and TCP (e.g., SSH) if (ip->protocol == IPPROTO_ICMP || ip->protocol == IPPROTO_TCP) { return XDP_DROP; } } return XDP_PASS; }
⚠️ Gắn chương trình vào interface với: ip link set dev eth0 xdp obj block_ip.o
7. Kết luậnViệc triển khai eBPF để kiểm soát an ninh mạng cho phép:
- Tùy biến chính sách bảo mật sát thực tế
- Giảm độ trễ so với firewall truyền thống
- Khả năng mở rộng mạnh trong môi trường container/Kubernetes