Yêu cầu phần cứng và phiên bản Linux tối thiểu
Để triển khai Kernel Hardening và chuẩn bị nền tảng cho eBPF, hệ thống cần đáp ứng các tiêu chuẩn về kiến trúc và phiên bản Kernel cụ thể. Các tính năng bảo mật nâng cao như eBPF, AppArmor/SELinux, và các tham số Hardening đòi hỏi Kernel mới.
Yêu cầu tối thiểu về phần cứng cho VM:
- CPU: 4 vCPU (Tối thiểu, hỗ trợ virtualization extensions: Intel VT-x/AMD-V).
- RAM: 16 GB (Cần bộ nhớ cho Database cache + buffer cho Kernel eBPF + swap).
- Disk: 100 GB NVMe SSD (Tốc độ I/O quan trọng cho DB, không dùng HDD).
- Network: 1 vNIC (1 Gbps).
Yêu cầu phiên bản Linux và Kernel:
- Hệ điều hành: Ubuntu 22.04 LTS hoặc Rocky Linux 9 (Cung cấp Kernel 5.15+ hoặc 5.14+).
- Kernel Version: Tối thiểu 5.10 (Khuyến nghị 5.15 hoặc 6.x để full support eBPF).
- Architecture: x86_64 (AMD64).
Kiểm tra yêu cầu hiện tại trên VM:
uname -r && grep -oP '(?
Kết quả mong đợi: Xuất hiện phiên bản kernel từ 5.10 trở lên và version OS là 22.04 hoặc 9.
Lựa chọn phân phối và cài đặt Database
Chúng ta chọn Ubuntu 22.04 LTS vì cộng đồng hỗ trợ rộng rãi cho eBPF và các công cụ bảo mật. Phiên bản này mặc định đi kèm với AppArmor, giúp giảm thiểu công sức cấu hình so với SELinux trên CentOS/Rocky cho người mới bắt đầu.
Cập nhật hệ thống và cài đặt các gói cần thiết trước khi cài Database. Việc này đảm bảo các thư viện và kernel headers mới nhất để compile các module eBPF sau này.
sudo apt update && sudo apt upgrade -y
sudo apt install -y linux-headers-$(uname -r) build-essential gcc make git curl wget net-tools
Kết quả mong đợi: Không có lỗi dependency, các package được cài đặt thành công.
Cài đặt PostgreSQL 15 (Phiên bản ổn định, hỗ trợ tốt cho các extension bảo mật). Sử dụng repository chính thức của PostgreSQL để đảm bảo version mới nhất, không dùng package mặc định của Ubuntu (thường bị lỗi version cũ).
curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /usr/share/keyrings/postgresql.gpg
echo "deb [signed-by=/usr/share/keyrings/postgresql.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
sudo apt update
sudo apt install -y postgresql-15 postgresql-contrib-15
Kết quả mong đợi: Package postgresql-15 được cài đặt, service postgresql khởi động tự động.
Khởi động service Database và xác minh trạng thái:
sudo systemctl enable postgresql
sudo systemctl start postgresql
sudo systemctl status postgresql | grep "active (running)"
Kết quả mong đợi: Dòng log "active (running)" xuất hiện, service đã sẵn sàng.
Cấu hình Database cơ bản cho Hardening
Trước khi áp dụng các biện pháp bảo mật ở các phần sau, cần thiết lập user và password mạnh, đồng thời cấu hình file `postgresql.conf` để chuẩn bị cho việc cô lập.
Thay đổi mật khẩu mặc định của user postgres:
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'StrongP@ssw0rd_Hardening2024';"
Kết quả mong đợi: Thông báo "ALTER ROLE" xuất hiện.
Cấu hình file chính `postgresql.conf` để giới hạn kết nối và chuẩn bị cho tuning.
sudo nano /etc/postgresql/15/main/postgresql.conf
Sửa các dòng sau (ghi đè hoặc thêm vào cuối file):
listen_addresses = 'localhost'
port = 5432
max_connections = 100
shared_buffers = 4GB
work_mem = 64MB
maintenance_work_mem = 128MB
wal_buffers = 64MB
effective_cache_size = 12GB
synchronous_commit = on
checkpoint_completion_target = 0.9
wal_compression = on
log_min_duration_statement = 100
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
log_temp_files = -1
log_statement = 'ddl'
log_duration = on
Kết quả mong đợi: File được lưu, các tham số được đặt để giới hạn tài nguyên và bật logging chi tiết.
Khởi động lại PostgreSQL để áp dụng cấu hình:
sudo systemctl restart postgresql
sudo -u postgres psql -c "SHOW listen_addresses;"
Kết quả mong đợi: Giá trị trả về là `localhost`, chứng tỏ DB chỉ lắng nghe trên loopback, chưa mở ra network công cộng.
Cấu hình Network ban đầu và chuẩn bị tài liệu
Môi trường Database an toàn cần cách ly về mặt mạng ngay từ đầu. Chúng ta sẽ cấu hình firewall (UFW) để chặn mọi truy cập từ bên ngoài, chỉ cho phép truy cập SSH (cho quản trị viên) và localhost (cho ứng dụng web sau này).
Khởi động UFW và đặt chính sách mặc định là REJECT (chặn tất cả) thay vì DROP (vì REJECT gửi gói từ chối giúp debug dễ hơn trong giai đoạn setup, sau này sẽ chuyển sang DROP khi hardening hoàn tất).
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow from 127.0.0.1 to any port 5432 proto tcp
sudo ufw enable
Kết quả mong đợi: UFW bật thành công, status hiển thị "Status: active", quy tắc cho phép SSH và kết nối local trên port 5432.
Verify cấu hình firewall:
sudo ufw status verbose
Kết quả mong đợi: Chỉ thấy các quy tắc cho phép SSH và port 5432 từ 127.0.0.1. Các port khác đều bị chặn.
Chuẩn bị môi trường phát triển eBPF và tài liệu tham khảo Kernel. Cần cài đặt các công cụ BCC (BPF Compiler Collection) và kernel headers để viết code eBPF trong các phần sau.
sudo apt install -y bpfcc-tools bpf-tools libbpf-dev clang llvm libelf-dev libpcap-dev
Kết quả mong đợi: Các công cụ `bpftop`, `biotop`, `trace` được cài đặt.
Kiểm tra khả năng load module eBPF của Kernel:
grep -E "CONFIG_BPF|CONFIG_BPF_SYSCALL" /boot/config-$(uname -r)
Kết quả mong đợi: Xuất hiện `CONFIG_BPF=y` và `CONFIG_BPF_SYSCALL=y`.
Tạo thư mục dự án để lưu trữ scripts và tài liệu tham khảo:
mkdir -p ~/db-hardening-series/{scripts,docs,config}
cd ~/db-hardening-series
git clone https://github.com/iovisor/bcc.git --depth 1
Kết quả mong đợi: Thư mục được tạo, repository BCC được clone về.
Verify toàn bộ môi trường trước khi sang phần 2:
echo "=== Kernel Version ===" && uname -r
echo "=== DB Status ===" && systemctl is-active postgresql
echo "=== Firewall Status ===" && ufw status | head -n 3
echo "=== eBPF Support ===" && ls /sys/kernel/bpf
echo "=== Network Interfaces ===" && ip -br addr show
Kết quả mong đợi: Tất cả các lệnh chạy thành công, DB đang chạy, Firewall active, thư mục /sys/kernel/bpf tồn tại.
Điều hướng series:
Mục lục: Series: Triển khai Database an toàn với Linux Kernel Hardening và eBPF
Phần 2: Kiểm toán và tối ưu hóa tham số Kernel cho Database »