ADR 0009. Quét nội dung tệp có giới hạn: phạm vi, kích thước, loại tệp, ngân sách tài nguyên
- Trạng thái: Đề xuất
- Ngày: 2026-10-02
- Liên quan: ADR 0001 (tách đặc quyền), ADR 0006 (tối thiểu hóa dữ liệu), ADR 0010 (bộ máy phát hiện), ADR 0011 (báo cáo finding nội dung). Câu hỏi Q32, Q33, Q37, Q38, Q40
Bối cảnh
Phạm vi Access Hub Scanner được mở rộng: ngoài kiểm kê gói và kiểm tra cấu hình, sản phẩm phải tìm bí mật bị lộ (khóa riêng, token, khóa cloud, mật khẩu trong tệp cấu hình, .env, lịch sử shell) và dữ liệu cá nhân (CCCD, CMND, số điện thoại, email, số thẻ) nằm trong tệp. Việc này buộc scanner đọc nội dung tệp, khác hẳn thiết kế cũ chỉ lstat (05 mục 5).
Đọc nội dung tốn IO và CPU hơn nhiều bậc so với duyệt siêu dữ liệu, có thể làm bẩn page cache của ứng dụng, cập nhật atime, và chạm vào thư mục nhà (/home, /root) vốn bị ProtectHome=yes chặn. Máy khách hàng là máy sản xuất: quét không được làm chậm dịch vụ. Cấu hình từ trung tâm trước đây chỉ được thu hẹp phạm vi (loại trừ), nay có nhu cầu chọn thêm thư mục dữ liệu để quét dữ liệu cá nhân.
Quyết định
1. Hai lượt quét, hai unit
- Lượt siêu dữ liệu (giữ nguyên):
accesshub-scanner.service, timer mỗi giờ, inventory, kiểm tra cấu hình, duyệtlstatcho kiểm traAHS-FS-*. Ngân sách SNFR-01 đến SNFR-07. - Lượt nội dung (mới):
accesshub-scanner-content.service, timer riêng chỉ chạy trong khung giờ yên tĩnh, cùng binary (accesshub-scanner scan --content), cùng tài khoản và capability, ngân sách riêng (SNFR-12 đến SNFR-19). Kết quả ghi vào chỉ mục cục bộ; báo cáo gửi đi luôn dựng từ trạng thái mới nhất của cả hai lượt (ADR 0011).
2. Phạm vi
| Lớp | Nội dung | Mặc định |
|---|---|---|
| Vị trí đích (targeted) | Danh sách biên dịch sẵn các vị trí bí mật đã biết, tính theo từng thư mục nhà lấy từ /etc/passwd và theo đường dẫn hệ thống (14 mục 3): ~/.ssh/, ~/.aws/credentials, ~/.kube/config, ~/.docker/config.json, ~/.git-credentials, ~/.netrc, ~/.pgpass, ~/.my.cnf, ~/.*_history, /etc/NetworkManager/system-connections/, ... | Bật khi bật quét bí mật |
| Hồ sơ gốc (profile) | system-config (/etc, /usr/local/etc, /opt), web (/var/www, /srv, /usr/share/nginx), home (/home, /root), app-data (/var/lib trừ thư mục của trình quản lý gói, CSDL, container), logs (/var/log) | Bí mật: system-config, web, home. Dữ liệu cá nhân: tắt, bật theo công ty và chọn hồ sơ (Q35) |
| Gốc tùy chọn từ trung tâm | Tối đa 16 đường dẫn tuyệt đối, không .., không thuộc danh sách cấm. Chỉ người có quyền security.content.manage đặt được, có audit | Rỗng (Q33) |
| Quyền quyết định cục bộ | Tệp /etc/accesshub-scanner/local.conf (root sở hữu, 0644): deny_roots (luôn thắng cấu hình trung tâm), allow_central_roots = false (bỏ qua mọi gốc tùy chọn từ trung tâm), content_window (đổi khung giờ cục bộ), content_enabled = false (tắt hẳn lượt nội dung) | Không có tệp: theo trung tâm |
Danh sách cấm cứng (không cấu hình được): /proc, /sys, /dev, /run, /var/run, /var/lib/accesshub-scanner, /var/lib/accesshub-scan-uploader, /var/lib/accesshub-agent, /var/log/accesshub-scanner, điểm gắn hệ thống tệp ảo và mạng (proc, sysfs, devtmpfs, tmpfs, cgroup*, overlay, squashfs, nfs*, cifs, smb3, fuse.*, 9p, ceph, glusterfs). Mặc định cũng loại: /usr (trừ /usr/local), /bin, /sbin, /lib*, /boot, /var/cache, /var/lib/docker, /var/lib/containerd, /var/lib/kubelet, /var/lib/mysql, /var/lib/postgresql, /snap, và thư mục tên node_modules, .git/objects, __pycache__, .cache. Quản trị viên công ty thêm loại trừ (tối đa 64 mục, đường dẫn tuyệt đối hoặc tên thư mục).
Cấu hình trung tâm không bao giờ mở rộng được danh sách cấm cứng hay vượt quyết định cục bộ. Gốc tùy chọn chỉ làm tăng phạm vi đọc trên máy; kết quả gửi đi vẫn chỉ là các trường của ADR 0011.
3. Lọc tệp
| Tiêu chí | Quy tắc |
|---|---|
| Loại tệp | Chỉ tệp thường. Không theo symlink (O_NOFOLLOW), không mở FIFO, socket, thiết bị (kiểm tra lstat rồi fstat sau khi mở để chống đổi tệp giữa chừng), không vượt điểm gắn (so st_dev với gốc) |
| Kích thước | Bí mật: tối đa 4 MiB mỗi tệp (miền cấu hình 1 đến 32 MiB). Dữ liệu cá nhân: tối đa 128 MiB (miền 1 đến 1.024 MiB). Tệp lớn hơn bị bỏ, đếm vào skipped_too_large, và được ghi vào danh sách tệp đáng chú ý nếu thuộc loại dữ liệu (.sql, .csv, ...) |
| Nhận dạng | Đuôi tệp trong danh sách loại trừ (ảnh, âm thanh, video, phông, đối tượng biên dịch, lưu trữ nén) bỏ ngay. Còn lại đọc 8 KiB đầu: magic của ELF, PE, gzip, zip, xz, zstd, bzip2, PNG, JPEG, PDF, SQLite hoặc tỷ lệ byte NUL cao thì coi là nhị phân và bỏ |
| Mã hóa ký tự | UTF-8 mặc định; UTF-16 LE/BE có BOM được chuyển sang UTF-8 trong bộ đệm; mã khác đọc như byte (mẫu ASCII vẫn khớp) |
| Định dạng cấu trúc | CSV, TSV, JSON, NDJSON, YAML, INI, .env, .properties, XML, dump SQL dạng văn bản: đọc như văn bản, có thêm nhận diện tên cột (dữ liệu cá nhân, 14 mục 5). OOXML (.xlsx, .docx) chỉ cho dữ liệu cá nhân từ P4, giải nén có giới hạn: tối đa 64 MiB sau giải nén, tỷ lệ nén tối đa 100, tối đa 10.000 mục, chỉ đọc xl/sharedStrings.xml, xl/worksheets/*.xml, word/document.xml. Tệp nén (.gz, .zip, .tar), PDF, ảnh (OCR): không quét (Q37) |
| Tệp chứa khóa dạng nhị phân | .p12, .pfx, .jks, .keystore, .kdbx, secring.gpg: không phân tích nội dung, chỉ ghi nhận sự hiện diện (detector AHK-FILE-*, 14 mục 4) |
| Đọc | Luồng theo khối 256 KiB, chồng lấn 4 KiB giữa hai khối để không bỏ sót mẫu nằm ở biên; dòng dài quá 64 KiB được chia cửa sổ; bộ đệm dùng lại, không giữ toàn tệp trong bộ nhớ |
4. Ngân sách và không làm phiền máy sản xuất
Số liệu là đích, chốt sau spike S6, S9.
| Hạng mục | Giá trị |
|---|---|
| Khung giờ yên tĩnh | Mặc định 01:00 đến 05:00 theo giờ máy, khởi động lệch ngẫu nhiên trong 60 phút đầu, dừng và lưu điểm dừng khi hết khung. Công ty chỉnh được; quản trị viên máy chỉnh cục bộ được. Nút "Quét ngay" của Access Hub không áp cho lượt nội dung (Q38); quản trị viên máy chạy tay được bằng CLI |
| CPU | CPUQuota=25%, Nice=19; tối đa 300 giây CPU mỗi lượt |
| Bộ nhớ | RSS đỉnh 192 MB, MemoryMax=256M |
| IO | IOSchedulingClass=idle; tự giới hạn tốc độ đọc 16 MiB/s; tối đa 1 GiB đọc mỗi lượt (miền 128 MiB đến 4 GiB); posix_fadvise(POSIX_FADV_SEQUENTIAL) khi đọc, POSIX_FADV_DONTNEED sau khi đọc xong mỗi tệp để không đẩy dữ liệu nóng của ứng dụng khỏi page cache |
| Nhường tài nguyên | Trước mỗi lô tệp đọc PSI (/proc/pressure/cpu, /proc/pressure/io): some avg10 của CPU trên 40% hoặc của IO trên 20% thì tạm dừng 30 giây; quá 10 lần tạm dừng trong một lượt thì kết thúc lượt, lưu điểm dừng. Kernel không có PSI (CentOS 7): dùng loadavg / số lõi > 1,5 |
| Số mục duyệt | Tối đa 1.000.000 mục mỗi lượt, có điểm dừng để lượt sau đi tiếp |
| Tăng dần | Chỉ đọc lại tệp có (st_dev, st_ino, size, mtime_ns, ctime_ns) đổi so với chỉ mục, hoặc khi phiên bản bộ quy tắc đổi (đọc lại cũng theo ngân sách) |
| Lần đầu (baseline) | Trải qua nhiều đêm. Đích: máy có tối đa 5 GiB nội dung hợp lệ sau lọc xong baseline trong 5 đêm. Báo cáo mang độ phủ (files_eligible, files_scanned, baseline_complete) để giao diện không hiểu "chưa quét" là "sạch" |
| Trung bình ngày (sau baseline) | Không quá 0,5% một lõi (khoảng 432 giây CPU mỗi ngày) khi bật cả bí mật và dữ liệu cá nhân |
| Core dump | LimitCORE=0: tiến trình giữ bí mật trong bộ nhớ không được để lại core dump |
atime: mở bằng O_NOATIME cần quyền sở hữu tệp hoặc CAP_FOWNER (quyền này cho phép đổi chế độ mọi tệp, quá mạnh), nên không dùng. Trên hệ thống tệp gắn relatime (mặc định), atime được cập nhật tối đa một lần mỗi ngày cho mỗi tệp được đọc. Ghi rõ trong tài liệu khách hàng.
5. Chỉ mục cục bộ
/var/lib/accesshub-scanner/index/ (chủ accesshub-scanner, 0700): mỗi tệp đã xét một bản ghi gồm đường dẫn, st_dev, st_ino, kích thước, mtime_ns, ctime_ns, thời điểm quét, phiên bản bộ quy tắc, và danh sách finding của tệp theo đúng các trường của ADR 0011 (không giá trị, không đoạn văn bản). Trần 64 MiB; vượt trần thì bỏ bản ghi của tệp không có finding cũ nhất trước. Kho cụ thể (bbolt giấy phép MIT hoặc định dạng tự viết) chốt ở S6.
6. Quyền trên máy
- Unit nội dung dùng
ProtectHome=read-onlythay choProtectHome=yes(cần đọc thư mục nhà). Unit siêu dữ liệu giữProtectHome=yes. - Vẫn một capability
CAP_DAC_READ_SEARCH, vẫn không mạng (RestrictAddressFamilies=AF_UNIX,IPAddressDeny=any), vẫnProtectSystem=strict, chỉ ghi vào thư mục trạng thái, spool, log của mình. - Không xóa, không di chuyển, không đổi quyền, không cách ly tệp. Khắc phục chỉ là tư vấn (ADR 0003).
Hệ quả
- Quét nội dung không chạy trong giờ làm việc mặc định, có thể dừng tức thì khi máy bận; độ trễ phát hiện bí mật mới là đến đêm kế tiếp (chấp nhận được với mục tiêu kiểm toán, không phải DLP thời gian thực).
- Lần đầu cần nhiều đêm, giao diện phải hiện độ phủ.
ProtectHome=read-onlytăng giá trị của scanner như mục tiêu tấn công (đọc được khóa SSH người dùng), bù lại bằng không mạng, không core dump, và ADR 0011.- Cần thêm unit, timer, tệp
local.conf, chỉ mục cục bộ: thêm việc đóng gói, tài liệu, kiểm thử theo distro. - Không thấy bí mật trong tệp nén, PDF, ảnh, kho CSDL nhị phân, lịch sử git đã nén; ghi rõ là giới hạn đã biết.
Phương án đã cân nhắc
| Phương án | Lý do không chọn |
|---|---|
| Quét nội dung trong cùng lượt mỗi giờ | Vượt ngân sách SNFR-03 nhiều lần, chạy trong giờ cao điểm |
| Quét toàn bộ hệ thống tệp, không lọc | IO hàng chục, hàng trăm GB mỗi máy; phần lớn là nhị phân và mã bên thứ ba, chỉ sinh dương tính giả |
| Gửi tệp nghi vấn về trung tâm để quét | Vi phạm yêu cầu cứng "giá trị không rời máy" (ADR 0011) |
Theo dõi thay đổi thời gian thực bằng fanotify hoặc inotify | Cần tiến trình thường trú đặc quyền (fanotify cần CAP_SYS_ADMIN), trái ADR 0001 và SNFR-07. Có thể xem lại như tối ưu sau |
| Cho trung tâm đặt gốc tùy ý không có quyền quyết định cục bộ | Biến cấu hình trung tâm thành kênh điều khiển phạm vi đọc không giới hạn; quản trị viên máy phải có tiếng nói cuối cùng |