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

Vận hành ​

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

1. Triển khai trên máy ​

BướcChi tiết
Điều kiệnCô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àiTả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
EnrollTạ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ạoNgườ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âmAccess 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ạtMẫ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) ​

UnitKiểuViệcBật khi cài
accesshub-scanner.serviceoneshot, tài khoản accesshub-scanner, chỉ CAP_DAC_READ_SEARCH, không mạngBộ đọc: kiểm kê, ghi spool; tôn trọng scan_windowDo timer gọi
accesshub-scanner.timerMỗ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ôngCó (enable --now)
accesshub-scan-uploader.serviceoneshot, tài khoản accesshub-scan-uploader, không capability, chỉ HTTPS đi ra; ConditionPathExists=/var/lib/accesshub-scan-uploader/identity.jsonBộ gửi: gửi báo cáo, làm mới config.pb và siêu dữ liệu máyDo timer gọi, chỉ chạy sau khi enroll
accesshub-scan-uploader.timerMỗi 5 phút (lệch 60 giây, OnBootSec=5min)Gọi bộ gửiCó (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:

sh
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 status

enroll 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):

sh
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 .deb

Gỡ: 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ệnhViệc
accesshub-scanner scanChạy một lần (timer gọi)
accesshub-scanner scan --printQué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 statusLầ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 rotateXoay 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 listDanh 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 --contentChạ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 listDanh mục detector, trạng thái bật tắt, rules_version
accesshub-scanner scopeIn 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ầnCloudDedicated
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ò matcher2 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êngMột bản cạnh Access Hub on-prem, không cần Access Hub Collector
DB lỗ hổngKéo từ CDN mỗi giờKéo từ CDN (chỉ đi ra) hoặc nhập tay (giai đoạn P10)
secdb-buildJob định kỳ ở hạ tầng nền tảng, khóa ký trong KMSKhông chạy ở khách hàng
Access HubMigration 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ớiNhư 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_version củ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-build phá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.
  • ContentScanStats trong 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_id cuố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ểm systemd-analyze security --offline 1,2.

Runbook bộ gửi:

Trạng tháiViệc
auth_failedMáy bị thu hồi hoặc khóa không khớp: tạo mã enroll mới, enroll --force
licence_inactiveCô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_schemaBộ 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_limitedTự thử lại (full jitter tới 1 giờ, hoặc theo Retry-After)
spool_corruptChạ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_secondsThời gian so khớp một inventory
ahsm_rematch_running, ahsm_rematch_progress_ratio, ahsm_rematch_duration_secondsSo khớp lại toàn bộ sau khi DB đổi
ahsm_db_version, ahsm_db_age_seconds, ahsm_db_verify_failures_totalTrạng thái DB
ahsm_outbox_depth, ahsm_outbox_oldest_age_secondsHàng đợi sự kiện sang Access Hub
ahsm_events_sent_total{type,result}Sự kiện đã gửi
ahsm_inventories_storedSố máy có inventory
ahsm_parts_pendingBáo cáo chia phần đang chờ đủ phần
ahsm_content_findings_storedSố finding nội dung đang lưu (không nhãn công ty)
ahsm_content_diff_duration_secondsThờ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ậmChưa xong sau 60 phút
Outbox tồnSự kiện cũ nhất quá 15 phút
Báo cáo bị từ chối tăng vọtTỷ lệ result != accepted quá 5% trong 30 phút
Finding nội dung bị ingest loạisecmatch_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ệtThay đổ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ốngXử lý
Một máy không có báo cáoaccesshub-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_truncatedThê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 đêmXem 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 đêmKiể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 findingBị 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 /usr lớ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>/status và rusage do scanner tự ghi trong ScanStats).
  • Đ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ượt MemoryMax, 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).
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.