Kiểm thử
1. Nguyên tắc
- Độ chính xác so khớp là sản phẩm: mọi thay đổi ở so sánh phiên bản, parser, ánh xạ dữ liệu distro phải chạy lại bộ golden và benchmark độ chính xác.
- Kiểm thử cô lập tenant và "không giá trị rời máy" là bắt buộc, không phải tùy chọn, và là cổng phát hành.
- Độ chính xác của detector cũng là sản phẩm: mọi thay đổi quy tắc chạy lại bộ mẫu (mục 2.2).
- Lỗi tìm thấy ở máy thật phải có fixture tái hiện trước khi sửa.
- Kiểm thử chạy cục bộ được: fixture là tệp tĩnh, DB lỗ hổng dùng ảnh chụp cố định trong repo, không gọi Internet.
2. Các tầng
| Tầng | Nội dung |
|---|---|
| Đơn vị | Parser dpkg, rpmdb, apk, os-release, sshd_config (Include, Match, giá trị đầu tiên), sudoers (include, alias), login.defs, PAM, mountinfo; so sánh phiên bản; chuẩn hóa và băm inventory; dựng SecurityReport, chia phần |
| Bảng so sánh phiên bản | Hàng nghìn cặp lấy từ công cụ gốc (dpkg --compare-versions, rpmdev-vercmp, apk version -t) chạy trong container distro ở CI, lưu thành bảng kiểm thử; thêm cặp từ mọi lỗi tìm thấy |
| Fixture theo distro | Mỗi distro trong ma trận 01: tệp DB gói thật, /etc rút gọn, /proc/sys, /proc/net ghi sẵn, đặt dưới testdata/<distro>/<version>/ và scanner đọc qua gốc hệ thống tệp cấu hình được (--root) |
| Golden | (fixture, ảnh chụp DB cố định) cho ra inventory JSON và danh sách finding cố định; khác golden thì kiểm thử thất bại, cập nhật golden phải qua review |
| Kiểm tra cấu hình | Mỗi AHS-* có fixture pass, fail, not_applicable, unknown (nếu có), cộng biến thể theo distro (/etc/shadow 0640 trên Debian là hợp lệ) |
| Không giá trị rời máy | Mục 2.1 |
| Bộ mẫu detector | Mục 2.2 |
| Lượt nội dung | Ngân sách, điểm dừng, đi tiếp, tăng dần theo chỉ mục, thay đổi phiên bản quy tắc, PSI giả lập, khung giờ, local.conf thắng cấu hình trung tâm, danh sách cấm cứng không vượt được, symlink, FIFO, tệp đổi giữa lstat và open, điểm gắn, hệ thống tệp ảo |
| Fuzz | go test -fuzz cho mọi parser trên máy (gồm PEM, OpenSSH, PuTTY, JSON, YAML, CSV, OOXML, bộ tách token), cho giải mã SecurityReport ở Access Hub Collector và secmatch, cho tham số API nội bộ của secmatch; chạy ngắn trong CI như Collector (make fuzz) |
| Hợp đồng | buf breaking ở repo Collector; golden protobuf cho từng schema_version; mẫu payload thật cho Access Hub POST /events dùng chung hai phía |
| Tích hợp | Scanner ghi spool, mockcollector của Access Hub Agent nhận, secmatch với kho thật (container), mock Access Hub; luồng đầy đủ một máy |
| Tài nguyên | Đo CPU, RSS, IO trên máy ảo ma trận (10 mục 6.1) trong CI hằng đêm hoặc trước phát hành |
| Hiệu năng trung tâm | 10 mục 6.2 |
2.1 Bộ "không giá trị rời máy" (SNFR-42, ADR 0011 mục 8)
| Phần | Nội dung |
|---|---|
| Canary | Mỗi detector có ít nhất một giá trị canary hợp lệ (đạt bộ xác thực) mang dấu riêng, sinh ngẫu nhiên mỗi lần chạy; cộng bí mật giả cũ (/etc/shadow với băm giả, khóa SSH giả, biến môi trường giả, dòng sudoers có lệnh dài) |
| Vị trí | Canary đặt ở mọi loại vị trí: vị trí đích, web_root, lịch sử shell, CSV, JSON, dump SQL, OOXML, tên tệp, dòng rất dài, biên giữa hai khối đọc, UTF-16 |
| Đầu ra thu lại | Spool (giải nén), log, stdout, stderr, scan --print, status, detectors list, chỉ mục cục bộ (trừ tệp khóa), thông điệp lỗi khi ép lỗi đọc, payload Collector chuyển cho secmatch, sự kiện secmatch gửi Access Hub, phản hồi API và trang Access Hub, tệp xuất, thông báo, webhook |
| Khẳng định | Không xuất hiện canary hay biến thể (base64 chuẩn và URL, hex hoa và thường, URL-encode, đảo hoa thường, đảo ngược chuỗi, mọi chuỗi con dài hơn số ký tự preview cho phép); preview đúng mẫu và độ dài; sensitive_data không có preview; K_host không xuất hiện ngoài tệp khóa; fingerprint của dữ liệu cá nhân luôn phạm vi h |
| Thuộc tính | Kiểm thử thuộc tính với giá trị ngẫu nhiên theo định dạng từng detector, hàng nghìn lần mỗi lần chạy CI |
| Tầng kiểu | Kiểm thử tĩnh (phân tích AST trong CI): kiểu kết quả của internal/detect không có trường string hay []byte nào ngoài các trường được phép |
| Khi chạy | Mọi PR (bản rút gọn), mọi bản phát hành (đầy đủ, cổng chặn) |
2.2 Bộ mẫu detector (SNFR-47, SNFR-48)
- Ca dương, ca âm, ca allowlist cho mọi detector
AHK-*,AHP-*, lưu trongtestdata/detect/(giá trị tổng hợp, không bao giờ là bí mật hay dữ liệu cá nhân thật; khóa riêng sinh riêng cho kiểm thử; số CCCD, số thẻ sinh theo cấu trúc, số thẻ dùng dải thử nghiệm). - Bộ "máy sạch": ảnh chụp hệ thống tệp của các distro trong ma trận sau khi cài gói phổ biến (máy chủ web, CSDL, Docker, ngôn ngữ), không có bí mật thật: mọi finding ở đây là dương tính giả, đo tỷ lệ theo detector.
- Chuẩn đối chiếu trong phòng thí nghiệm: gitleaks (chế độ thư mục) và trufflehog (tắt xác thực, không mạng) trên cùng bộ mẫu; khác biệt được phân loại thủ công như mục 3.
- Báo cáo precision, recall theo detector mỗi bản phát hành; giảm là chặn phát hành.
3. Đo độ chính xác so với công cụ đã biết
Mục đích: biết scanner đang đúng đến đâu, không phải sao chép kết quả của công cụ khác. Công cụ đối chiếu chỉ chạy trong môi trường kiểm thử, không nhúng vào sản phẩm (ADR 0007).
| Công cụ | Dùng để đối chiếu | Cách chạy (định hướng, kiểm chứng ở P0) |
|---|---|---|
| Trivy (Apache-2.0) | Lỗ hổng gói OS | Quét hệ thống tệp gốc của máy thử hoặc image cùng distro |
| Grype (Apache-2.0) | Lỗ hổng gói OS | Quét thư mục gốc hoặc image |
| OpenSCAP (LGPL-2.1) | Lỗ hổng theo OVAL của distro; kiểm tra cấu hình theo hồ sơ SCAP Security Guide | oscap oval eval với OVAL của distro; oscap xccdf eval với hồ sơ phù hợp |
| Vuls (GPL-3.0) | Tùy chọn, chỉ để đối chiếu | Chỉ chạy trong phòng thí nghiệm, không phân phối |
Quy trình:
- Dựng bộ máy thử cố định (ma trận
01, mỗi distro một máy cũ chưa cập nhật và một máy cập nhật đầy đủ), chụp lại DB gói làm fixture. - Chạy scanner và các công cụ đối chiếu cùng ngày dữ liệu (đóng băng DB của mỗi công cụ nếu có thể).
- Chuẩn hóa kết quả về
(máy, mã CVE, gói nguồn). - Hợp nhất: mục mọi công cụ đồng ý là "đồng thuận"; mục bất đồng được người phân loại thủ công dựa trên advisory của distro (có bản sửa ở phiên bản nào, phiên bản đã cài là gì) và ghi kết luận vào tệp ground truth trong repo.
- Tính precision, recall của scanner trên ground truth; mục tiêu SNFR-40 (không dưới 95% mỗi chỉ số cho gói OS trên distro chính thức).
- Theo dõi theo thời gian: báo cáo mỗi bản phát hành, giảm chỉ số là chặn phát hành.
Ghi nhận khác biệt có chủ đích: trạng thái no_fix, wont_fix (công cụ khác có thể ẩn hoặc hiện), kernel không chạy, gói bên thứ ba. Các khác biệt này tách thành cột riêng, không tính là lỗi nếu khớp chính sách của sản phẩm.
Kiểm tra cấu hình: so AHS-* với kết quả oscap xccdf trên những mục tương đương; khác biệt được phân loại như trên.
4. Cô lập tenant
| Nơi | Kịch bản |
|---|---|
| Collector | Agent công ty A gửi báo cáo có trường giả danh B: chuyển tiếp với danh tính A; ma trận hai tenant hiện có mở rộng cho endpoint mới |
| Secmatch | Hai công ty có máy cùng server_id giả và cùng gói: tra gói, tìm gói, tóm tắt, xóa của A không trả, không đụng dữ liệu B; HASH_ONLY của A không khớp inventory của B; sự kiện luôn mang company_id của inventory |
| Access Hub | Mọi endpoint, trang, job, xuất, thông báo, webhook: người dùng A không thấy finding, ngoại lệ, gói, kết quả kiểm tra, thống kê của B; sự kiện secmatch cho máy không thuộc công ty bị từ chối; ngoại lệ phạm vi công ty A không áp cho B |
| Nền tảng | Bảng thống kê không có định danh công ty; mục dưới ngưỡng k bị ẩn; vai trò nền tảng không gọi được endpoint tenant |
| Finding nội dung | Hai công ty có cùng bí mật canary trên máy: fingerprint c khác nhau, "cùng bí mật trên N máy" không đếm chéo; người công ty A không thấy đường dẫn, số đếm của B; K_company của A không đến Agent của B; người thiếu security.secrets.view, security.pii.view chỉ thấy số đếm |
| Purge | Xóa A ở Access Hub và secmatch không đụng B; sự kiện đến muộn của A bị từ chối unknown_server |
5. Access Hub (theo quy ước dự án)
Pest cho mọi endpoint (quyền, cô lập, kiểm tra đầu vào, idempotency events, phân trang), mẫu tests/ApiSamples, PHPStan, Pint, ESLint, vue-tsc, kiểm thử trình duyệt cho trang mới gồm trạng thái "Không có dữ liệu" khi secmatch không sẵn sàng. Chạy toàn bộ suite trước khi báo xong (bài học về helper toàn cục của Pest).