Bảo mật & phân quyền

Ai được làm gì, trên dữ liệu nào, và vì sao thu hồi rồi mà quyền vẫn còn. Đọc RBAC trước rồi tới ABAC. Code chạy thật trên Laravel 12.64 + spatie/laravel-permission 8.3.0, PostgreSQL 18.4 và OPA 1.21.1.

Bài 1 · Phân quyền

RBAC — phân quyền theo vai trò: chạy thế nào, và hỏng ở đâu

6 bảng + câu check đệ quy trên PostgreSQL, spatie trong Laravel. Đo thật: worker vẫn cho qua sau khi thu hồi quyền, teams rò giữa các job, SoD bằng trigger thủng khi 2 request song song.

Bài 2 · Phân quyền

ABAC — phân quyền theo thuộc tính: Policy, Row-Level Security và OPA

PEP/PDP/PIP, policy lệch với danh sách, luật "cấm cái xấu" cho qua khi thiếu dữ liệu. RLS: SET rò qua PgBouncer, permissive mở toang, cùng một luật 1,4 ms hay 27,8 giây.

Vá lỗ hổng · Vận hành

Nâng cấp PHP 7.x → 8.4.27 vì PHP2Shell (CVE-2026-109618/109619)

Runbook Laravel 8 + nginx + PHP-FPM lên PHP 8.4.27 + Laravel 13, chạy thật trong lab: vá khẩn vs nâng cấp, đọc changelog thay vì số version, bản vá 7.4 giết worker khi OOM, 'abc' == 0 đổi nghĩa im lặng, cutover/rollback dưới tải 0 lỗi.

OWASP 2025 · Bài 0

OWASP Top 10:2025 — tổng quan và bảng đối chiếu 2021 → 2025

OWASP Top 10 là gì và không phải là gì (so với ASVS, API/LLM Top 10), cách OWASP xếp hạng, 10 mục 2025, SSRF gộp vào A01, 2 mục mới, cách tech lead dùng danh sách trong team, ánh xạ vào LMS Uni/Micro-learning.

OWASP 2025 · Bài 1

A01:2025 Broken Access Control — phân quyền theo object, theo chức năng, CSRF và SSRF

IDOR, thiếu kiểm tra theo chức năng, trường đặc quyền, đường dẫn file, CORS, CSRF và SSRF (gộp vào A01 năm 2025): mẫu code sai/đúng Laravel 13 + NestJS, phòng thủ nhiều lớp, áp dụng vào Moodle và LMS Micro-learning.

OWASP 2025 · Bài 2

A02:2025 Security Misconfiguration — debug, mặc định nguy hiểm, header, cookie, XXE và drift cấu hình

Debug và công cụ dev trên production, web root và file ẩn, cookie sau load balancer, security header (Nginx hay app), XXE, bucket public, drift giữa node: mẫu code sai/đúng Laravel 13 + NestJS, kiểm cấu hình trước khi chuyển traffic, áp dụng vào Moodle 3 node và LMS Micro-learning.

OWASP 2025 · Bài 3

A03:2025 Software Supply Chain Failures — lockfile, install script, registry, digest, CI token và SBOM

Niềm tin bắc cầu là gốc rủi ro; sáu dạng sự cố (CVE đã biết, tài khoản maintainer bị chiếm, script lúc cài, nhầm nguồn, tag bị trỏ lại, build bị can thiệp) và năm cổng phòng thủ với Composer, npm, GitLab CI, cooldown, SBOM; bài học từ event-stream, xz, polyfill.io, tj-actions, Shai-Hulud.

OWASP 2025 · Bài 4

A04:2025 Cryptographic Failures — hash mật khẩu, số ngẫu nhiên an toàn, mã hoá có xác thực, quản lý key và TLS

Bộ chọn công cụ theo "có cần đọc lại không, entropy cao hay thấp": Argon2id/bcrypt và rehash khi đăng nhập, CSPRNG cho token, AES-GCM và Laravel Crypt (CBC + HMAC), so sánh constant-time, xoay APP_KEY hai pha cho blue-green, ghim thuật toán JWT, TLS và kiểm certificate; Moodle băm mật khẩu ra sao theo từng phiên bản.

