Mục tiêu học tập
- Hiểu CIA Triad (Confidentiality, Integrity, Availability) — nền tảng của information security
- Biết khái niệm attack surface và cách giảm thiểu
- Thực hành threat modeling cơ bản với STRIDE framework
- Áp dụng hai nguyên lý cốt lõi: defense in depth và principle of least privilege
- Hiểu các loại attacker và động cơ của họ để biết "ai có thể tấn công mình"
1. Vì sao Developer cần học Security?
Thực tế phũ phàng
Bug security khác bug functional ở 3 điểm:
- Không nhìn thấy — code chạy đúng, test pass, nhưng vẫn có lỗ hổng
- Hậu quả không tuyến tính — một SQL injection có thể leak toàn bộ database
- Không reversible — data đã leak là leak; không "rollback" được
Security là trách nhiệm của developer, không chỉ của "security team". Bạn là người viết code đầu tiên chạm vào input của user — bạn là tuyến phòng thủ đầu tiên.
2. CIA Triad — Ba trụ cột Information Security
Confidentiality — Bí mật
Chỉ những ai được phép mới có thể đọc data.
Ví dụ thực tế:
- Mật khẩu user được hash + salt, không lưu plaintext trong DB
- File ảnh selfie KYC chỉ admin compliance được xem
- API trả về
account.balancechỉ cho chính chủ tài khoản, không cho user khác
Cách bảo vệ:
- Encryption at rest: AES-256 cho DB, S3, disk
- Encryption in transit: TLS 1.2+ cho mọi network traffic
- Access control: IAM, RBAC, ABAC
- Data classification: phân loại PII / PCI / HIPAA / public và áp policy tương ứng
Integrity — Toàn vẹn
Data không bị thay đổi trái phép — cả vô tình lẫn cố ý.
Ví dụ thực tế:
- Số dư tài khoản 1,000,000 VND không tự nhiên bị giảm xuống 100,000 VND
- File firmware download từ vendor đúng là file gốc (không bị MITM thay nội dung)
- Audit log không bị attacker xoá sau khi xâm nhập
Cách bảo vệ:
- Cryptographic hash (SHA-256) để verify file
- Digital signature (RSA, ECDSA) chứng minh "đúng tác giả"
- HMAC cho message authentication
- Database constraint + transaction để tránh inconsistent state
- Write-once / append-only log (CloudTrail, immutable S3)
Availability — Sẵn sàng
Hệ thống và data phải truy cập được khi user cần.
Ví dụ thực tế:
- Website không bị down vì DDoS
- Database backup khôi phục được sau khi disk hỏng
- Login service không bị overload đến mức user thật không login được
Cách bảo vệ:
- Redundancy (multi-AZ, multi-region)
- Auto-scaling, load balancer
- DDoS protection (Cloudflare, AWS Shield)
- Backup + disaster recovery với RPO/RTO target rõ ràng
- Rate limiting chống abuse
CIA không cân bằng — phải đánh đổi
| Tình huống | Ưu tiên |
|---|---|
| Hồ sơ y tế bệnh nhân | C > I > A |
| Hệ thống điều khiển không lưu | I > A > C |
| Trang tin tức công khai | A > I > C |
| Hệ thống thanh toán | I = C > A |
Khi thiết kế hệ thống, luôn tự hỏi: nếu phải hy sinh một trong ba, hy sinh cái nào ít hậu quả nhất?
3. Attack Surface — Bề mặt tấn công
Attack surface = tổng tất cả những điểm mà attacker có thể tương tác với hệ thống của bạn.
Nguyên tắc: Minimize the attack surface
- API endpoint không dùng → xoá hoặc disable
- Port không cần → đóng (firewall, security group)
- Dependency không dùng → uninstall
- Account/credential cũ → revoke
- Feature flag tạm thời → dọn dẹp sau khi launch
Mỗi thứ bạn thêm vào hệ thống đều mở rộng attack surface. Less code = less bugs = less security holes.
4. Threat Modeling với STRIDE
Threat modeling = quy trình "nghĩ như attacker" để tìm ra điểm yếu trước khi code được deploy.
STRIDE — 6 loại threat (Microsoft)
| Threat | Vi phạm | Ví dụ |
|---|---|---|
| Spoofing | Authentication | Giả danh user khác, fake JWT |
| Tampering | Integrity | Sửa giá trong request price=0 |
| Repudiation | Non-repudiation | User chối "không phải tôi click" |
| Information disclosure | Confidentiality | API leak email user khác qua IDOR |
| Denial of service | Availability | Spam request làm sập server |
| Elevation of privilege | Authorization | User thường thành admin |
Quy trình threat modeling 4 bước
1. What are we building? → Vẽ data flow diagram
↓
2. What can go wrong? → Áp STRIDE cho từng component
↓
3. What are we going to do? → Mitigation cho threat ưu tiên
↓
4. Did we do a good job? → Review, test, retro
Ví dụ: Threat model một login API
Áp STRIDE:
| Component | S | T | R | I | D | E |
|---|---|---|---|---|---|---|
| Browser → API | TLS pinning? | Replay attack? | Audit log? | TLS bắt buộc | Rate limit | — |
| Login API | Verify password hash | Input validation | Log login attempts | Không leak "user tồn tại" | CAPTCHA + lockout | Không return admin claim từ user input |
| User DB | DB credential | Parameterized query | DB audit | Encrypt PII column | Connection pool limit | DB user least privilege |
| JWT issuer | Sign with strong key | Verify signature | Include iat, jti | Không bỏ PII vào JWT | Short TTL | Không cho user pick role claim |
Threat modeling không cần "đầy đủ" — chỉ cần đủ tốt để khám phá các threat lớn nhất. Một buổi 1 giờ với team có thể tìm ra 80% lỗ hổng.
5. Defense in Depth — Phòng thủ nhiều lớp
Đừng dựa vào một lớp bảo mật duy nhất. Mỗi lớp có thể fail, nhưng nhiều lớp chồng lên nhau khó cùng fail.
Ví dụ ứng dụng web:
- Layer 1: Cloudflare WAF chặn SQLi pattern
- Layer 2: TLS 1.3, HSTS preload
- Layer 3: JWT + RBAC kiểm tra trên mỗi route
- Layer 4: Validate input với Zod / Pydantic / struct tags
- Layer 5: Parameterized query, DB user chỉ có SELECT cho service đó
Nếu attacker bypass được WAF, vẫn còn 4 lớp nữa. Nếu một dev quên kiểm tra authz, validation vẫn chặn payload độc.
6. Principle of Least Privilege (PoLP)
Mọi process, user, service chỉ được cấp quyền tối thiểu cần thiết để hoàn thành công việc — không hơn.
Ví dụ áp dụng
| Sai | Đúng |
|---|---|
DB user cho web app là root | Tạo user webapp chỉ có SELECT, INSERT, UPDATE trên các bảng cần thiết |
Mỗi developer có quyền admin AWS | Mỗi role có scoped IAM policy, dùng AssumeRole khi cần |
Container chạy bằng root | USER 1000 trong Dockerfile, dùng read-only filesystem |
Service account có *:* permission | Liệt kê đúng action: s3:GetObject chỉ cho bucket cụ thể |
File .env chmod 644 (world-readable) | chmod 600 .env, hoặc tốt hơn: dùng secret manager |
Blast radius
Câu hỏi quan trọng nhất khi cấp quyền:
"Nếu account/credential này bị leak, attacker làm được những gì?"
PoLP giảm blast radius — phạm vi thiệt hại khi một thành phần bị compromise. Nếu DB user chỉ có quyền SELECT * FROM products, attacker không thể DROP TABLE users.
7. Phân loại Attacker
Hiểu attacker giúp bạn ưu tiên defense đúng chỗ.
Bảng so sánh
| Loại | Động cơ | Năng lực | Defense cần |
|---|---|---|---|
| Script kiddie | Khoe khoang, vui | Thấp — dùng Metasploit, sqlmap có sẵn | Patch CVE, basic WAF, không exposed admin panel |
| Hacktivist | Ideology, gây sốc | Trung bình | DDoS protection, hardened public API |
| Organized crime | Tiền (ransomware, fraud) | Cao — có tổ chức, có ngân sách | EDR, backup chống ransomware, MFA, vuln management |
| Nation-state (APT) | Politics, espionage | Rất cao — zero-day, social engineering tinh vi | Defense in depth + monitoring + incident response team. Nếu họ thật sự nhắm bạn, chỉ có thể giảm thiệt hại |
| Insider | Tiền, trả thù, vô tình | Có access hợp pháp | PoLP, audit log, separation of duties, DLP |
Mối đe doạ thực tế cho startup/app SMB
Đa số bạn sẽ gặp:
- Bot tự động scan (CVE, default password) — 80% traffic độc trên internet
- Credential stuffing (dùng password leak từ site khác)
- Phishing nhắm vào nhân viên (admin tài khoản cloud, GitHub)
- Insider vô tình (push secret lên GitHub public, cấu hình S3 public)
Không phải ai cũng cần phòng nation-state — nhưng ai cũng phải phòng được 4 mối trên.
8. Câu hỏi ôn tập
-
Một bệnh viện public danh sách bác sĩ trên website nhưng hacker thay đổi số điện thoại liên hệ thành số của họ. Đây vi phạm trụ cột nào trong CIA?
Xem đáp án
Vi phạm Integrity — data bị thay đổi trái phép. Confidentiality không bị vi phạm vì thông tin vốn đã public. Availability cũng không (website vẫn truy cập được). Mitigation: integrity check (hash của file, signed content), audit log trên CMS, RBAC cho người sửa nội dung.
-
STRIDE letter
E(Elevation of Privilege) là gì? Cho ví dụ trong web app.Xem đáp án
E = Elevation of Privilege — user có quyền thấp nhưng giành được quyền cao hơn. Ví dụ: API endpoint
POST /api/userscho phép gửi{"role": "admin"}và backend tin tưởng giá trị này thay vì hard-code role mặc định. User tạo account thành admin ngay từ đầu. Fix: server tự gán role mặc định, không lấy từ user input. -
Bạn thiết kế một microservice xử lý thanh toán. Defense in depth cho service này nên có những lớp nào tối thiểu?
Xem đáp án
Tối thiểu 5 lớp: (1) Network: chỉ accept traffic từ API Gateway nội bộ, không public; (2) TLS/mTLS: mọi inter-service call dùng TLS, ideally mTLS; (3) AuthN: verify service token (OIDC) + verify user identity (JWT); (4) AuthZ: kiểm tra user có quyền thanh toán cho account này không (không phải account khác); (5) Input validation: amount > 0, currency whitelist, idempotency key. Cộng thêm: DB user least privilege, secret từ KMS/Vault, audit log mọi transaction.
-
Tại sao một service tài khoản web không nên dùng DB user với quyền
ALL PRIVILEGES?Xem đáp án
Vi phạm Principle of Least Privilege. Nếu attacker có SQL injection, họ sẽ làm được mọi thứ:
DROP DATABASE,CREATE USER(persistent backdoor), đọc bảngsalariescủa service khác trong cùng DB. Đúng: tạo DB user riêng cho service, chỉ cóSELECT/INSERT/UPDATEtrên các bảng cần thiết, không cóDROP,CREATE,GRANT. Blast radius khi bị SQLi sẽ giới hạn lại đáng kể. -
Startup của bạn có 5 nhân viên, không lưu trữ data nhạy cảm. Bạn cần phòng những loại attacker nào ở mức ưu tiên cao?
Xem đáp án
Ưu tiên cao: (1) Bot tự động quét CVE, default password, admin panel — chiếm phần lớn traffic độc; (2) Credential stuffing với password leak có sẵn; (3) Phishing nhân viên (đặc biệt admin GitHub/AWS); (4) Vô tình từ insider (commit secret, S3 public). Ưu tiên thấp: nation-state APT — họ hiếm khi nhắm SMB không có data chiến lược, và phòng họ là cuộc chiến không cân sức. Tập trung resource vào 4 mối trên: patch + MFA + secret scanning + security training.
Bài tập thực hành
# 1. Liệt kê attack surface app của bạn
# Mở repo + Trello/Notion, viết ra:
# - Endpoint nào public?
# - Service nào lắng nghe port nào?
# - Account/credential nào có thể compromise?
# - Third-party nào được gọi?
# 2. Threat model 30 phút cho login flow
# Vẽ data flow diagram (Excalidraw / draw.io)
# Áp STRIDE cho mỗi component
# Liệt kê top 3 threat đáng lo nhất + mitigation
# 3. Tự kiểm tra least privilege
# AWS: chạy IAM Access Analyzer
aws accessanalyzer list-findings
# DB: kiểm tra grants của service user
psql -c "\du" -h <host>
# Container: thử chạy với non-root
docker run --user 1000 myimage
# 4. Đo blast radius
# Lấy một secret/credential bất kỳ trong app
# Tự trả lời: "Nếu leak ngay bây giờ, attacker làm được gì?"
# Nếu câu trả lời quá rộng → cần thu hẹp permission
Tài liệu tham khảo chính thức
- OWASP Threat Modeling Cheat Sheet
- Microsoft STRIDE
- NIST SP 800-160 — Systems Security Engineering
- AWS Well-Architected — Security Pillar
Tiếp theo: Ngày 2 — OWASP Top 10 (2021) Overview