Bỏ qua nội dung

6. Trang Admin theo dõi & phân tích Log

Trang Admin là giao diện vận hành cho lớp Audit (M6) và Giám sát (M7): xem log, phân tích thống kê, xử lý cảnh báo, điều tra sự cố, và quản lý quyền/phê duyệt bốn mắt. Stack: React SPA + Go API.

Kiến trúc thành phần

[React SPA Admin] --HTTPS/JSON--> [Go Admin API]
| (JWT từ IdP/SSO, role=admin/dpo/security)
| |
| +--> [M6 Audit store (read-only)]
| +--> [M7 Detection (alerts)]
| +--> [M5 Access Control (roles, 4-eyes)]
v +--> ghi self-audit mọi thao tác
[Recharts/ECharts] (Go API là tầng duy nhất chạm dữ liệu)

Bốn nhóm chức năng

NhómTóm tắt
F1Xem & tìm kiếm logBảng log, lọc, phân trang keyset, chi tiết, verify-chain
F2Dashboard thống kêBiểu đồ access theo thời gian, top actor, tỉ lệ DENY
F3Cảnh báo & điều traDanh sách alert, timeline subject, gom incident, khoanh vùng
F4Quyền & bốn mắtQuản lý vai trò, duyệt/từ chối yêu cầu bốn mắt

Phân rã cho Database (DB)

TaskNội dungƯu tiên
DB-ADM-01Index lọc log: (ts), (actor,ts), (subject_ref,ts), (result,ts)P0
DB-ADM-02Materialized view tổng hợp theo giờ/ngày cho dashboardP1
DB-ADM-03Bảng alert (M7) + index theo status/severity/tsP0
DB-ADM-04Bảng incident gom nhiều alertP1
DB-ADM-05Bảng approval_request cho luồng bốn mắtP0
DB-ADM-06Bảng admin_audit (self-audit)P0
DB-ADM-07Read-replica/credentials chỉ-đọc cho Admin APIP1
DB-ADM-08Tối ưu keyset pagination ở > 100 triệu dòngP1
TABLE alert (
alert_id UUID PRIMARY KEY,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
rule TEXT NOT NULL, -- BULK_READ|OFF_HOURS|...
severity TEXT NOT NULL, -- LOW|MEDIUM|HIGH
actor TEXT NOT NULL,
window_from TIMESTAMPTZ, window_to TIMESTAMPTZ,
evidence JSONB, -- danh sách audit seq liên quan
status TEXT NOT NULL DEFAULT 'open',
assignee TEXT, incident_id UUID NULL
);
CREATE INDEX ON alert(status, severity, created_at DESC);

Phân rã cho API (Go)

Gợi ý: chi-router hoặc gin, pgx/sqlc, JWT middleware xác thực qua JWKS. Go API là tầng duy nhất chạm dữ liệu.

TaskNội dungƯu tiên
API-ADM-01Khung service: router, middleware, cấu hìnhP0
API-ADM-02Middleware authn (JWT/JWKS) + RBAC adminP0
API-ADM-03GET /logs: lọc + keyset paginationP0
API-ADM-05POST /logs/verify-chainP1
API-ADM-06GET /stats/* cho dashboardP0
API-ADM-07GET/PATCH /alertsP0
API-ADM-08GET /subjects/{ref}/timelineP0
API-ADM-10POST /actors/{id}/revoke (gọi M5, cần 4-eyes)P1
API-ADM-11GET/POST /approvals (bốn mắt)P0
API-ADM-13Ghi self-audit mọi thao tác ghiP0
GET /api/v1/logs?actor=&result=&from=&to=&cursor=<seq>&limit=50
200 -> { items:[{seq,ts,actor,action,subject_ref,field,purpose,result}],
next_cursor:<seq|null> }
POST /api/v1/logs/verify-chain { from_seq, to_seq }
200 -> { ok:true } | { ok:false, broken_at:<seq> }
GET /api/v1/stats/access?from=&to=&bucket=hour|day
GET /api/v1/alerts?status=&severity=&cursor=&limit=
PATCH /api/v1/alerts/{id} { status, assignee }
GET /api/v1/subjects/{ref}/timeline
POST /api/v1/approvals/{id}/approve // approver != requester

Phân tầng mã nguồn gợi ý:

/cmd/adminapi/main.go -- khởi tạo, router
/internal/auth -- JWT/JWKS middleware, RBAC
/internal/handler -- HTTP handlers F1..F4
/internal/service -- nghiệp vụ
/internal/repo -- truy vấn DB (pgx), read-only audit
/internal/audit -- self-audit (hash-chain)
/internal/model -- DTO/response

Phân rã cho Frontend (React)

Gợi ý: Vite + TypeScript, React Router, TanStack Query, Recharts, một UI lib (shadcn/ui hoặc Ant Design). Xác thực OIDC.

TaskNội dungƯu tiên
FE-ADM-01Khung dự án: Vite+TS, router, layoutP0
FE-ADM-02Đăng nhập SSO/OIDC + refresh tokenP0
FE-ADM-03API client + xử lý 401/403 tập trungP0
FE-ADM-04Trang Logs: bảng + lọc + keyset paginationP0
FE-ADM-06Dashboard: biểu đồ access theo thời gianP0
FE-ADM-08Trang Alerts: danh sách + đổi trạng tháiP0
FE-ADM-09Màn điều tra: timeline subject + incidentP1
FE-ADM-11Trang Approvals: duyệt/từ chối bốn mắtP0
FE-ADM-13Phân quyền hiển thị theo vai trò (RBAC UI)P0

Bản đồ màn hình:

Màn hìnhĐường dẫnThành phần chính
Dashboard/Thẻ tổng quan, biểu đồ access, top actor
Nhật ký/logsBộ lọc, bảng log, drawer chi tiết
Cảnh báo/alertsDanh sách alert, badge severity
Điều tra/incidents/:idTimeline subject, danh sách alert
Phê duyệt/approvalsHàng chờ bốn mắt, nút duyệt/từ chối
Phân quyền/rolesMa trận role × field × action

Skeleton code

Repo kèm sẵn bộ skeleton code thực tế trong thư mục skeleton/:

  • skeleton/api-go/ — khung Go Admin API (router, middleware, handler rỗng, repo, self-audit).
  • skeleton/web-react/ — khung React SPA (Vite + TS, router, API client, các trang F1–F4).
  • skeleton/db/ — script SQL tạo bảng/index/view.

Xem skeleton/README.md để chạy thử cục bộ.

Thứ tự thực hiện theo sprint

SprintNội dung
S1DB index/view + khung Go API + authn/RBAC + khung React
S2F1 Xem/tìm log
S3F2 Dashboard
S4F3 Cảnh báo & điều tra
S5F4 Quyền & bốn mắt + self-audit
S6Hardening, export, realtime, kiểm thử & nghiệm thu

Tiêu chí nghiệm thu (DoD)

  • Tìm kiếm log đúng theo mọi bộ lọc; keyset pagination ổn định ở quy mô lớn.
  • verify-chain phát hiện đúng khi một bản ghi audit bị sửa.
  • Dashboard khớp số liệu với truy vấn kiểm chứng trên DB.
  • Cảnh báo đổi trạng thái, gom incident, dựng timeline subject được.
  • Nút Approve bị chặn khi người duyệt trùng người yêu cầu.
  • Mọi thao tác ghi của admin xuất hiện trong admin_audit.
  • Không endpoint/màn hình nào lộ giá trị PII thật.
  • API trả 403 khi vai trò không đủ quyền (kể cả khi UI đã ẩn nút).