1. Yêu cầu phần cứng và phiên bản Linux Kernel tối thiểu
Để triển khai eBPF và Auditd hiệu quả, hệ thống cần đáp ứng các yêu cầu phần cứng và phần mềm nghiêm ngặt. eBPF yêu cầu bộ nhớ RAM để lưu trữ map và chương trình, cũng như CPU hỗ trợ các lệnh JIT (Just-In-Time) compilation.
Yêu cầu phần cứng:
- CPU: Tối thiểu 2 nhân, kiến trúc x86_64 hoặc ARM64 hỗ trợ virtualization.
- RAM: Tối thiểu 4GB (eBPF programs cần bộ nhớ để map data structures).
- Disk: 20GB free space cho logs audit và binary files.
Yêu cầu Kernel:
Linux Kernel phải từ phiên bản 4.1 trở lên để hỗ trợ eBPF cơ bản. Tuy nhiên, để sử dụng các tính năng tiên tiến như cgroup BPF, XDP, hoặc map types mới, Kernel 5.x trở lên là bắt buộc.
Kiểm tra phiên bản Kernel hiện tại:
uname -r
Kết quả mong đợi: Hiển thị phiên bản kernel, ví dụ 5.15.0-100-generic hoặc cao hơn. Nếu thấp hơn 4.1, cần nâng cấp kernel hoặc thay đổi OS.
2. Cài đặt các công cụ cần thiết
Chúng ta cần cài đặt bộ công cụ để viết, biên dịch và debug eBPF, cùng với daemon audit để ghi log hệ thống. Các gói cần thiết bao gồm: bpftrace, bpftool, auditd, và libbpf-dev.
2.1. Cập nhật hệ thống và cài đặt trên Ubuntu/Debian
Thực hiện cập nhật repository và cài đặt các gói phần mềm cần thiết. Các gói này bao gồm kernel headers để biên dịch eBPF programs.
sudo apt update && sudo apt install -y bpftrace bpftool auditd linux-headers-$(uname -r) build-essential clang llvm
Kết quả mong đợi: Quá trình cài đặt hoàn tất mà không báo lỗi. Các binary bpftrace và bpftool sẵn sàng sử dụng.
2.2. Cập nhật hệ thống và cài đặt trên RHEL/CentOS/Rocky
Đối với các bản phân phối Enterprise, cần kích hoạt EPEL repository để lấy bpftrace.
sudo dnf install -y epel-release
sudo dnf install -y bpftrace bpftool auditd kernel-devel kernel-headers clang llvm
Kết quả mong đợi: Các gói được cài đặt thành công. Kiểm tra sự tồn tại của file /usr/bin/bpftrace.
2.3. Verify cài đặt công cụ
Kiểm tra phiên bản của các công cụ đã cài để đảm bảo chúng hoạt động đúng.
bpftrace --version
bpftool version
auditctl -v
Kết quả mong đợi: Hiển thị phiên bản của bpftrace (ví dụ: 0.18), bpftool (ví dụ: v5.15), và auditctl hiển thị phiên bản auditd (ví dụ: 3.0.7).
3. Khởi tạo cơ sở dữ liệu mẫu (PostgreSQL)
Chúng ta sẽ sử dụng PostgreSQL làm mục tiêu bảo vệ. Cần cài đặt PostgreSQL, khởi tạo database mẫu và tạo user có quyền truy cập để mô phỏng các cuộc tấn công sau này.
3.1. Cài đặt và cấu hình PostgreSQL
Cài đặt PostgreSQL phiên bản 14 hoặc 15. Cấu hình để lắng nghe trên localhost và cho phép kết nối từ mạng nội bộ.
sudo apt install -y postgresql postgresql-contrib
sudo systemctl enable postgresql
sudo systemctl start postgresql
Kết quả mong đợi: Dịch vụ PostgreSQL đang chạy (active running).
3.2. Tạo database và user mẫu
Chuyển sang user postgres để tạo database app_db và user app_user với mật khẩu mạnh. Đây là môi trường để chúng ta bảo vệ trong các phần sau.
sudo -u postgres psql -c "CREATE DATABASE app_db;"
sudo -u postgres psql -c "CREATE USER app_user WITH PASSWORD 'SecurePass123';"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE app_db TO app_user;"
sudo -u postgres psql -c "CREATE TABLE users (id SERIAL PRIMARY KEY, username VARCHAR(50), email VARCHAR(100));" -d app_db
Kết quả mong đợi: Database app_db được tạo, user app_user được tạo, và bảng users tồn tại.
3.3. Verify kết nối Database
Kiểm tra khả năng kết nối vào database vừa tạo bằng user app_user.
PGPASSWORD='SecurePass123' psql -h localhost -U app_user -d app_db -c "SELECT 1;"
Kết quả mong đợi: Trả về kết quả 1 trong bảng, xác nhận kết nối thành công.
4. Kiểm tra trạng thái eBPF và Audit subsystem
Trước khi viết code, cần đảm bảo Kernel đã được cấu hình để cho phép chạy eBPF và Auditd đang hoạt động đúng chuẩn. Đây là bước quan trọng nhất để tránh lỗi Permission denied hoặc Operation not permitted.
4.1. Kiểm tra và bật eBPF subsystem
Kiểm tra xem kernel module bpf đã được load chưa. Nếu chưa, cần load nó thủ công. Đồng thời kiểm tra các tham số trong /proc/sys/net/core/bpf_jit_enable.
lsmod | grep bpf
cat /proc/sys/net/core/bpf_jit_enable
Kết quả mong đợi:
- Lệnh lsmod hiển thị dòng chứa bpf.
- Lệnh cat trả về 1 (cho phép JIT compilation).
Nếu bpf chưa load, thực hiện:
sudo modprobe bpf
4.2. Kiểm tra và bật Auditd
Kiểm tra trạng thái của dịch vụ auditd và đảm bảo nó đang chạy. Auditd cần được cấu hình để không bị tắt khi reboot.
sudo systemctl status auditd
sudo auditctl -s
Kết quả mong đợi:
- systemctl status hiển thị Active: active (running).
- auditctl -s hiển thị auditd running.
4.3. Cấu hình giới hạn eBPF (Systemd hardening)
Trên các bản Linux hiện đại, systemd có thể hạn chế eBPF nếu không cấu hình đúng. Cần kiểm tra file cấu hình dịch vụ để đảm bảo không có RestrictAddressFamilies=AF_INET AF_INET6 hoặc LockPersonality=on gây xung đột với eBPF.
Kiểm tra file config mặc định của auditd (nếu cần chỉnh sửa để chạy eBPF hook):
sudo systemctl cat auditd
Kết quả mong đợi: Xem nội dung config. Nếu thấy dòng LockPersonality=on hoặc các restrict liên quan đến bpf, cần comment dòng đó hoặc thêm RestrictNamespaces=no tùy vào yêu cầu bảo mật cụ thể. (Ghi chú: Phần này thường không cần chỉnh sửa trên bản mặc định của Ubuntu/Debian cho mục đích phát triển).
4.4. Test eBPF program đơn giản
Chạy một script bpftrace đơn giản để đảm bảo kernel cho phép inject eBPF program. Script này đếm số lần gọi system call open.
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("Open called by PID: %d\n", pid); }' -- -c 'sleep 1' &
sleep 0.5
echo "Test open" > /tmp/test_ebpf.txt
kill %1
Kết quả mong đợi:
- Console hiển thị dòng Open called by PID: ....
- Không có lỗi Permission denied hay Seccomp error.
- Nếu thành công, hệ thống đã sẵn sàng cho các phần sau của series.
4.5. Test Audit rule đơn giản
Thêm một rule audit để theo dõi việc tạo file, sau đó tạo file và kiểm tra log.
sudo auditctl -w /tmp/test_ebpf.txt -p wa -k test_file_access
echo "Audit test" > /tmp/test_ebpf_audit.txt
sudo ausearch -k test_file_access
Kết quả mong đợi: Lệnh ausearch trả về log chi tiết về việc tạo file /tmp/test_ebpf_audit.txt với key test_file_access.
Xóa rule audit sau khi test xong để giữ hệ thống sạch sẽ:
sudo auditctl -W /tmp/test_ebpf.txt -p wa -k test_file_access --delete
Điều hướng series:
Mục lục: Series: Triển khai Database chống tấn công với Linux eBPF và Kernel Audit
Phần 2: Giới thiệu cơ chế hoạt động của Linux eBPF và Audit »