Khi hacker tấn công bạn qua API – Và cách DevOps phòng thủ

01/08/2025

Trong kỷ nguyên của microservices, ứng dụng di động và Single Page Applications (SPA), API (Application Programming Interface) không còn là một phần phụ của hệ thống nữa – nó chính là trái tim của hệ thống. API là cầu nối cho phép các dịch vụ "nói chuyện" với nhau, từ frontend đến backend, từ dịch vụ này sang dịch vụ khác. Nhưng cũng chính vì sự phổ biến và vai trò trung tâm đó, API đã trở thành mặt trận tấn công ưa thích của hacker.

Tư duy DevOps truyền thống tập trung vào tốc độ và sự tự động hóa. Nhưng khi không có an ninh, tốc độ chỉ đưa bạn đến thảm họa nhanh hơn. Đây là lúc DevSecOps vào cuộc: tích hợp an ninh vào mọi giai đoạn của vòng đời phát triển phần mềm. Hãy cùng xem xét các cuộc tấn công API phổ biến và cách một đội ngũ DevSecOps thực thụ xây dựng tuyến phòng thủ vững chắc.

Top lỗ hổng API kinh điển theo OWASP

Tổ chức OWASP hàng năm đều công bố danh sách các rủi ro an ninh hàng đầu, và danh sách dành riêng cho API là kim chỉ nam cho mọi kỹ sư. Dưới đây là một vài "gương mặt" tiêu biểu.

1. Broken Object Level Authorization (BOLA - IDOR)

Đây là lỗ hổng phổ biến và nghiêm trọng nhất. BOLA xảy ra khi một API endpoint không kiểm tra đầy đủ xem người dùng có thực sự được phép truy cập vào một "đối tượng" (object) cụ thể hay không.

  • Kịch bản tấn công:

    • Bạn đăng nhập vào ứng dụng và muốn xem thông tin tài khoản của mình. Bạn gửi một request đến GET /api/v1/users/123, với 123 là ID của bạn.

    • Server trả về thông tin của bạn. Mọi thứ có vẻ ổn.

    • Kẻ tấn công, sau khi đăng nhập bằng tài khoản của hắn, cũng gọi API này nhưng thay đổi ID: GET /api/v1/users/456 (với 456 là ID của một người dùng khác).

    • Nếu server chỉ kiểm tra xem người dùng đã đăng nhập hay chưa mà không kiểm tra xem người dùng có phải là chủ sở hữu của đối tượng 456 không, nó sẽ trả về thông tin của người dùng 456. Kẻ tấn công vừa thành công khai thác BOLA.

Lỗ hổng này còn được biết đến với cái tên Insecure Direct Object References (IDOR).

2. Broken Authentication

Lỗi này liên quan đến việc xác thực danh tính người dùng. Các API endpoint cho phép kẻ tấn công mạo danh người dùng hợp lệ.

  • Các kịch bản phổ biến:

    • Credential Stuffing: Thử hàng loạt cặp username/password bị rò rỉ từ các vụ tấn công khác.

    • JWT Vulnerabilities: Lạm dụng sai sót trong việc triển khai JSON Web Tokens. Ví dụ kinh điển là hacker sửa đổi header của JWT, thay đổi thuật toán ký từ RS256 (bất đối xứng) thành HS256 (đối xứng) hoặc tệ hơn là none, sau đó gửi token đã được chỉnh sửa đến server. Nếu server được cấu hình một cách ngây thơ để tin vào header này, nó sẽ bỏ qua việc xác minh chữ ký và chấp nhận một token giả mạo.

    • Quản lý Session yếu kém: Token không hết hạn, hoặc token có thể bị đoán trước.

3. Injection

Lỗi injection kinh điển từ thời web 1.0 vẫn sống khỏe trong thế giới API. Nó xảy ra khi dữ liệu do người dùng cung cấp không được lọc (sanitize) hoặc kiểm tra (validate) đúng cách trước khi được đưa vào một câu lệnh thực thi.

Ảnh có chứa văn bản, Phông chữ, ảnh chụp màn hình, biểu tượng

Nội dung do AI tạo ra có thể không chính xác.

  • Ví dụ (SQL Injection):

    • Một API endpoint tìm kiếm sản phẩm: GET /api/v1/products/search?name=MyProduct.

    • Backend xử lý bằng cách ghép chuỗi để tạo câu lệnh SQL: SELECT * FROM products WHERE name = 'MyProduct';

    • Kẻ tấn công gửi một request độc hại: GET /api/v1/products/search?name=MyProduct' OR 1=1; --

    • Câu lệnh SQL trở thành: SELECT * FROM products WHERE name = 'MyProduct' OR 1=1; --';

    • Kết quả: Toàn bộ sản phẩm trong database bị trả về, vì 1=1 luôn đúng.

Các biến thể khác bao gồm NoSQL Injection, Command Injection (thực thi lệnh hệ điều hành), và LDAP Injection.

Phòng Thủ Chủ Động: Tư Duy Của Một DevSecOps

Một DevSecOps thực thụ không chờ đợi lỗ hổng xảy ra rồi mới vá. Họ xây dựng một kiến trúc có khả năng phòng thủ từ gốc.

1. API Gateway: Người gác cổng mẫn cán

