Yêu cầu
Mã yêu cầu: SFR- chức năng, SNFR- phi chức năng. Cột P là giai đoạn dự kiến (xem 12-roadmap, đánh số mới P0 đến P10). Số đo có nhãn đích là mục tiêu đề xuất, phải kiểm chứng ở spike P0 trước khi chốt.
Yêu cầu chức năng
Kiểm kê trên máy
| Mã | Yêu cầu | P |
|---|---|---|
| SFR-01 | Đọc danh sách gói dpkg (/var/lib/dpkg/status): tên, phiên bản đầy đủ (epoch, upstream, revision), kiến trúc, gói nguồn và phiên bản nguồn, trạng thái cài | 1 |
| SFR-02 | Đọc thông tin hệ điều hành từ /etc/os-release (ID, VERSION_ID, VERSION_CODENAME) và kernel đang chạy (uname), danh sách gói kernel đã cài | 1 |
| SFR-03 | Đọc cơ sở dữ liệu rpm (BerkeleyDB trên RHEL 7 và 8 họ, SQLite trên RHEL 9 họ, NDB trên SUSE) bằng thư viện Go thuần, không gọi rpm | 3 |
| SFR-04 | Đọc /lib/apk/db/installed (Alpine) | 3 |
| SFR-05 | Phát hiện Ubuntu Pro hoặc ESM, luồng RHEL EUS khi đọc được từ tệp cấu hình kho (xem Q15) | 3 |
| SFR-06 | Băm chuẩn hóa inventory (inventory_hash) để không gửi lại khi không đổi | 1 |
| SFR-07 | Phát hiện thay đổi DB gói rẻ (so mtime và kích thước tệp DB gói) để quét sớm sau khi cài hoặc gỡ gói | 1 |
Kiểm kê mở rộng
| Mã | Yêu cầu | P |
|---|---|---|
| SFR-50 | Dịch vụ: unit systemd (tên, trạng thái bật, trạng thái chạy, gói sở hữu unit), SysV init trên distro cũ | 6 |
| SFR-51 | Phần mềm ngoài trình quản lý gói: snap, flatpak, binary trong /usr/local và /opt (tên, đường dẫn, kích thước, băm) | 6 |
| SFR-52 | Thư viện ngôn ngữ ở vị trí hệ thống và thư mục quản trị viên chọn: dist-info Python, npm toàn cục, .jar, build info của binary Go; định danh purl | 6 |
| SFR-53 | So khớp lỗ hổng cho hệ sinh thái ngôn ngữ bằng dữ liệu OSV (PyPI, npm, Maven, Go, RubyGems, Composer) | 6 |
| SFR-54 | Kiểm kê tệp: thống kê theo gốc và danh sách tệp đáng chú ý (14 mục 6), chỉ siêu dữ liệu; danh sách đầy đủ ở lại trong chỉ mục cục bộ | 2, 6 |
| SFR-55 | Tìm máy theo dịch vụ hoặc phần mềm trong phạm vi công ty | 6 |
So khớp lỗ hổng (tập trung)
| Mã | Yêu cầu | P |
|---|---|---|
| SFR-10 | So khớp gói Ubuntu và Debian với dữ liệu distro (Debian Security Tracker, Ubuntu OSV hoặc OVAL), theo phiên bản phát hành | 1 |
| SFR-11 | So khớp gói RHEL, AlmaLinux, Rocky với dữ liệu Red Hat CSAF/VEX hoặc OVAL và errata của Alma, Rocky | 3 |
| SFR-12 | So sánh phiên bản đúng quy tắc từng hệ (dpkg, rpm, apk), có bộ kiểm thử từ dữ liệu thật | 1, 3 |
| SFR-13 | Gộp bí danh (CVE, USN, DSA, RHSA, GHSA) về một mã chuẩn, ưu tiên CVE | 1 |
| SFR-14 | Phân biệt trạng thái: có bản sửa, chưa có bản sửa (no_fix), distro không sửa (wont_fix), không ảnh hưởng | 1 |
| SFR-15 | So khớp lại toàn bộ inventory đã lưu khi DB lỗ hổng cập nhật, chỉ phát delta | 1 |
| SFR-16 | Làm giàu bằng CVSS (distro, NVD), EPSS, KEV | 3 |
| SFR-17 | Kernel: so khớp gói kernel đang chạy, báo riêng trường hợp đã cài bản sửa nhưng chưa khởi động lại | 1 |
Kiểm tra cấu hình
| Mã | Yêu cầu | P |
|---|---|---|
| SFR-20 | Chạy các kiểm tra AHS-* ở 05, chỉ đọc, kết quả pass, fail, error, not_applicable, unknown | 5 |
| SFR-21 | Bật tắt từng kiểm tra theo công ty, theo tag máy (cấu hình từ Access Hub, chỉ chọn trong danh sách đã biên dịch) | 5 |
| SFR-22 | Danh sách cổng nghe dự kiến theo máy, theo vai trò hoặc tag, so sánh tập trung | 5 |
| SFR-23 | Kiểm tra TLS (hạn chứng chỉ, giao thức, bộ mã yếu) trên dịch vụ cục bộ | 5 |
Quét nội dung (ADR 0009)
| Mã | Yêu cầu | P |
|---|---|---|
| SFR-60 | Lượt nội dung là unit và timer riêng (accesshub-scanner-content), chỉ chạy trong khung giờ yên tĩnh, dừng và lưu điểm dừng khi hết khung hoặc hết ngân sách | 2 |
| SFR-61 | Phạm vi theo vị trí đích, hồ sơ gốc, gốc tùy chọn từ trung tâm (tối đa 16), danh sách cấm cứng, loại trừ của công ty, deny_roots và allow_central_roots cục bộ thắng cấu hình trung tâm | 2 |
| SFR-62 | Lọc tệp: chỉ tệp thường, không theo symlink, không vượt điểm gắn, bỏ hệ thống tệp ảo và mạng, trần kích thước theo loại quét, nhận nhị phân bằng đuôi và magic, UTF-16 có BOM | 2 |
| SFR-63 | Chỉ mục cục bộ tăng dần: chỉ đọc lại tệp đổi (dev, inode, size, mtime, ctime) hoặc khi phiên bản quy tắc đổi; baseline trải nhiều đêm | 2 |
| SFR-64 | Nhường tài nguyên theo PSI (hoặc loadavg khi không có PSI), posix_fadvise, giới hạn tốc độ đọc | 2 |
| SFR-65 | Báo cáo độ phủ: tệp hợp lệ, đã quét, bị bỏ theo lý do, baseline xong hay chưa, rules_version | 2 |
Bí mật bị lộ (14 mục 3, 4)
| Mã | Yêu cầu | P |
|---|---|---|
| SFR-70 | Quét vị trí đích theo từng thư mục nhà và đường dẫn hệ thống (SSH, cloud CLI, Docker, kubeconfig, git, kho gói, CSDL, lịch sử shell và client CSDL, Wi-Fi, VPN) | 2 |
| SFR-71 | Detector AHK-* biên dịch sẵn: khóa riêng, khóa cloud, token kho mã, chat, cổng thanh toán, chuỗi kết nối CSDL, gán bí mật trong .env và tệp cấu hình, JWT, Terraform state, kho khóa nhị phân, dump và sao lưu trong thư mục web | 2 |
| SFR-72 | Bộ xác thực ngoại tuyến (checksum, phân tích PEM và OpenSSH, Luhn, cấu trúc); không xác thực sống qua mạng | 2 |
| SFR-73 | Mức độ theo lớp detector và mức phơi nhiễm, hạ bậc ở vị trí dự kiến (14 mục 2) | 2 |
| SFR-74 | Fingerprint có khóa hai phạm vi; Access Hub hiện "cùng bí mật trên N máy" trong một công ty | 2 |
| SFR-75 | Bật, tắt detector theo công ty; ngoại lệ theo detector cộng mẫu đường dẫn hoặc fingerprint | 2, 7 |
| SFR-76 | Hướng dẫn khắc phục dạng văn bản, ưu tiên xoay vòng bí mật (14 mục 8) | 2 |
Dữ liệu cá nhân (14 mục 5)
| Mã | Yêu cầu | P |
|---|---|---|
| SFR-80 | Detector AHP-* cho CCCD, CMND, số điện thoại di động và cố định Việt Nam, email, số thẻ thanh toán (IIN, Luhn), hộ chiếu, có ngữ cảnh tiếng Việt có và không dấu | 4 |
| SFR-81 | Gom theo tệp, match_count, độ tin cậy, ngưỡng số lượng, không preview | 4 |
| SFR-82 | Định dạng cấu trúc: CSV, TSV, JSON, NDJSON, YAML, dump SQL văn bản; tên cột, khóa làm ngữ cảnh | 4 |
| SFR-83 | OOXML (.xlsx, .docx) có giới hạn giải nén | 4 |
| SFR-84 | Tắt mặc định; công ty bật, chọn hồ sơ và gốc, ngưỡng | 4 |
| SFR-85 | Bản đồ dữ liệu cá nhân trong Access Hub: theo máy, tệp, loại, chỉ số đếm | 4 |
Báo cáo finding nội dung (ADR 0011)
| Mã | Yêu cầu | P |
|---|---|---|
| SFR-90 | Finding nội dung chỉ mang các trường của ADR 0011 mục 2; kiểm tra ở scanner (tầng kiểu), Access Hub Collector, secmatch, Access Hub | 2 |
| SFR-91 | Quyền security.secrets.view, security.pii.view, security.content.manage; người chỉ có security.view thấy số đếm | 2, 4 |
| SFR-92 | Thông báo, webhook, xuất không mang đường dẫn, preview, fingerprint (xuất có đường dẫn khi người xuất có quyền tương ứng) | 2, 7 |
| SFR-93 | Audit khi mở chi tiết finding bí mật và khi xuất | 2 |
Chấm điểm, báo cáo, quy trình
| Mã | Yêu cầu | P |
|---|---|---|
| SFR-30 | Điểm rủi ro cho mỗi finding, máy, công ty, giải thích được từng thành phần | 3 |
| SFR-31 | SLA theo mức ưu tiên, cấu hình theo công ty, cảnh báo sắp quá hạn và quá hạn | 3 |
| SFR-32 | Dashboard công ty: máy dễ tổn thương nhất, theo mức độ, theo gói, KEV, xu hướng 30, 90, 365 ngày, MTTR | 3, 7 |
| SFR-33 | Tìm máy theo gói và phiên bản ("máy nào có openssl dưới 3.0.2-0ubuntu1.15") trong phạm vi công ty | 3 |
| SFR-34 | Ngoại lệ: chấp nhận rủi ro, dương tính giả, có biện pháp bù; có lý do, người duyệt, hạn dùng, tự mở lại khi hết hạn | 7 |
| SFR-35 | Thông báo và webhook: finding ưu tiên cao mới, CVE trở thành KEV, SLA sắp quá hạn, ngoại lệ sắp hết hạn, máy lâu không quét | 7 |
| SFR-36 | Xuất CSV, XLSX, PDF báo cáo theo công ty | 7 |
| SFR-37 | API v1 cho toàn bộ chức năng, theo quy ước API của Access Hub | 3, 7 |
| SFR-38 | Thống kê tổng hợp ẩn danh cho nền tảng (không tên công ty, không tên máy, ngưỡng k) | 7 |
| SFR-39 | Hướng dẫn khắc phục dạng văn bản (lệnh gợi ý để người dùng tự chạy), không có nút thực thi | 3 |
Vận hành
| Mã | Yêu cầu | P |
|---|---|---|
| SFR-40 | Gói .deb, .rpm cho scanner, systemd service và timer, gỡ sạch | 1 |
| SFR-41 | DB lỗ hổng dựng hằng ngày, ký, phát hành; secmatch tự kéo và xác minh | 1 |
| SFR-42 | Dedicated offline: nhập gói DB bằng tay, cảnh báo DB cũ | 10 |
| SFR-43 | Xóa toàn bộ dữ liệu quét khi xóa vĩnh viễn máy hoặc công ty | 1 |
| SFR-44 | Windows: kiểm kê bản cài và KB, so khớp với dữ liệu Microsoft | 8 |
| SFR-45 | Container: kiểm kê image của container đang chạy trên máy | 9 |
Yêu cầu phi chức năng
Ngân sách tài nguyên trên máy
Access Hub Agent có ngân sách CPU trung bình dưới 1% một lõi, RSS dưới 50 MB (ANFR-01, ANFR-02 của Agent) và giới hạn cứng MemoryMax=96M, CPUQuota=25% trong unit. Scanner là tiến trình chạy rồi thoát (systemd timer, Type=oneshot), nên ngân sách tính theo mỗi lần chạy và theo trung bình ngày.
| Mã | Yêu cầu | Số đo (đích) |
|---|---|---|
| SNFR-01 | CPU một lần quét inventory (máy 3.000 gói) | Không quá 3 giây CPU |
| SNFR-02 | CPU một lần quét đầy đủ (lượt siêu dữ liệu: inventory cộng mọi kiểm tra P5, phạm vi duyệt lstat mặc định) | Không quá 60 giây CPU, thời gian thực không quá 10 phút |
| SNFR-03 | CPU trung bình ngày | Không quá 0,1% một lõi (khoảng 86 giây CPU mỗi ngày) |
| SNFR-04 | Bộ nhớ đỉnh | RSS không quá 128 MB, giới hạn cứng MemoryMax=192M |
| SNFR-05 | IO | Duyệt tệp tối đa 200.000 inode mỗi lần, đọc không quá 300 MB, IOSchedulingClass=idle, Nice=19. Vượt giới hạn thì dừng duyệt, đánh dấu truncated |
| SNFR-06 | Đĩa | Spool tối đa 5 MB, giữ tối đa 2 báo cáo, log xoay vòng tối đa 10 MB |
| SNFR-07 | Khi rảnh | Không có tiến trình thường trú, RSS bằng 0 giữa hai lần chạy |
| SNFR-08 | Kích thước binary | Không quá 25 MB (chờ spike S1 đo thư viện đọc rpmdb) |
| SNFR-09 | Không mạng | Scanner chạy với RestrictAddressFamilies=AF_UNIX, IPAddressDeny=any (ngoại lệ có kiểm soát cho TLS cục bộ, xem 05 và Q17) |
| SNFR-10 | Không ghi ngoài thư mục của mình | ProtectSystem=strict, ReadWritePaths chỉ gồm spool và log |
| SNFR-11 | Băng thông | Báo cáo đầy đủ không quá 150 KB sau nén cho 3.000 gói. Không đổi thì chỉ gửi băm (dưới 1 KB) |
Lượt nội dung (ADR 0009) có ngân sách riêng, chạy bằng unit riêng trong khung giờ yên tĩnh:
| Mã | Yêu cầu | Số đo (đích) |
|---|---|---|
| SNFR-12 | CPU mỗi lượt nội dung | CPUQuota=25%, Nice=19, tối đa 300 giây CPU mỗi lượt |
| SNFR-13 | Bộ nhớ lượt nội dung | RSS đỉnh không quá 192 MB, MemoryMax=256M |
| SNFR-14 | IO lượt nội dung | IOSchedulingClass=idle, tốc độ đọc tối đa 16 MiB/s, tối đa 1 GiB mỗi lượt (miền 128 MiB đến 4 GiB), tối đa 1.000.000 mục duyệt, POSIX_FADV_DONTNEED sau mỗi tệp |
| SNFR-15 | CPU trung bình ngày khi bật quét nội dung, sau baseline | Không quá 0,5% một lõi (khoảng 432 giây CPU mỗi ngày) gồm cả lượt siêu dữ liệu |
| SNFR-16 | Baseline | Máy có tới 5 GiB nội dung hợp lệ sau lọc: xong trong 5 đêm |
| SNFR-17 | Nhường tài nguyên | PSI some avg10 CPU trên 40% hoặc IO trên 20% thì dừng 30 giây; p99 của tải chuẩn tăng không quá 5% khi lượt nội dung chạy (10 mục 6.3) |
| SNFR-18 | Đĩa cho trạng thái nội dung | Chỉ mục cục bộ tối đa 64 MiB; phần nội dung của báo cáo tối đa 256 KB sau nén |
| SNFR-19 | Không core dump | LimitCORE=0 cho cả hai unit |
Tần suất quét
| Mã | Yêu cầu | Mặc định đề xuất |
|---|---|---|
| SNFR-20 | Timer kiểm tra thay đổi DB gói | Mỗi giờ, RandomizedDelaySec=30min, chi phí chỉ là stat |
| SNFR-21 | Inventory đầy đủ | Khi DB gói đổi, và ít nhất mỗi 24 giờ |
| SNFR-22 | Kiểm tra cấu hình | Mỗi 24 giờ, giờ chạy lệch ngẫu nhiên theo máy |
| SNFR-23 | Trần tần suất theo gói | Tham số security_scan_min_interval_hours (Q10) |
| SNFR-24 | So khớp lại tập trung | Mỗi lần DB lỗ hổng đổi (thường mỗi ngày), không cần máy làm gì |
| SNFR-25 | Độ trễ phát hiện | CVE mới có trong DB thì finding xuất hiện trên Access Hub không quá 2 giờ sau khi secmatch nạp DB |
| SNFR-26 | Khung giờ yên tĩnh của lượt nội dung | Mặc định 01:00 đến 05:00 giờ máy, khởi động lệch ngẫu nhiên trong 60 phút đầu; công ty và quản trị viên máy chỉnh được (Q38) |
| SNFR-27 | Độ trễ phát hiện nội dung | Bí mật hoặc dữ liệu cá nhân mới xuất hiện trên Access Hub sau lượt nội dung kế tiếp (thường trong 24 giờ) khi baseline đã xong |
Chế độ offline
| Mã | Yêu cầu | Số đo |
|---|---|---|
| SNFR-30 | Máy mất mạng | Scanner vẫn chạy, spool giữ báo cáo mới nhất (bản sau thay bản trước), Agent gửi khi có mạng |
| SNFR-31 | Dedicated không Internet | Nhập gói DB ký số bằng tay (USB, kho nội bộ), secmatch xác minh chữ ký và chống quay lui phiên bản |
| SNFR-32 | DB cũ | Access Hub hiện cảnh báo khi DB cũ hơn 3 ngày (cloud) hoặc ngưỡng cấu hình (Dedicated, mặc định 14 ngày); finding vẫn hiển thị kèm ngày DB |
| SNFR-33 | Secmatch mất kết nối Access Hub | Outbox bền vững giữ delta ít nhất 24 giờ (giống NFR-08 của Collector) |
Chất lượng và an toàn
| Mã | Yêu cầu | Số đo (đích) |
|---|---|---|
| SNFR-40 | Độ chính xác gói OS (distro chính thức) | Trên bộ ground truth đã đối soát (11): recall không dưới 95%, precision không dưới 95% |
| SNFR-41 | Cô lập tenant | Không có đường nào đọc, ghi, xóa dữ liệu quét của công ty khác. Kiểm thử hai công ty ở scanner spool, Collector, secmatch, Access Hub |
| SNFR-42 | Không giá trị rời máy (yêu cầu cứng) | Bộ kiểm thử "không giá trị rời máy" (11 mục 2.1, ADR 0011 mục 8) đạt ở mọi bản phát hành: không canary nào (hoặc biến thể base64, hex, URL-encode) xuất hiện trong spool, log, stdout, stderr, scan --print, chỉ mục, payload sau Collector và secmatch, sự kiện gửi Access Hub; preview không dài hơn mức cho phép; sensitive_data không có preview; K_host không xuất hiện ngoài tệp khóa. Thất bại là chặn phát hành |
| SNFR-43 | Sức chứa secmatch | 10.000 máy, 3.000 gói mỗi máy: so khớp lại toàn bộ dưới 30 phút trên 4 vCPU, 16 GB (đích, spike S5) |
| SNFR-44 | Tương thích | Secmatch nhận schema_version N và N-1 của báo cáo ít nhất 12 tháng |
| SNFR-45 | Quan sát được | Secmatch có /metrics, /healthz, /readyz, log JSON có request_id; scanner ghi scan_stats trong báo cáo |
| SNFR-46 | Trang Access Hub | Danh sách finding 100.000 dòng của một công ty: p95 dưới 1 giây với bộ lọc có chỉ mục |
| SNFR-47 | Độ chính xác bí mật | Detector độ tin cậy high: precision và recall không dưới 90% trên bộ mẫu (11 mục 2.2) |
| SNFR-48 | Độ chính xác dữ liệu cá nhân | Detector độ tin cậy high (CCCD có ngữ cảnh, thẻ đạt Luhn): precision không dưới 95% trên bộ mẫu; tỷ lệ finding low trên máy sạch được đo và công bố |
| SNFR-49 | Thông lượng phát hiện | Không dưới 30 MiB/s mỗi lõi cho bộ quy tắc bí mật đầy đủ, không dưới 60 MiB/s mỗi lõi cho bộ tách dữ liệu cá nhân (S6) |
| SNFR-50 | Cô lập tenant cho dữ liệu mới | Finding nội dung, phần mềm, dịch vụ, thống kê tệp có company_id ở mọi kho; kiểm thử hai công ty như SNFR-41; fingerprint của hai công ty không so được với nhau |
Ma trận hệ điều hành
| Hệ điều hành | Inventory | Dữ liệu lỗ hổng | Kiểm tra cấu hình | P |
|---|---|---|---|---|
| Ubuntu 20.04, 22.04, 24.04 LTS | dpkg | Ubuntu (OSV hoặc OVAL), USN | Có | 1, 5 |
| Ubuntu 18.04 | dpkg | Như trên, phần lớn bản sửa chỉ ở ESM | Có, cộng cảnh báo hết hỗ trợ | 1 |
| Debian 10, 11, 12 | dpkg | Debian Security Tracker, DSA, DLA | Có | 1, 5 |
| RHEL, AlmaLinux, Rocky 8, 9 | rpm (BDB, SQLite) | Red Hat CSAF/VEX hoặc OVAL, ALSA, RLSA | Có | 3, 5 |
| RHEL, CentOS 7 | rpm (BDB) | Red Hat; CentOS 7 đã hết vòng đời | Có, cộng cảnh báo hết hỗ trợ | 3 |
| Amazon Linux 2, 2023 | rpm | ALAS (cần khảo sát nguồn, Q15) | Có | 3 hoặc sau |
| SUSE, openSUSE | rpm (NDB) | SUSE OVAL hoặc CSAF | Best-effort | Sau P5 |
| Alpine | apk | Alpine secdb | Một phần | 3 (chủ yếu cho P9 container) |
| Windows | Registry, KB | Microsoft (MSRC) | Tập con | 8 |
Agent hỗ trợ Ubuntu 18.04 trở lên, Debian 10 trở lên, RHEL họ 7 trở lên, Amazon Linux 2 trở lên (docs/02-requirements.md của Agent). Scanner chỉ chạy khi Agent đã cài (ADR 0001), nên ma trận scanner là tập con của ma trận Agent.