Tập trung bảo mật: Từ đống nhật ký hỗn độn đến một giao diện quản lý duy nhất
Tôi đã rút ra bài học xương máu rằng việc chạy các công cụ bảo mật không đồng nghĩa với việc hệ thống đã an toàn. Sau một cuộc tấn công brute-force qua SSH vào lúc nửa đêm nhắm vào một node production, tôi nhận ra “security stack” của mình chỉ là một đống log chưa bao giờ được đọc. Nếu bạn sử dụng Trivy cho Docker image, Semgrep cho mã nguồn và Nmap cho mạng, có lẽ bạn cũng đang phải đối mặt với ba định dạng báo cáo khác nhau nằm rải rác trong các pipeline CI/CD. Việc theo dõi lỗi nào đã sửa và lỗi nào vẫn còn là một cơn ác mộng về mặt vận hành.
DefectDojo giúp thu hẹp khoảng cách này. Nó đóng vai trò như một trung tâm điều phối hiện đại, hỗ trợ sẵn hơn 150 công cụ quét bảo mật. Thay vì phải kiểm tra thủ công 15 microservice khác nhau, bạn có thể xem hồ sơ rủi ro của toàn bộ cơ sở hạ tầng trên một màn hình duy nhất. Nó biến dữ liệu thô thành một danh sách các việc cần làm được ưu tiên rõ ràng.
Bắt đầu nhanh (5 phút)
Docker Compose là cách đáng tin cậy nhất để triển khai DefectDojo mà không cần phải vật lộn với cấu hình PostgreSQL hay Redis. Bạn có thể sẵn sàng môi trường chỉ trong chưa đầy năm phút.
1. Clone và Khởi chạy
git clone https://github.com/DefectDojo/django-DefectDojo
cd django-DefectDojo
# Thực thi các script thiết lập
./dc-build.sh
./dc-up.sh postgres-redis
Hãy để hệ thống có thời gian hoàn tất quá trình migration cơ sở dữ liệu. Bạn có thể theo dõi log bằng lệnh docker-compose logs -f initializer. Khi quá trình kết thúc, hệ thống sẽ hiển thị mật khẩu admin được tạo ngẫu nhiên. Hãy sao chép mật khẩu này ngay vì bạn sẽ cần nó cho lần đăng nhập đầu tiên.
2. Truy cập Dashboard
Mở trình duyệt và truy cập http://localhost:8080. Sử dụng admin làm tên đăng nhập và mật khẩu bạn vừa lưu. Giờ đây bạn đã có một nền tảng quản lý lỗ hổng cấp doanh nghiệp chạy ngay trên máy mình.
Đi sâu vào chi tiết: Tích hợp các công cụ quét
DefectDojo hoạt động dựa trên dữ liệu. Hãy cùng xem cách xuất kết quả từ ba công cụ thiết yếu để chúng có thể được nhập vào hệ thống một cách chính xác.
Bước 1: Quét mã nguồn với Semgrep
Semgrep xác định các mẫu mã nguồn không an toàn, như thông tin đăng nhập được viết cứng (hardcoded credentials) hoặc nguy cơ SQL injection. Bạn cần xuất kết quả dưới dạng JSON để việc nhập liệu diễn ra suôn sẻ.
# Quét kho mã nguồn và lưu kết quả dưới dạng JSON
semgrep scan --json -o semgrep_results.json .
Bước 2: Quét Container với Trivy
Trivy là tiêu chuẩn vàng cho bảo mật container. Nó phát hiện các gói hệ điều hành đã cũ và các thư viện phụ thuộc có lỗ hổng (như một phiên bản OpenSSL bị lỗi).
# Quét một image container và tạo báo cáo JSON
trivy image --format json -o trivy_results.json my-app:latest
Bước 3: Quét mạng với Nmap
Nmap cho biết các cổng nào đang mở ra internet công cộng. DefectDojo xử lý đầu ra XML của Nmap để giúp bạn theo dõi các thay đổi dịch vụ trái phép.
# Quét một dải IP cụ thể và lưu dưới dạng XML
nmap -sV -oX nmap_results.xml 192.168.1.0/24
Bước 4: Nhập các phát hiện (Findings)
DefectDojo sử dụng một hệ thống phân cấp đơn giản: Product Type → Product → Engagement. Hãy coi ‘Product’ là ứng dụng của bạn và ‘Engagement’ là một chu kỳ kiểm thử cụ thể, chẳng hạn như ‘Quét Sprint hàng tuần’.
- Product: Tên dự án (ví dụ: “Fintech-API-v2”).
- Engagement: Ngữ cảnh (ví dụ: “Kiểm định bảo mật Q2”).
- Test: Nơi chứa kết quả từ các công cụ quét cụ thể.
Bên trong Engagement của bạn, nhấn vào biểu tượng Dấu cộng (+) và chọn Import Scan Results. Chọn loại công cụ quét tương ứng—ví dụ “Trivy Scan”—tải tệp của bạn lên, và dashboard sẽ tự động phân loại các phát hiện theo mức độ nghiêm trọng.
Sử dụng nâng cao: Tự động hóa Pipeline
Việc tải lên thủ công có thể phù hợp cho một lần kiểm định duy nhất, nhưng nó không thể mở rộng. Các kỹ sư hiệu quả thường sử dụng API của DefectDojo để đẩy kết quả tự động trong quá trình CI/CD. Điều này đảm bảo mọi Merge Request đều được kiểm tra các lỗ hổng mới.
Tự động hóa với Python
Lấy API Key từ phần ‘User’ trong giao diện người dùng. Script Python dưới đây minh họa cách tải báo cáo Semgrep lên một Engagement cụ thể bằng lập trình.
import requests
DD_URL = "http://localhost:8080/api/v2/import-scan/"
API_KEY = "your_api_key_here"
ENGAGEMENT_ID = 1
headers = {"Authorization": f"Token {API_KEY}"}
files = {'file': open('semgrep_results.json', 'rb')}
data = {
'scan_type': 'Semgrep JSON Report',
'engagement': ENGAGEMENT_ID,
'active': True,
'verified': False
}
response = requests.post(DD_URL, headers=headers, data=data, files=files)
print("Thành công!" if response.status_code == 201 else f"Lỗi: {response.text}")
Tích hợp GitHub Actions
Tích hợp bảo mật trực tiếp vào quy trình làm việc của bạn. Đoạn mã dưới đây sẽ chạy Trivy và đẩy kết quả lên dashboard mỗi khi bạn push code.
- name: Chạy Trivy Scan
run: trivy image --format json -o trivy-results.json my-image:latest
- name: Tải lên DefectDojo
run: |
curl -X POST "$DD_URL/api/v2/import-scan/" \
-H "Authorization: Token $DD_API_KEY" \
-F "[email protected]" \
-F "scan_type=Trivy Scan" \
-F "engagement=$DD_ENGAGEMENT_ID"
Mẹo thực tế để thành công lâu dài
Một dashboard quản lý lỗ hổng chỉ thực sự hữu ích nếu nó sạch sẽ. Dưới đây là cách kiểm soát các thông tin nhiễu.
Tận dụng tính năng Khử trùng lặp (Deduplication)
Khử trùng lặp là tính năng mạnh mẽ nhất của DefectDojo. Nếu bạn quét cùng một image hàng ngày, bạn không cần 30 ticket giống hệt nhau cho cùng một lỗi. Hãy bật tính năng khử trùng lặp trong cài đặt hệ thống để gộp chúng thành một phát hiện duy nhất giúp theo dõi thời điểm lỗi xuất hiện lần đầu và lần cuối. Điều này có thể giảm tới 90% khối lượng công việc kiểm tra thủ công.
Thiết lập quy trình đánh giá
Các công cụ quét thường tạo ra các cảnh báo giả (false positives). Khi một báo cáo được nhập vào, các phát hiện sẽ ở trạng thái ‘Active’ nhưng chưa được xác minh. Trưởng nhóm bảo mật nên xem xét các mục ‘High’ và ‘Critical’, đánh dấu các mối đe dọa thực sự là ‘Verified’. Nếu một phát hiện không liên quan đến môi trường của bạn, hãy đánh dấu nó là ‘False Positive’ để loại bỏ khỏi các chỉ số đo lường.
Áp dụng SLA
Sử dụng DefectDojo để theo dõi Thỏa thuận mức dịch vụ (SLA). Bạn có thể quy định các lỗ hổng ‘Critical’ phải được vá trong vòng 24 giờ, trong khi các vấn đề ‘Medium’ có thời hạn 14 ngày. Hệ thống sẽ làm nổi bật các mục quá hạn, giúp dễ dàng nhận ra đội ngũ nào cần hỗ trợ. Cách tiếp cận dựa trên dữ liệu này giúp duy trì tiêu chuẩn bảo mật cao mà không gây quá tải cho đội ngũ.
Ưu tiên các bản vá có tác động cao
Hãy tạm bỏ qua các phát hiện ‘Low’ cho đến khi các lỗi ‘Critical’ được xử lý xong. Sử dụng dashboard để tìm các lỗ hổng chung trên nhiều sản phẩm. Việc vá một lỗ hổng trong một thư viện dùng chung thường giúp giải quyết nợ bảo mật cho năm hoặc sáu microservice cùng một lúc.

