Trong series: Bảo mật
  1. 1 Ransomware là gì? Mã độc mã hóa tống tiền và cách phòng chống
  2. 2 SQL Injection là gì? Tấn công cơ sở dữ liệu và cách phòng chống
  3. 3 Tường lửa là gì? Vai trò và chức năng trong bảo mật mạng
  4. 4 MFA Là Gì? So Sánh MFA vs 2FA và Các Phương Thức Xác Thực
  5. 5 VPN là gì? Mạng riêng ảo, WireGuard và OpenVPN
  6. 6 Zero Trust Là Gì? Mô Hình Bảo Mật 'Không Tin Tưởng Ai'
  7. 7 Trojan là gì? Những thông tin cơ bản về mã độc Trojan
  8. 8 OAuth 2.0 là gì? Ủy quyền truy cập và đăng nhập bằng Google/Facebook
  9. 9 DNS Sinkhole là gì? Ứng dụng và cách dùng kỹ thuật DNS Sinkhole
  10. 10 Phishing là gì? Nhận diện và phòng chống tấn công lừa đảo trực tuyến
  11. 11 DDos là gì? Dấu hiệu, xử lý và cách phòng chống hiệu quả
  12. 12 Mã độc là gì? Phân loại, đặc tính và cách phòng tránh
✦ Tóm tắt nhanh
MFA (Multi-Factor Authentication) sử dụng nhiều yếu tố xác thực để bảo vệ tài khoản. Tìm hiểu 3 factor categories, TOTP, FIDO2/WebAuthn, phishing-resistant MFA, và cách phòng MFA fatigue.
Bài này thế nào?

MFA Là Gì? Ba Yếu Tố Xác Thực

MFA (Multi-Factor Authentication) là phương thức xác thực yêu cầu người dùng cung cấp hai hoặc nhiều hơn bằng chứng danh tính từ các category khác nhau trước khi được cấp quyền truy cập.

Ba category yếu tố xác thực:

1. Something You Know (Bạn biết gì)

  • Password, PIN, câu hỏi bảo mật
  • Yếu nhất: có thể bị đoán, phishing, credential stuffing

2. Something You Have (Bạn có gì)

  • OTP token (Google Authenticator, Authy)
  • Hardware key (YubiKey, Google Titan)
  • Phone (SMS OTP, push notification)
  • Smart card

3. Something You Are (Bạn là ai)

  • Vân tay (fingerprint)
  • Nhận diện khuôn mặt (Face ID)
  • Võng mạc (retina scan)
  • Giọng nói (voice recognition)

MFA vs 2FA:

2FA là subset của MFA dùng đúng 2 yếu tố. MFA có thể dùng 3+ yếu tố (ví dụ password + OTP + fingerprint). Trong thực tế, thuật ngữ "2FA" và "MFA" thường dùng thay nhau.

2FA là gì? Xác thực hai yếu tố cơ bản

Tại sao password một mình không đủ?

Theo HaveIBeenPwned: hơn 12 tỷ credential pairs bị lộ. Credential stuffing — dùng combo đã lộ để login tự động — thành công vì người dùng tái sử dụng password. MFA ngăn chặn ngay cả khi password bị compromise.

Các Phương Thức MFA Phổ Biến

TOTP (Time-based One-Time Password):

  • App: Google Authenticator, Authy, Microsoft Authenticator
  • Tạo code 6 số, đổi mỗi 30 giây
  • Offline, không cần internet
  • Yêu cầu sync thời gian

SMS OTP:

  • Code gửi qua SMS
  • Dễ dùng nhất
  • Dễ bị SIM swap, SS7 attack
  • Nên tránh cho account nhạy cảm

Hardware Security Key (FIDO2/U2F):

  • YubiKey, Google Titan Key
  • Physical device cắm USB hoặc NFC
  • Phishing-resistant tuyệt đối
  • Không thể bị phished vì key bind với origin URL

Push Notification:

  • Gửi push đến app mobile (Duo, Okta Verify)
  • Tiện lợi nhưng dễ bị MFA fatigue attack
  • Nên bật number matching

Passkey (FIDO2/WebAuthn):

  • Thay thế hoàn toàn password + MFA
  • Dùng device biometric (Face ID, Touch ID)
  • Phishing-resistant, no shared secret

TOTP Hoạt Động Như Thế Nào?

TOTP (RFC 6238) là thuật toán tạo OTP dựa trên:

  1. Shared secret (seed key, base32 encoded — quét QR code khi setup)
  2. Current time (unix timestamp / 30 = time counter T)
  3. HMAC-SHA1(secret, T) → truncate → 6 số
T = floor(current_unix_time / 30)  # time step
HMAC = HMAC-SHA1(secret, T)
offset = HMAC[19] & 0xf
code = (HMAC[offset:offset+4] & 0x7fffffff) % 10^6

Python pyotp code thực tế:

Python
 1import pyotp
 2import time
 3
 4# Tạo secret mới (lưu trong DB, hiển thị QR cho user)
 5secret = pyotp.random_base32()
 6print(f"Secret: {secret}")  # VD: JBSWY3DPEHPK3PXP
 7
 8# Tạo TOTP object
 9totp = pyotp.TOTP(secret)
