So Sánh Phương Pháp Tiếp Cận: Bare Metal vs Build Từ Nguồn vs Docker Containers
Cách đây sáu tháng, đội ngũ bảo mật của chúng tôi bắt tay vào việc thay thế một công cụ quét lỗ hổng bảo mật thương mại đắt đỏ. Chúng tôi đã dựng một hệ thống Greenbone Vulnerability Management (GVM / OpenVAS) tự lưu trữ (self-hosted) trên một máy chủ nội bộ chạy Debian 12.
Nếu đã từng tìm hiểu về GVM, bạn hẳn biết rằng nó không phải là một file nhị phân nguyên khối (monolithic binary). Đây là một cụm gồm nhiều microservice phụ thuộc lẫn nhau: công cụ quét OpenVAS (openvas-scanner), daemon quản lý (gvmd), giao diện web (gsa), dịch vụ thông tin xác thực đã xác thực (gsad), Redis cho lưu trữ key-value tạm thời, và backend cơ sở dữ liệu PostgreSQL.
Trước khi đưa bất cứ thứ gì lên môi trường production, chúng tôi đã thử nghiệm ba chiến lược triển khai trong phòng lab staging:
- Kho Gói Gốc Của Hệ Điều Hành (Bare Metal / APT): Các gói do cộng đồng duy trì trên Debian và Ubuntu thường đi sau các bản phát hành upstream tới vài tháng. Trong đợt kiểm thử đầu tiên, một bản vá bảo mật của hệ điều hành đã làm hỏng các thư viện chia sẻ
libgvmvà gây mất đồng bộ schema của PostgreSQL. Hậu quả là hàng đợi quét bị gián đoạn và chúng tôi mất nguyên cả buổi chiều chỉ để xử lý sự cố. - Biên Dịch Từ Mã Nguồn (Build from Source): Việc tự biên dịch từng daemon mang lại khả năng kiểm soát chi tiết đối với các cờ biên dịch (compile-time flags) và đường dẫn thư viện tùy chỉnh. Tuy nhiên, chi phí bảo trì định kỳ là cực kỳ lớn. Vừa phải đồng bộ các bản cập nhật feed, vừa phải theo dõi toolchain của CMake, Rust, Clang, lại còn phải xử lý các lỗi liên kết động (dynamic linking), các công việc cập nhật định kỳ đã tiêu tốn từ 8 đến 12 giờ kỹ thuật mỗi tháng.
- Cụm Container Hóa Qua Docker Compose: Đây là giải pháp chiến thắng rõ ràng. Greenbone duy trì các image container chính thức được đồng bộ liên tục với Greenbone Community Feed. Mỗi thành phần chạy trong một container cô lập thông qua mạng nội bộ Docker bridge và các Unix domain socket chia sẻ. Các container tiện ích chuyên biệt sẽ tự động đảm nhiệm việc migration schema cơ sở dữ liệu và đồng bộ hóa feed.
Ưu & Nhược Điểm Khi Vận Hành OpenVAS Trên Môi Trường Production
Trong suốt nửa năm qua, chúng tôi đã lên lịch quét định kỳ hàng tuần trên 12 cụm staging, 4 VLAN nội bộ và 24 reverse proxy hướng ra internet. Dưới đây là những điểm nền tảng này phát huy xuất sắc và những vấn đề khiến chúng tôi phải đau đầu.
Ưu Điểm
- Không Tốn Phí Bản Quyền Theo Host: Các công cụ thương mại dành cho doanh nghiệp thường tính phí từ 30$ đến 50$ mỗi năm cho mỗi IP hoạt động. Với GVM tự host, chúng tôi có thể thoải mái quét hơn 450 phiên bản staging tạm thời và các dải mạng nội bộ mà không phải bận tâm về chi phí.
- Kho Dữ Liệu Lỗ Hổng Cộng Đồng Rất Chi Tiết: Greenbone Community Feed cập nhật hàng ngày với hơn 150.000 bài kiểm tra lỗ hổng mạng (NVT – Network Vulnerability Tests). Chỉ riêng trong tháng thứ ba, hệ thống đã phát hiện 14 gói OpenSSL có lỗ hổng, 3 thuật toán mã hóa SSH yếu và một số cấu hình header chưa được vá trên Nginx reverse proxy trước khi đơn vị kiểm toán bên ngoài kịp phát hiện.
- Bảo Đảm Tuyệt Đối Quyền Riêng Tư Của Dữ Liệu: Mục tiêu quét, thông tin đăng nhập dùng để kiểm tra sâu, và bản đồ cấu trúc mạng nội bộ không bao giờ rời khỏi phạm vi trung tâm dữ liệu riêng của chúng tôi.
Nhược Điểm
- Tiêu Tốn Nhiều Bộ Nhớ RAM Và CPU: OpenVAS rất ngốn tài nguyên. Việc phân tích và lập chỉ mục toàn bộ feed NVT vào Redis đòi hỏi khoảng 4 GB đến 6 GB RAM ngay khi khởi động. Khi chúng tôi khởi chạy quét đồng thời trên hai dải mạng /24, mức sử dụng CPU đã vọt lên 95% trên toàn bộ 8 vCPU được cấp phát.
- Đồng Bộ Feed Đôi Khi Thiếu Ổn Định: Các máy chủ mirror rsync của feed cộng đồng đôi khi giới hạn tốc độ (rate-limit) hoặc ngắt kết nối vào những khung giờ cao điểm. Nếu không có cơ chế thử lại (retry logic) chặt chẽ và bộ nhớ đệm trên persistent volume, các tác vụ đồng bộ tự động hàng ngày thường gặp lỗi khoảng hai lần mỗi tháng.
- Cần Nhiều Thời Gian Để Tinh Chỉnh Chính Sách Quét: Các cấu hình quét mặc định như "Full and Fast" dễ làm tràn ngập tường lửa bằng quá nhiều gói tin kiểm tra trạng thái hoặc kích hoạt tính năng giới hạn tốc độ. Tường lửa biên của chúng tôi ban đầu đã chặn một nửa số gói tin quét vì nghi ngờ tấn công SYN flood. Chúng tôi đã phải mất ba tuần tinh chỉnh danh sách cổng và các thông số thời gian để có được các lần quét sạch sẽ, đáng tin cậy.
Cấu Hình Đề Xuất: Phần Cứng & Thông Số Kiến Trúc
Việc ước lượng tài nguyên quyết định sự thành bại của một hệ thống GVM. Chạy hệ thống này trên một VPS đám mây 2 GB hoặc 4 GB RAM chia sẻ là điều bất khả thi; cơ chế OOM (Out Of Memory) killer của Linux sẽ lập tức tắt gvmd hoặc Redis trong giai đoạn biên dịch feed dữ liệu.
- CPU: Tối thiểu 4 vCPU (khuyến nghị 8 vCPU nếu muốn quét đồng thời nhiều dải mục tiêu).
- Bộ Nhớ (RAM): 16 GB RAM (8 GB là mức tối thiểu tuyệt đối, nhưng sẽ không còn khoảng trống an toàn khi cập nhật feed).
- Lưu Trữ: 100 GB SSD/NVMe (các định nghĩa NVT, chỉ mục PostgreSQL và báo cáo quét lịch sử chiếm khoảng 35 GB sau sáu tháng quét liên tục).
- Hệ Điều Hành: Debian 12 (Bookworm) hoặc Ubuntu 22.04/24.04 LTS chạy Docker Engine 24+ và Docker Compose V2.
- Mạng: Đặt giao diện quản trị trên một VLAN quản trị nội bộ; tuyệt đối không mở cổng 9392 trực tiếp ra internet công cộng nếu không có reverse proxy bảo vệ hoặc kết nối qua VPN tunnel.
Hướng Dẫn Triển Khai: Cài Đặt GVM Với Docker Compose
Mô hình triển khai này đã giúp máy chủ production của chúng tôi vận hành ổn định và vượt qua nhiều lần nâng cấp kernel của hệ điều hành máy chủ mà không bị gián đoạn hoạt động.
1. Chuẩn Bị Host Và Tinh Chỉnh Kernel
Redis yêu cầu một số tinh chỉnh tham số kernel cụ thể để xử lý lưu lượng socket lớn của GVM mà không làm rớt kết nối. Hãy đăng nhập vào máy chủ Linux của bạn và áp dụng cấu hình memory overcommit:
# Bật memory overcommit cho Redis
sudo sysctl -w vm.overcommit_memory=1
echo "vm.overcommit_memory = 1" | sudo tee -a /etc/sysctl.d/99-gvm.conf
# Chuẩn bị cấu trúc thư mục riêng biệt
sudo mkdir -p /opt/greenbone-community-container
cd /opt/greenbone-community-container
2. Bảo Mật Cơ Sở Dữ Liệu Và Thông Tin Quản Trị
Trước khi khởi chạy các dịch vụ, hãy tạo mật khẩu mạnh cho backend PostgreSQL và tài khoản quản trị viên của giao diện web. Để tạo các chuỗi bí mật an toàn cho server, tôi thường sử dụng công cụ tạo mật khẩu tại toolcraft.app/vi/tools/security/password-generator — công cụ này xử lý hoàn toàn trên trình duyệt nên không có dữ liệu nào bị gửi qua mạng. Lưu các chuỗi này vào một file .env riêng biệt:
cat << 'EOF' > .env
POSTGRES_USER=gvmd
POSTGRES_PASSWORD=YOUR_STRONG_POSTGRES_SECRET_HERE
ADMIN_PASSWORD=YOUR_STRONG_ADMIN_SECRET_HERE
EOF
chmod 600 .env
3. Khai Báo Stack Nhiều Container
Greenbone cung cấp một file cấu hình compose chính thức cho cộng đồng. Tải về và kiểm tra file compose upstream để quản lý tập hợp các daemon:
# Tải file cấu hình Docker Compose chính thức của Greenbone
curl -f -O https://greenbone.github.io/docs/latest/_static/docker-compose-22.4.yml
mv docker-compose-22.4.yml docker-compose.yml
Kiểm tra file docker-compose.yml để đảm bảo việc ánh xạ cổng (port binding) phù hợp với chính sách bảo mật của bạn. Theo mặc định, giao diện web Greenbone Security Assistant (GSA) sẽ gắn vào cổng host 9392:80. Hãy giữ dịch vụ này chỉ bind vào localhost (127.0.0.1:9392:80) và thiết lập TLS qua một Nginx reverse proxy, WireGuard tunnel, hoặc forward cổng qua SSH:
# Khởi chạy tất cả dịch vụ GVM chạy ngầm
docker compose -f docker-compose.yml up -d
4. Đồng Bộ Hóa Dữ Liệu Lỗ Hổng Bảo Mật (Feeds)
Sau khi các container đã khởi tạo xong, hãy tải về các Network Vulnerability Tests, dữ liệu SCAP và dữ liệu CERT. Lần đồng bộ đầu tiên này sẽ tải xuống khoảng 4 GB chữ ký lỗ hổng. Tùy thuộc vào băng thông mạng và tình trạng nghẽn của máy chủ mirror, quá trình này có thể mất từ 15 đến 45 phút:
# Kích hoạt đồng bộ feed trên các thành phần
docker compose -f docker-compose.yml exec -u gvmd gvmd greenbone-feed-sync --type GVMD_DATA
docker compose -f docker-compose.yml exec -u gvmd gvmd greenbone-feed-sync --type SCAP
docker compose -f docker-compose.yml exec -u gvmd gvmd greenbone-feed-sync --type CERT
5. Khởi Tạo Tài Khoản Quản Trị Và Xác Thực Feed
Thiết lập mật khẩu quản trị viên cho giao diện web bằng thông tin xác thực đã lưu trong file .env của bạn:
# Tạo mới hoặc đặt lại mật khẩu cho tài khoản quản trị viên
docker compose -f docker-compose.yml exec -u gvmd gvmd gvmd --user=admin --new-password="$ADMIN_PASSWORD"
Tiếp theo, theo dõi log của daemon quản lý trong khi PostgreSQL lập chỉ mục các định nghĩa lỗ hổng:
# Kiểm tra trạng thái log quá trình xử lý feed
docker compose -f docker-compose.yml logs -f gvmd
Hãy chú ý theo dõi dòng thông báo hoàn tất: Updating VTs in database... done (XXXXX VTs). Khi dòng này xuất hiện, hãy mở trình duyệt, truy cập vào địa chỉ https://your-server-ip:9392 (hoặc URL reverse proxy của bạn), đăng nhập bằng tài khoản admin, và cấu hình dải mạng mục tiêu đầu tiên tại mục Configuration > Targets.
Việc lựa chọn hướng đi container hóa đã biến OpenVAS từ một hệ thống bảo trì phức tạp, dễ gãy vỡ thành một nền tảng rà quét lỗ hổng khép kín, hoạt động ổn định và tin cậy trong hạ tầng của chúng tôi.

