</>Học Dev
Bài học

Tuần 1 - Ngày 1: Threat Model và CIA Triad

Tuần 1 – Ngày 1

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 depthprinciple 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

2024IBMCostofaDataBreachReportTrungbìnhmtvdatabreach:$4.88triuUSDThigianpháthintrungbình:204ngàyThigiankhcphctrungbình:73ngàyNguyênnhânhàngđu:Stolencredentials(16%)Nguyênnhân#2:Phishing(15%)Nguyênnhân#3:Misconfiguration(12%)

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

InformationSecurityCConfidentiality"Bímt"(Encryption,ACL,IAM)IIntegrity"Toànvn"(Hash,signature,auditlog)AAvailability"Snsàng"(HA,DDoSprotection,backup)

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.balance chỉ 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ânC > I > A
Hệ thống điều khiển không lưuI > A > C
Trang tin tức công khaiA > I > C
Hệ thống thanh toánI = 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.

AttackSurfaceMapNetworkOpenports(SSH,RDP,DBs)ApplicationHTTPAPIendpointsFormsFileuploadWebSocketsGraphQLHumanPhishingSocialengineeringInsiderStolenlaptopCloudconfigS3publicIAMkeysSecretsinrepoThird-partyOAuthappsSDKsWebhooksSupplychainnpm,pippackagesDockerimagesCI/CDtokens

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)

ThreatVi phạmVí dụ
SpoofingAuthenticationGiả danh user khác, fake JWT
TamperingIntegritySửa giá trong request price=0
RepudiationNon-repudiationUser chối "không phải tôi click"
Information disclosureConfidentialityAPI leak email user khác qua IDOR
Denial of serviceAvailabilitySpam request làm sập server
Elevation of privilegeAuthorizationUser 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

BrowserHTTPSLoginAPIqueryUserDBJWTissuer

Áp STRIDE:

ComponentSTRIDE
Browser → APITLS pinning?Replay attack?Audit log?TLS bắt buộcRate limit
Login APIVerify password hashInput validationLog login attemptsKhông leak "user tồn tại"CAPTCHA + lockoutKhông return admin claim từ user input
User DBDB credentialParameterized queryDB auditEncrypt PII columnConnection pool limitDB user least privilege
JWT issuerSign with strong keyVerify signatureInclude iat, jtiKhông bỏ PII vào JWTShort TTLKhô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.

Layer1:Network(WAF,firewall)Layer2:TLS/mTLSLayer3:AuthN/AuthZLayer4:InputvalidationLayer5:DBpermissions+encryption"Crownjewels"(dataquantrngnht)

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à rootTạ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 AWSMỗi role có scoped IAM policy, dùng AssumeRole khi cần
Container chạy bằng rootUSER 1000 trong Dockerfile, dùng read-only filesystem
Service account có *:* permissionLiệ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ỗ.

Nănglc:ThpCaoScriptkiddieHacktivistOrganizedcrimeNation-state(APT)Insider-Dùngtool-Anonymous,-Tchctiphm-Politics,espionage-NhânviênxusncóLulzseccóngânsáchlong-termcampaignshocbmuachuc-Thmò-Ideology-Mctiêu:tin-Zero-day,APT-Đãcóaccess

Bảng so sánh

LoạiĐộng cơNăng lựcDefense cần
Script kiddieKhoe khoang, vuiThấp — dùng Metasploit, sqlmap có sẵnPatch CVE, basic WAF, không exposed admin panel
HacktivistIdeology, gây sốcTrung bìnhDDoS protection, hardened public API
Organized crimeTiền (ransomware, fraud)Cao — có tổ chức, có ngân sáchEDR, backup chống ransomware, MFA, vuln management
Nation-state (APT)Politics, espionageRất cao — zero-day, social engineering tinh viDefense 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
InsiderTiền, trả thù, vô tìnhCó access hợp phápPoLP, audit log, separation of duties, DLP

Mối đe doạ thực tế cho startup/app SMB

Đa số bạn sẽ gặp:

  1. Bot tự động scan (CVE, default password) — 80% traffic độc trên internet
  2. Credential stuffing (dùng password leak từ site khác)
  3. Phishing nhắm vào nhân viên (admin tài khoản cloud, GitHub)
  4. 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

  1. 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.

  2. 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/users cho 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.

  3. 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.

  4. 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ảng salaries của service khác trong cùng DB. Đúng: tạo DB user riêng cho service, chỉ có SELECT/INSERT/UPDATE trên các bảng cần thiết, khôngDROP, CREATE, GRANT. Blast radius khi bị SQLi sẽ giới hạn lại đáng kể.

  5. 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


Tiếp theo: Ngày 2 — OWASP Top 10 (2021) Overview