Hướng dẫn cài đặt DefectDojo trên Docker: Quản lý lỗ hổng tập trung cho dân DevSecOps

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Khi báo cáo bảo mật trở thành cơn ác mộng

Nếu đang làm DevSecOps, kịch bản này chắc chắn không lạ lẫm với bạn. Sáng sớm, bạn chạy Trivy quét container image. Đến trưa, OWASP ZAP trả về một đống lỗi web. Chiều muộn, SonarQube lại gửi thêm danh sách lỗ hổng mã nguồn. Kết quả là hàng tá tệp PDF, CSV và JSON nằm rải rác khắp nơi.

Cơn đau đầu thực sự bắt đầu khi sếp hỏi: “Hệ thống hiện có bao nhiêu lỗi nghiêm trọng? Lỗi nào tháng trước đã báo mà giờ vẫn chưa sửa?”. Việc ngồi lọc trùng (deduplication) thủ công bằng Excel cực kỳ mệt mỏi và dễ sai sót. DefectDojo sinh ra chính là để giải quyết đống lộn xộn này.

Tại sao DefectDojo lại ‘được lòng’ dân bảo mật?

DefectDojo là một hệ thống quản lý lỗ hổng (VMS) mã nguồn mở. Nó đóng vai trò như một “kho chứa” tập trung cho mọi kết quả quét bảo mật. Thay vì quản lý lỗi bằng niềm tin, công cụ này giúp bạn:

  • Hỗ trợ import kết quả từ hơn 150 công cụ phổ biến như Nmap, Burp Suite, Snyk, hay Nessus.
  • Tự động gộp các lỗi giống nhau. Thực tế, mình từng giảm được 70% số lượng findings rác nhờ tính năng lọc trùng này.
  • Theo dõi chặt chẽ thời hạn sửa lỗi (SLA) của từng team.
  • Cung cấp biểu đồ trực quan để báo cáo nhanh cho quản lý.

Điểm cộng lớn nhất là khả năng tích hợp thẳng vào CI/CD. Bảo mật lúc này không còn là rào cản cuối cùng mà trở thành một phần của luồng tự động hóa.

Chuẩn bị tài nguyên hệ thống

DefectDojo là một bộ công cụ khá nặng. Nó vận hành dựa trên Django, Celery, PostgreSQL, Redis và RabbitMQ. Vì vậy, hãy quên chuyện chạy nó trên một con VPS 1GB RAM đi.

Cấu hình tối thiểu mình khuyến nghị để chạy mượt:

  • CPU: Tối thiểu 2 Cores.
  • RAM: 8GB (Mức 4GB vẫn chạy được nhưng sẽ treo máy khi bạn import các file report nặng trên 50MB).
  • Disk: 20GB SSD trở lên.
  • Yêu cầu: Đã cài sẵn Docker và Docker Compose.

Cài đặt DefectDojo bằng Docker Compose

Dùng Docker là cách nhanh nhất để triển khai mà không lo xung đột môi trường. Mình khuyên bạn nên clone repo chính thức để nhận các bản vá lỗi mới nhất.

Bước 1: Tải mã nguồn

git clone https://github.com/DefectDojo/django-DefectDojo
cd django-DefectDojo

Bước 2: Thiết lập môi trường

Đừng bao giờ dùng mật khẩu mặc định. Để an toàn, hãy dùng password generator tại toolcraft.app để tạo chuỗi ký tự mạnh. Mọi thao tác diễn ra trên trình duyệt nên bạn không cần lo lộ bí mật qua mạng. Sau đó, hãy cập nhật các thông tin này vào file .env.

Tiếp theo, hãy build và khởi động hệ thống bằng script có sẵn:

# Quá trình build có thể mất 5-10 phút tùy tốc độ mạng
./dc-build.sh

# Khởi động với backend MySQL và RabbitMQ
./dc-up.sh mysql-rabbitmq

Bước 3: Lấy thông tin đăng nhập

Hệ thống sẽ tự tạo một mật khẩu admin ngẫu nhiên trong lần đầu khởi chạy. Bạn hãy dùng lệnh sau để tìm nó:

docker compose logs initializer | grep "Admin password:"

Bây giờ, hãy mở trình duyệt và truy cập http://localhost:8080. Đăng nhập với user admin và mật khẩu vừa tìm thấy.

Vận hành thực tế: Đưa dữ liệu vào Dojo

Để không bị rối, bạn cần hiểu cách DefectDojo phân cấp dữ liệu. Cấu trúc chuẩn thường là:

Product Type (Dự án Ngân hàng) → Product (App Mobile) → Engagement (Quét định kỳ Sprint 1) → Test (Kết quả từ Trivy).

Cách import file scan

Giả sử bạn có file trivy_report.json. Để đưa vào hệ thống:

  1. Truy cập vào Engagement bạn vừa tạo.
  2. Nhấn biểu tượng (+) và chọn Import Scan Results.
  3. Chọn đúng Scan type là “Trivy Scan”.
  4. Tải file lên và nhấn Import.

Dojo sẽ tự động phân loại lỗi theo mức độ: Critical, High, Medium và Low. Bạn sẽ thấy ngay bức tranh tổng thể về độ bảo mật của ứng dụng.

Tự động hóa với API (Dành cho dân chuyên)

Việc upload thủ công chỉ dành cho lúc mới làm quen. Để thực sự làm chủ DevSecOps, bạn nên đẩy kết quả tự động từ Jenkins hoặc GitHub Actions qua API.

Dưới đây là đoạn script Python ngắn gọn để thực hiện việc này:

import requests

URL = "http://your-defectdojo-url/api/v2/import-scan/"
TOKEN = "YOUR_API_KEY"

headers = {"Authorization": f"Token {TOKEN}"}
data = {
    "active": True,
    "verified": True,
    "scan_type": "Trivy Scan",
    "engagement": 1  # ID của Engagement
}
files = {"file": open("trivy_results.json", "rb")}

response = requests.post(URL, headers=headers, data=data, files=files)
print("Thành công!" if response.status_code == 201 else f"Lỗi: {response.text}")

Lưu ý “xương máu” khi triển khai

Sau nhiều dự án thực tế, mình có vài lời khuyên giúp bạn tránh mất thời gian:

  • Bật Deduplication: Luôn kích hoạt tính năng lọc trùng trong cấu hình hệ thống. Nó giúp bạn tránh tình trạng 5 công cụ cùng báo một lỗi SQL Injection làm nhiễu báo cáo.
  • Phân loại trạng thái: Hãy mạnh dạn đánh dấu “False Positive” cho lỗi ảo và “Risk Accepted” cho những lỗi không thể sửa. Báo cáo của bạn sẽ chuyên nghiệp và sạch sẽ hơn nhiều.
  • Đừng quên Volume: Docker rất dễ xóa và cài lại. Hãy đảm bảo bạn đã mount volume cho cơ sở dữ liệu để tránh mất sạch dữ liệu sau một lệnh docker-compose down.

Lời kết

Triển khai DefectDojo trên Docker là bước đi thông minh để chuyên nghiệp hóa quy trình bảo mật. Dù việc cấu hình ban đầu hơi tốn sức, nhưng giá trị mà nó mang lại cho việc quản lý lỗ hổng là cực kỳ xứng đáng. Chúc bạn sớm làm chủ được công cụ mạnh mẽ này!

Share: