Access Hub Scanner
Đang phát triểnĐồng bộ từ mã nguồn lúc 10:57, 03/10/2026
Skip to content

Kiểm thử ​

8 phút đọcCập nhật 03/10/2026access-hub-scanner, docs/11-testing.md

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ầngNộ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ảnHà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 distroMỗ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ìnhMỗ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áyMục 2.1
Bộ mẫu detectorMục 2.2
Lượt nội dungNgâ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
Fuzzgo 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 đồngbuf 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ợpScanner 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âm10 mục 6.2

2.1 Bộ "không giá trị rời máy" (SNFR-42, ADR 0011 mục 8) ​

PhầnNội dung
CanaryMỗ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ạiSpool (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 địnhKhô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ínhKiể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ểuKiể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ạyMọ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 trong testdata/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ếuCách chạy (định hướng, kiểm chứng ở P0)
Trivy (Apache-2.0)Lỗ hổng gói OSQué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 OSQué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 Guideoscap 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ếuChỉ chạy trong phòng thí nghiệm, không phân phối

Quy trình:

  1. 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.
  2. 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ể).
  3. Chuẩn hóa kết quả về (máy, mã CVE, gói nguồn).
  4. 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.
  5. 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).
  6. 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ơiKịch bản
CollectorAgent 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
SecmatchHai 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 HubMọ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ảngBả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 dungHai 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
PurgeXó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).

Trang này có giúp được bạn không?
Sửa trang này

Nội dung đồng bộ từ kho mã access-hub-scanner lúc 10:57, 03/10/2026. Khi tài liệu và mã khác nhau, mã thắng.