OWASP 2025 · Bài 5

A05:2025 Injection — tách dữ liệu khỏi lệnh: SQL, OS command, XSS, code injection

Gốc chung của mọi injection là dữ liệu và lệnh đi chung một chuỗi: bind tham số (Parse/Bind, Laravel không giả lập prepare), allowlist ánh xạ cho cột sort và report builder, encode theo ngữ cảnh + sanitize, Process mảng / execFile không shell, không eval; Moodle DML API, least privilege, CSP, WAF và cách review theo danh sách sink.

OWASP 2025 · Bài 6

A06:2025 Insecure Design — khi control chưa từng được thiết kế: threat modeling, business logic, workflow, race condition

Lỗi thiết kế khác lỗi cài đặt ở chỗ code hoàn hảo cũng không vá được: tính lại giá trị ở server, giới hạn nghiệp vụ ba tầng, state machine kiểm và chuyển trong một câu UPDATE, UPDATE có điều kiện / khoá dòng cha / unique cho tài nguyên có hạn, trust boundary; threat modeling 45 phút với DFD + STRIDE, invariant trong story, paved road, giám sát invariant; áp vào hạn nộp bài, ghi danh, portal dùng chung DB với Moodle.

OWASP 2025 · Bài 7

A07:2025 Authentication Failures — mật khẩu, throttling và lockout, MFA, khôi phục tài khoản, phiên, JWT và SSO

Một tài khoản có nhiều cửa và chỉ an toàn bằng cửa yếu nhất: đếm lần sai theo tài khoản + IP và metric toàn hệ thống cho password spray, chính sách mật khẩu NIST 800-63B-4, thông báo chung + timebox, MFA/passkey và đường khôi phục, token reset một lần lưu hash, đổi session ID, idle/absolute timeout, logout thật, JWT kiểm iss/aud/typ và thu hồi; mặc định Moodle 4.5 và cửa đăng nhập của portal NestJS.

OWASP 2025 · Bài 8

A08:2025 Software or Data Integrity Failures — deserialization, mass assignment, dữ liệu ký qua ranh giới tin cậy, payload cache/queue, artifact và bản cập nhật

Dữ liệu và code đi vòng ra ngoài rồi quay về phải được kiểm chứng ở điểm nhận: JSON thay native serialize (serializable_classes của Laravel 13, job Laravel vs BullMQ), allowlist field + #[Locked] Livewire, webhook ký trên byte thô + timestamp + chống trùng, signed URL vẫn kiểm quyền, hash/MAC/chữ ký số chọn theo số bên, checksum công cụ CI, deploy theo digest, tắt cài plugin Moodle từ web.

OWASP 2025 · Bài 9

A09:2025 Security Logging and Alerting Failures — ghi đúng sự kiện bảo mật, không lộ dữ liệu trong log, chống sửa và xoá log, biến log thành cảnh báo có người xử lý

Vì sao "Monitoring" thành "Alerting": ghi cả khi control chặn thành công (event auth của Laravel, internalDontReport, filter NestJS), request id qua Context sang queue, allowlist + HMAC + pino redact + #[\SensitiveParameter], log JSON chống log injection, log rời node, bảng audit chỉ INSERT + hash chain, rule so baseline có mức sàn, honeytoken, cảnh báo node ngừng gửi log; Moodle logstore.

OWASP 2025 · Bài 10

A10:2025 Mishandling of Exceptional Conditions — lỗi thì đóng chứ không mở, xử lý lỗi một chỗ, rollback trọn vẹn, dọn tài nguyên, và không có gì là vô hạn

Mục mới 2025: ba thất bại (không ngăn, không nhận ra, phản ứng sai), ma trận fail open/fail closed khi Redis/DB/đối tác hỏng, handler tập trung (Laravel withExceptions, NestJS @Catch + APP_FILTER), transaction + afterCommit/outbox, lock/QueryRunner trả trong finally, timeout + retry có điều kiện + cầu dao, unhandled rejection và queue job; sự cố Google Cloud 06/2025, Cloudflare 11/2025; Moodle Redis session lock.