10
11# Lấy code hiện tại
12current_code = totp.now()
13print(f"Current OTP: {current_code}")  # VD: 123456
14
15# Verify code từ user (chấp nhận ±1 window = 90 giây)
16user_input = "123456"
17is_valid = totp.verify(user_input, valid_window=1)
18print(f"Valid: {is_valid}")
19
20# Tạo provisioning URI cho QR code
21uri = totp.provisioning_uri(
22    name="user@example.com",
23    issuer_name="MyApp"
24)
25print(f"QR URI: {uri}")
26# otpauth://totp/MyApp:user@example.com?secret=JBSWY3DPEHPK3PXP&issuer=MyApp

Triển khai MFA trong Django REST Framework:

Python
 1# views.py
 2from rest_framework.views import APIView
 3from rest_framework.response import Response
 4import pyotp
 5
 6class MFAVerifyView(APIView):
 7    def post(self, request):
 8        user = request.user
 9        otp_code = request.data.get('otp_code')
10        
11        # Lấy secret từ user profile
12        totp = pyotp.TOTP(user.mfa_secret)
13        
14        if totp.verify(otp_code, valid_window=1):
15            # Issue short-lived token sau khi verify MFA
16            session_token = generate_session_token(user)
17            return Response({'token': session_token})
18        
19        return Response({'error': 'Invalid OTP'}, status=401)

Phishing-Resistant MFA: FIDO2 vs TOTP vs SMS

Không phải tất cả MFA đều như nhau. Attacker ngày càng phishing được cả MFA code.

Phishing attack vs MFA:

  1. Attacker tạo fake login page (vd: g00gle.com)
  2. Nạn nhân nhập username/password → attacker relay sang google.com thật
  3. Google gửi MFA challenge → attacker relay challenge về cho nạn nhân
  4. Nạn nhân nhập TOTP code → attacker capture và dùng ngay (30 giây window)
  5. Attacker đăng nhập thành công vào account thật

FIDO2/WebAuthn chống phishing như thế nào:

Key bind với origin URL. Khi sign challenge:

signed_data = sign(private_key, challenge + origin + rpId)

rpId = google.com. Nếu nạn nhân ở g00gle.com, rpId không match → browser từ chối sign → phishing thất bại.

Bảng so sánh resistance:

Phương thức Phishing SIM Swap Malware UX
Password only Dễ bị N/A Dễ bị Dễ
SMS OTP Dễ bị Dễ bị Trung bình Dễ
TOTP App Dễ bị Không Trung bình Tốt
Push Notification Dễ bị Không Trung bình Tốt
Hardware Key (U2F) Không thể Không Không Tốt
Passkey (FIDO2) Không thể Không Không Tốt nhất

MFA Fatigue Attack — Và Cách Phòng Chống

MFA Fatigue (còn gọi là MFA bombing/push spam) là kỹ thuật social engineering:

  1. Attacker đã có username + password (từ breach hoặc phishing)
  2. Liên tục trigger push notification MFA — đôi khi 50–100 lần trong đêm
  3. Nạn nhân mệt mỏi, mất cảnh giác, approve nhầm
  4. Attacker vào được

Ví dụ thực tế: Vụ tấn công Uber 2022 — attacker WhatsApp nạn nhân giả làm IT support, kết hợp MFA bombing để được approve.

Phòng chống:

1. Number Matching — Yêu cầu user nhập số hiển thị trên login screen vào app:

Login screen: "Enter code: 42"
App push: "Tap if code matches: [42] [Approve] [Deny]"

Nếu không nhìn thấy số này, approve là sai → nạn nhân sẽ nhận ra.

2. Additional Context — Hiển thị thêm trong push: IP, location, browser. Nếu từ Hà Nội nhưng login từ Nga → suspicious.

3. Rate limiting — Limit số push notification per session (max 3 attempts), sau đó lock.

4. Migrate sang FIDO2 — Không có push, không có fatigue. Hardware key hoặc passkey.

Triển Khai MFA Cho Team / Tổ Chức

Bước 1: Enforce MFA qua IdP (Identity Provider)

  • Google Workspace: Admin → Security → 2-Step Verification → Enforcement
  • Okta: Security → Authenticators → Enrollment Policy → Required
  • Azure AD: Security → MFA → Per-user hoặc Conditional Access Policy

Bước 2: Chọn đúng phương thức theo risk level

  • High-risk (admin, finance, exec): Hardware key (YubiKey) + Passkey
  • Standard: Authenticator app (TOTP) — không cho SMS
  • Legacy system không hỗ trợ: SMS OTP (với rate limiting)

Bước 3: Xử lý account recovery an toàn

  • Backup codes in secure vault
  • Admin-assisted recovery với identity verification
  • Không cho phép recovery qua SMS nếu primary là hardware key

OAuth 2.0 là gì? Authorization framework tích hợp MFA

Zero Trust là gì? MFA là nền tảng của mô hình Zero Trust

Câu hỏi thường gặpQ&A