Thay vì để traffic từ Internet "đập" thẳng vào từng microservice, hãy đặt một API Gateway ở phía trước. Đây là một proxy trung gian, hoạt động như một người gác cổng cho toàn bộ hệ thống API của bạn.

  • Vai trò chính:

    • Rate Limiting & Throttling: Chặn các cuộc tấn công vét cạn (brute-force) hoặc DoS bằng cách giới hạn số lượng request từ một địa chỉ IP hoặc một user trong một khoảng thời gian nhất định. Đây là tuyến phòng thủ đầu tiên chống lại Broken Authentication.

    • Authentication & Authorization sơ khai: API Gateway có thể đảm nhiệm việc kiểm tra tính hợp lệ của API key hoặc JWT token ở lớp ngoài cùng. Nếu token không hợp lệ, request sẽ bị chặn ngay lập tức, không cần đến được các service bên trong.

    • IP Whitelisting/Blacklisting: Chặn các dải IP đáng ngờ.

    • Request Validation: Kiểm tra cấu trúc cơ bản của request (đúng header, đúng định dạng body) trước khi chuyển tiếp.

  • Công cụ phổ biến: Kong, Tyk, Apigee, NGINX Plus, AWS API Gateway.

2. Centralized Auth Server: Cảnh sát trưởng về danh tính

Đừng để mỗi microservice tự viết logic xác thực và phân quyền của riêng nó. Điều này không chỉ tốn công mà còn tạo ra vô số điểm yếu tiềm tàng. Thay vào đó, hãy sử dụng một máy chủ xác thực tập trung (Authentication Server).

  • Luồng hoạt động (OAuth 2.0 / OIDC):

    1. User muốn truy cập một dịch vụ (Service A).

    2. Service A chuyển hướng user đến Auth Server để đăng nhập.

    3. Sau khi đăng nhập thành công, Auth Server cấp cho user một Access Token (thường là JWT). Token này chứa thông tin về danh tính của user và các quyền hạn (scopes) mà họ có.

    4. User gửi Access Token này trong mỗi request đến Service A (và các service khác).

    5. Service A (hoặc API Gateway) chỉ cần xác minh tính hợp lệ của Access Token này bằng cách kiểm tra chữ ký với public key của Auth Server. Nó không cần biết mật khẩu của user.

  • Lợi ích:

  • Giải quyết Broken Authentication: Logic xác thực phức tạp (MFA, password policy) được quản lý ở một nơi duy nhất và an toàn.

  • Nền tảng cho BOLA: Access Token chứa thông tin về "ai" và "được làm gì". Các service bên trong có thể dựa vào thông tin này để thực thi logic phân quyền ở cấp độ đối tượng một cách nhất quán.

  • Single Sign-On (SSO): Đăng nhập một lần, truy cập nhiều dịch vụ.

  • Công cụ phổ biến: Keycloak, Auth0, Okta, Ory Hydra.

3. "Shift-Left" Security: Tích hợp an ninh vào CI/CD

"Shift Left" là đưa an ninh vào các giai đoạn sớm hơn trong vòng đời phát triển. Đây là trái tim của DevSecOps.

  • SAST (Static Application Security Testing): Tự động quét mã nguồn ngay khi lập trình viên commit code. Các công cụ SAST có thể phát hiện các mẫu code dễ bị injection hoặc các lỗi logic phổ biến.

    • Công cụ: SonarQube, Snyk Code, Checkmarx.

  • SCA (Software Composition Analysis): Tự động quét các thư viện và dependencies của dự án để tìm các lỗ hổng đã được biết đến (CVEs). Bạn sẽ không muốn ứng dụng của mình bị tấn công chỉ vì dùng một thư viện mã nguồn mở phiên bản cũ.

    • Công cụ: OWASP Dependency-Check, Snyk Open Source, Dependabot (GitHub).

  • DAST (Dynamic Application Security Testing): Tự động "tấn công thử" ứng dụng đang chạy trong môi trường staging hoặc testing. Các công cụ DAST mô phỏng hành vi của hacker để tìm ra các lỗ hổng như BOLA, Injection...

    • Công cụ: OWASP ZAP, Burp Suite, Invicti.

Bằng cách tích hợp các bước này vào pipeline CI/CD (Jenkins, GitLab CI, GitHub Actions), đội ngũ sẽ nhận được phản hồi về an ninh một cách nhanh chóng, giúp sửa lỗi khi chi phí còn thấp, thay vì chờ đến lúc sản phẩm đã lên production.

Kết luận: An ninh là một hành trình, không phải đích đến.

Tấn công qua API là một thực tế không thể tránh khỏi. Tuy nhiên, bằng cách áp dụng tư duy DevSecOps, chúng ta có thể chuyển từ thế bị động sang chủ động.

Sử dụng API Gateway để tạo một vành đai phòng thủ, triển khai Auth Server để quản lý danh tính một cách tập trung, và tích hợp các công cụ SAST/DAST/SCA vào pipeline CI/CD không chỉ giúp vá các lỗ hổng cụ thể. Chúng tạo ra một hệ sinh thái nơi an ninh là trách nhiệm chung, được tự động hóa và là một phần không thể tách rời của văn hóa kỹ thuật. Đó mới chính là cách phòng thủ của một đội ngũ DevOps hiện đại.



Các tin khác