Vận hành
1. Triển khai trên máy
| Bước | Chi tiết |
|---|---|
| Điều kiện | Công ty có gói Scanner (security_scanning) còn chỗ trong hạn mức scan_hosts. Không cần Access Hub Agent (Q25) |
| Cài | Tải .deb hoặc .tar.gz của bản phát hành Scanner (artifact riêng, Q21), kiểm checksum, apt install ./accesshub-scanner_<ver>_<arch>.deb |
| Enroll | Tạo mã enroll Scanner trong Access Hub (trang Máy Scanner, quyền security.hosts.manage), trên máy chạy accesshub-scan-uploader enroll --url <ingest> --token-file <tệp> rồi xóa tệp mã. Máy đã có Agent vẫn phải enroll Scanner riêng; Access Hub gắn hai danh tính vào cùng Server |
| Gói tạo | Người dùng hệ thống accesshub-scanner (bộ đọc) và accesshub-scan-uploader (bộ gửi), không shell, không home; thư mục /var/lib/accesshub-scanner/spool (accesshub-scanner:accesshub-scan-uploader, 2750), /var/lib/accesshub-scan-uploader (0750), bốn unit ở mục 1.1 (hai timer bật sẵn). Từ P2 thêm accesshub-scanner-content.service, .timer, K_host, /etc/accesshub-scanner/local.conf.example (chưa có trong gói hiện tại) |
| Bật ở trung tâm | Access Hub, trang Cài đặt bảo mật, theo gói của công ty. Chưa bật thì scanner chỉ ghi trạng thái disabled_by_policy |
| Cài hàng loạt | Mẫu Ansible, cloud-init riêng của Scanner (chép cách làm của giám sát): cài gói, đặt tệp mã enroll, chạy enroll một lần |
| Quyền quyết định cục bộ | Quản trị viên máy tạo /etc/accesshub-scanner/local.conf để tắt lượt nội dung, cấm gốc, từ chối gốc tùy chọn từ trung tâm, đổi khung giờ (ADR 0009 mục 2) |
| Gỡ | apt remove giữ spool đến khi purge; purge xóa thư mục (gồm chỉ mục cục bộ, K_host, khóa máy Scanner) và hai người dùng; máy Scanner trong Access Hub cần thu hồi để trả chỗ hạn mức. Gỡ gói Scanner không ảnh hưởng Agent và ngược lại. Access Hub hiện máy "không còn báo cáo" sau 48 giờ, finding giữ nguyên đến khi người dùng xử lý hoặc máy bị xóa |
1.1 Tên unit và lệnh cài (chốt 2026-10-03, dùng cho trang giấy phép của Access Hub)
| Unit | Kiểu | Việc | Bật khi cài |
|---|---|---|---|
accesshub-scanner.service | oneshot, tài khoản accesshub-scanner, chỉ CAP_DAC_READ_SEARCH, không mạng | Bộ đọc: kiểm kê, ghi spool; tôn trọng scan_window | Do timer gọi |
accesshub-scanner.timer | Mỗi giờ (OnUnitActiveSec=1h, lệch ngẫu nhiên 30 phút, OnBootSec=15min) | Gọi bộ đọc; bộ đọc tự quyết có quét không | Có (enable --now) |
accesshub-scan-uploader.service | oneshot, tài khoản accesshub-scan-uploader, không capability, chỉ HTTPS đi ra; ConditionPathExists=/var/lib/accesshub-scan-uploader/identity.json | Bộ gửi: gửi báo cáo, làm mới config.pb và siêu dữ liệu máy | Do timer gọi, chỉ chạy sau khi enroll |
accesshub-scan-uploader.timer | Mỗi 5 phút (lệch 60 giây, OnBootSec=5min) | Gọi bộ gửi | Có (enable --now) |
Tên gói: accesshub-scanner. Hai binary: /usr/bin/accesshub-scanner, /usr/bin/accesshub-scan-uploader. Gói dùng chung cho Ubuntu 20.04, 22.04, 24.04 và Debian 11, 12, 13 (binary Go tĩnh, không phụ thuộc thư viện), kiến trúc amd64, arm64.
Ubuntu và Debian, gói .deb (<ver> không có tiền tố v, ví dụ 0.1.2; <arch> là amd64 hoặc arm64; lệnh dùng bash). Đây là dạng nên hiện trên trang giấy phép:
curl -fsSLO https://<nơi phát hành>/accesshub-scanner_<ver>_<arch>.deb
curl -fsSLO https://<nơi phát hành>/SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMS
sudo apt install ./accesshub-scanner_<ver>_<arch>.deb
sudo install -m 0400 -o accesshub-scan-uploader /dev/stdin /run/scanner-enrol-code <<< '<MÃ ENROLL>'
sudo -u accesshub-scan-uploader accesshub-scan-uploader enroll --url https://<ingest của Scanner> --token-file /run/scanner-enrol-code
sudo rm -f /run/scanner-enrol-code
systemctl list-timers 'accesshub-scan*'
sudo -u accesshub-scan-uploader accesshub-scan-uploader statusenroll và rotate phải chạy bằng tài khoản accesshub-scan-uploader (sudo -u ...) để khóa máy thuộc đúng tài khoản; chạy bằng root sẽ bị từ chối. Mã enroll dùng một lần, tệp mã xóa ngay sau khi enroll.
Bản .tar.gz (máy không dùng apt, cùng nội dung, không có script cài):
tar -xzf accesshub-scanner-<ver>-linux-<arch>.tar.gz
cd accesshub-scanner-<ver>-linux-<arch>
sudo install -m 0755 accesshub-scanner accesshub-scan-uploader /usr/bin/
sudo install -m 0644 accesshub-scanner.service accesshub-scanner.timer \
accesshub-scan-uploader.service accesshub-scan-uploader.timer /etc/systemd/system/
sudo install -m 0644 sysusers.conf /usr/lib/sysusers.d/accesshub-scanner.conf
sudo install -m 0644 tmpfiles.conf /usr/lib/tmpfiles.d/accesshub-scanner.conf
sudo systemd-sysusers /usr/lib/sysusers.d/accesshub-scanner.conf
sudo systemd-tmpfiles --create /usr/lib/tmpfiles.d/accesshub-scanner.conf
sudo systemctl daemon-reload
sudo systemctl enable --now accesshub-scanner.timer accesshub-scan-uploader.timer
# rồi enroll như bản .debGỡ: sudo apt remove accesshub-scanner (giữ dữ liệu), sudo apt purge accesshub-scanner (xóa thư mục, khóa máy, hai tài khoản). Bản .tar.gz: systemctl disable --now accesshub-scanner.timer accesshub-scan-uploader.timer, xóa các tệp đã cài và /var/lib/accesshub-scanner, /var/lib/accesshub-scan-uploader. Sau khi gỡ, thu hồi máy trong Access Hub để trả chỗ hạn mức.
CLI của scanner (định hướng, chốt ở P1):
| Lệnh | Việc |
|---|---|
accesshub-scanner scan | Chạy một lần (timer gọi) |
accesshub-scanner scan --print | Quét và in báo cáo dạng JSON ra màn hình, không ghi spool: để khách hàng thấy chính xác dữ liệu sẽ rời máy |
accesshub-scanner status | Lần quét cuối, kết quả, thời lượng, CPU, RSS, lỗi, các báo cáo trong spool |
accesshub-scan-uploader enroll --url <ingest> --token-file <tệp> [--force] | Enroll một lần (đã cài). Không in khóa, chỉ in host_id |
accesshub-scan-uploader run [--json] | Một lượt gửi (timer accesshub-scan-uploader.timer gọi mỗi 5 phút, chỉ chạy khi đã có identity.json) |
accesshub-scan-uploader rotate | Xoay khóa máy (khóa cũ còn hiệu lực 24 giờ ở ingest) |
accesshub-scan-uploader status [--json] | host_id, URL ingest, lần gửi cuối, report_id đã được xác nhận, lần thử kế tiếp, trạng thái (ok, idle, backoff, auth_failed, licence_inactive, report_rejected, report_too_large, stale_report, unsupported_schema, rate_limited, ingest_unavailable, spool_corrupt, ingest_unsupported, not_enrolled), ETag cấu hình. Không in khóa |
accesshub-scanner checks list | Danh mục kiểm tra, trạng thái bật tắt theo cấu hình hiện hành |
accesshub-scanner scan --content | Chạy một lượt nội dung (timer nội dung gọi; quản trị viên máy chạy tay được ngoài khung giờ) |
accesshub-scanner detectors list | Danh mục detector, trạng thái bật tắt, rules_version |
accesshub-scanner scope | In phạm vi hiệu lực sau khi ghép cấu hình trung tâm, local.conf, danh sách cấm cứng |
Không có lệnh hay cờ nào in giá trị bí mật hoặc dữ liệu cá nhân; scan --print in đúng các trường sẽ rời máy (ADR 0011). | accesshub-scanner version | Phiên bản, commit, schema_version |
2. Triển khai trung tâm
| Thành phần | Cloud | Dedicated |
|---|---|---|
Secmatch vai trò ingest (SMT-6, đã cài: accesshub-secmatch ingest --listen ADDR --data-dir DIR --hub-url https://.../api/v1/security/matcher --matcher-url URL [--tls-cert --tls-key]) | 2 bản sau load balancer có TLS, tên miền riêng của Scanner; bí mật SECMATCH_HUB_TOKEN (Access Hub) và SECMATCH_INGEST_TOKEN (matcher) qua biến môi trường hoặc tệp _FILE, không qua cờ. Hàng đợi bền vững trong --data-dir/queue, báo cáo bị matcher từ chối vĩnh viễn vào queue/dead-letter. Registry máy Scanner đồng bộ mỗi phút. Giới hạn tốc độ và khử trùng giữ trong bộ nhớ của từng bản (Q46, chấp nhận 2026-10-03): với 2 bản, giới hạn hiệu lực gấp đôi; quá 2 bản thì chuyển sang kho dùng chung (07 mục 3.0) | Một bản on-prem, có thể chung máy với matcher |
| Secmatch vai trò matcher | 2 bản sau load balancer nội bộ, một bản giữ lease chạy so khớp lại; kho inventory MySQL riêng | Một bản cạnh Access Hub on-prem, không cần Access Hub Collector |
| DB lỗ hổng | Kéo từ CDN mỗi giờ | Kéo từ CDN (chỉ đi ra) hoặc nhập tay (giai đoạn P10) |
secdb-build | Job định kỳ ở hạ tầng nền tảng, khóa ký trong KMS | Không chạy ở khách hàng |
| Access Hub | Migration HUB-SEC-*, tài khoản dịch vụ security-matcher, php artisan queue:restart sau khi triển khai job và thông báo mới | Như cloud |
Kích thước ban đầu (đích, chờ spike S5): secmatch 4 vCPU, 16 GB RAM cho 10.000 máy; kho inventory khoảng 10.000 máy x 3.000 gói, chia bảng theo company_id.
3. Nâng cấp và tương thích
- Gói Scanner (bộ đọc và bộ gửi cùng phiên bản) và secmatch phát hành độc lập với nhau và hoàn toàn độc lập với Agent, Collector. Hợp đồng nối là
schema_versioncủa báo cáo (secmatch hỗ trợ N và N-1) và lược đồSecurityConfig(khóa lạ bị bỏ). - Bộ gửi chuyển body như khối mờ, nên thêm trường vào báo cáo chỉ cần nâng gói Scanner và secmatch.
- Thứ tự an toàn khi đổi
schema_version: matcher trước, rồi ingest (miền chấp nhận), rồi gói Scanner. - Kiểm tra mới hoặc đổi logic kiểm tra: tăng
check_version; Access Hub hiển thị kết quả theo phiên bản để tránh hiểu nhầm khi tỷ lệ đạt đổi đột ngột sau nâng cấp. - DB lỗ hổng đổi
schema(secdb/v2): secmatch mới đọc được cả v1 và v2 trong 12 tháng;secdb-buildphát hành song song hai định dạng trong thời gian chuyển đổi.
4. Quan sát
4.1 Trên máy
- Báo cáo mang
ScanStats(thời lượng, CPU, RSS đỉnh, số tệp đã duyệt, cờ cắt, mã lỗi): Access Hub hiện ở tab Bảo mật, nền tảng thấy phân bố ẩn danh. - Log JSON ở
/var/log/accesshub-scanner/, xoay vòng tối đa 10 MB, không chứa nội dung tệp hay bằng chứng thô. Log có kiểu: trường lấy từ nội dung tệp không bao giờ được ghi. ContentScanStatstrong báo cáo: độ phủ, byte đã đọc, CPU, số lần nhường, lý do dừng lượt,rules_version.- Bộ gửi ghi trạng thái gửi ở
/var/lib/accesshub-scan-uploader/state.json(0600, không chứa nội dung báo cáo) vàaccesshub-scan-uploader status: trạng thái,report_idcuối được xác nhận, lần thử kế tiếp, lần đồng bộ cấu hình cuối. Log JSON ra journal (SyslogIdentifier=accesshub-scan-uploader), chỉ mã trạng thái và thời gian chờ. - Unit của bộ gửi: không capability, chỉ socket đi ra, chỉ ghi thư mục của nó, spool chỉ đọc,
MemoryMax=48M,CPUQuota=20%, điểmsystemd-analyze security --offline1,2.
Runbook bộ gửi:
| Trạng thái | Việc |
|---|---|
auth_failed | Máy bị thu hồi hoặc khóa không khớp: tạo mã enroll mới, enroll --force |
licence_inactive | Công ty hết gói Scanner hoặc vượt scan_hosts: báo khách hàng; bộ gửi tự thử lại sau 6 giờ, spool được giữ |
report_rejected, report_too_large, stale_report, unsupported_schema | Bộ báo cáo bị bỏ, bộ kế tiếp được gửi; kiểm phiên bản gói Scanner và đồng hồ máy |
ingest_unavailable, rate_limited | Tự thử lại (full jitter tới 1 giờ, hoặc theo Retry-After) |
spool_corrupt | Chạy accesshub-scanner scan --force để ghi bộ mới |
4.2 Secmatch (/metrics, tiền tố đề xuất ahsm_)
| Metric | Ý nghĩa |
|---|---|
ahsm_reports_total{kind,result} | Báo cáo nhận theo loại (full, hash_only) và kết quả |
ahsm_match_duration_seconds | Thời gian so khớp một inventory |
ahsm_rematch_running, ahsm_rematch_progress_ratio, ahsm_rematch_duration_seconds | So khớp lại toàn bộ sau khi DB đổi |
ahsm_db_version, ahsm_db_age_seconds, ahsm_db_verify_failures_total | Trạng thái DB |
ahsm_outbox_depth, ahsm_outbox_oldest_age_seconds | Hàng đợi sự kiện sang Access Hub |
ahsm_events_sent_total{type,result} | Sự kiện đã gửi |
ahsm_inventories_stored | Số máy có inventory |
ahsm_parts_pending | Báo cáo chia phần đang chờ đủ phần |
ahsm_content_findings_stored | Số finding nội dung đang lưu (không nhãn công ty) |
ahsm_content_diff_duration_seconds | Thời gian so trạng thái finding nội dung một máy |
Vai trò ingest có secmatch_ingest_reports_total{result}, secmatch_ingest_content_rejected_total{reason}, secmatch_ingest_enrolments_total{result}, secmatch_ingest_licence_rejected_total và độ sâu outbox chuyển tiếp.
4.3 Cảnh báo nội bộ của nền tảng
| Cảnh báo | Điều kiện đề xuất |
|---|---|
| DB cũ | ahsm_db_age_seconds lớn hơn 36 giờ (cloud) |
| DB sai chữ ký | ahsm_db_verify_failures_total tăng |
| So khớp lại chậm | Chưa xong sau 60 phút |
| Outbox tồn | Sự kiện cũ nhất quá 15 phút |
| Báo cáo bị từ chối tăng vọt | Tỷ lệ result != accepted quá 5% trong 30 phút |
| Finding nội dung bị ingest loại | secmatch_ingest_content_rejected_total tăng (dấu hiệu lỗi ranh giới che giấu hoặc bản build bất thường: điều tra ngay) |
secdb-build giữ bản phát hành chờ duyệt | Thay đổi bất thường (09 mục 3) |
Cảnh báo nội bộ chỉ chứa số lượng và mã lỗi, không tên công ty, không tên máy.
5. Runbook (rút gọn, viết đầy đủ ở giai đoạn P7)
| Tình huống | Xử lý |
|---|---|
| Một máy không có báo cáo | accesshub-scanner status, accesshub-scan-uploader status; kiểm tra timer systemctl list-timers accesshub-scanner.timer; kiểm tra quyền thư mục spool; licence_inactive thì xem gói và hạn mức scan_hosts của công ty; auth_failed thì máy có thể đã bị thu hồi, enroll lại |
Nhiều máy báo walk_truncated | Thêm loại trừ cho thư mục lớn (cache ứng dụng), hoặc nâng max_walk_files trong miền cho phép |
| Baseline nội dung không xong sau 7 đêm | Xem last_run_stop_reason: pressure (máy bận đêm, đổi khung giờ), byte_budget (nâng ngân sách trong miền hoặc thêm loại trừ), window_end (mở rộng khung) |
| Khách hàng báo máy chậm lúc quét đêm | Kiểm tra PSI và ContentScanStats; hạ ngân sách, đổi khung giờ, hoặc quản trị viên máy đặt content_enabled = false trong local.conf |
| Nghi preview hoặc giá trị bị lộ | Sự cố bảo mật: dừng phát hành, thu hồi bản scanner, chạy lại bộ "không giá trị rời máy", báo khách hàng xoay vòng bí mật bị ảnh hưởng |
| DB sai chữ ký | Không tự hạ cấp. Kiểm tra nguồn phát hành, xoay khóa nếu nghi lộ, phát hành lại |
| Bản DB làm đóng hàng loạt finding | Bị giữ ở secdb-build; người duyệt so sánh khác biệt, quyết định phát hành hay chặn nguồn |
| Access Hub mất dữ liệu finding sau sự cố | POST /internal/v1/resync?company_id= để secmatch phát lại finding đang mở |
| Dedicated: DB cũ | Hướng dẫn nhập tay accesshub-secmatch db import |
6. Kiểm thử hiệu năng
6.1 Trên máy (đo SNFR-01 đến SNFR-07)
- Ma trận máy ảo: Ubuntu 20.04, 22.04, 24.04; Debian 11, 12; Rocky 8, 9; AlmaLinux 9; CentOS 7; mỗi máy có cấu hình nhỏ (600 gói) và lớn (3.000 gói, cây
/usrlớn). - Đo bằng thống kê của systemd sau mỗi lần chạy:
systemctl show accesshub-scanner.service -p CPUUsageNSec -p MemoryPeak -p IOReadBytes(thuộc tính có hay không tùy phiên bản systemd, máy cũ đo bằng/proc/<pid>/statusvàrusagedo scanner tự ghi trongScanStats). - Đo ảnh hưởng tới tải sản xuất: chạy một tải chuẩn (ví dụ máy chủ web có bộ đo độ trễ) trong khi quét, so p99 có và không có quét.
- Tiêu chí: đạt bảng SNFR của
01, không vượtMemoryMax, không bị kill do timeout.
6.3 Lượt nội dung (đo SNFR-12 đến SNFR-19, SNFR-49)
- Máy thử: cây 1 triệu tệp, 5 GiB nội dung hợp lệ (mã ứng dụng web,
.env, dump SQL, CSV, thư mục nhà giả), trên SSD và trên đĩa quay hoặc đĩa mạng chậm của cloud. - Đo: thời gian baseline theo số đêm, CPU, RSS, byte đọc, số lần nhường; thông lượng detector MiB/s mỗi lõi; kích thước chỉ mục.
- Ảnh hưởng: tải web chuẩn (có bộ đo độ trễ) và một tải CSDL chạy song song; so p99 và tỷ lệ trúng page cache của ứng dụng khi có và không có lượt nội dung. Tiêu chí SNFR-17: p99 tăng không quá 5%.
6.2 Trung tâm (đo SNFR-43)
- Bộ sinh inventory tổng hợp từ fixture thật (nhân bản có biến thể phiên bản), 1.000, 5.000, 10.000, 20.000 máy.
- Đo: thời gian so khớp lại toàn bộ, RAM đỉnh khi giữ hai DB (chuyển nguyên tử), thông lượng ingest báo cáo khi 10.000 máy gửi trong 1 giờ, tải MySQL của Access Hub khi một CVE mới ảnh hưởng 50% số máy (bão
finding.opened). - Tiêu chí: so khớp lại dưới 30 phút ở 10.000 máy; Access Hub xử lý lô sự kiện không làm chậm trang web quá p95 1 giây (đo song song).