Việc triển khai các biện pháp kiểm soát bảo mật mạnh mẽ cho ứng dụng web hiện đại, đặc biệt là xác thực (bạn là ai?) và phân quyền (bạn được làm gì?), là một thách thức lớn đối với các nhà phát triển. AWS cung cấp giải pháp kết hợp giữa Amazon Cognito cho xác thực và Amazon Verified Permissions cho phân quyền chi tiết, giúp doanh nghiệp xây dựng lớp bảo mật cấp doanh nghiệp với nỗ lực phát triển tối thiểu. Cách tiếp cận này cho phép đội ngũ kỹ thuật tập trung vào các chức năng cốt lõi của ứng dụng thay vì phải viết mã bảo mật phức tạp.
Bài viết này sẽ hướng dẫn cách xây dựng kiểm soát truy cập chi tiết cho một ứng dụng mẫu bằng cách sử dụng Amazon Cognito và Amazon Verified Permissions với các policy bằng ngôn ngữ Cedar. Kiến trúc này giúp giảm thời gian phát triển, triển khai xác thực cấp doanh nghiệp và mở rộng quy mô bảo mật khi lượng người dùng tăng lên.
Tổng quan kiến trúc bảo mật
Kiến trúc tham khảo tuân theo thiết kế bảo mật theo lớp với bốn thành phần chính, tách biệt việc xác minh danh tính, đánh giá phân quyền, logic ứng dụng và các ranh giới thực thi. Bằng cách phân chia trách nhiệm rõ ràng cho từng lớp, kiến trúc này giới hạn bán kính ảnh hưởng và đảm bảo rằng sự cố ở một lớp kiểm soát duy nhất không làm tổn hại đến toàn bộ hệ thống.
- Lớp xác thực (Authentication layer): Amazon Cognito xử lý xác thực người dùng với việc xác thực thông tin đăng nhập an toàn và cấp mã thông báo web JSON (JWT). Dịch vụ này cung cấp sẵn các chính sách mật khẩu, bảo vệ khóa tài khoản và quản lý phiên làm việc.
- Lớp phân quyền (Authorization layer): Verified Permissions sử dụng công cụ policy Cedar để đánh giá các yêu cầu truy cập chi tiết dựa trên các policy được lưu trữ tập trung.
- Lớp ứng dụng (Application layer): Frontend của ứng dụng (ví dụ: Streamlit) tích hợp với cả hai dịch vụ, quản lý phiên người dùng và thực thi các kiểm soát truy cập trên giao diện người dùng.
- Ranh giới bảo mật (Security boundaries): Nhiều lớp kiểm soát bảo mật giúp chống lại truy cập trái phép, leo thang đặc quyền, và yêu cầu xác thực, phân quyền và xác thực đầu vào.
Việc tách biệt này cho phép xác thực và phân quyền hoạt động như các biện pháp kiểm soát bổ sung cho nhau, tuân theo nguyên tắc defense-in-depth (bảo vệ theo chiều sâu). Sơ đồ dưới đây minh họa luồng xác thực và phân quyền từ đầu đến cuối.

Luồng hoạt động kết hợp ba lớp kiến trúc như sau:
- Người dùng gửi yêu cầu đăng nhập thông qua ứng dụng.
- Yêu cầu được xác thực bởi Amazon Cognito.
- Một access token được gửi trở lại ứng dụng.
- Một yêu cầu phân quyền được gửi đến Verified Permissions.
- Công cụ policy Cedar đánh giá yêu cầu.
- Một quyết định (cho phép/từ chối) được gửi lại.
- Lệnh cho phép hoặc từ chối được gửi đến ứng dụng.
- Nếu được cho phép, người dùng sẽ được cấp quyền truy cập.
Phân quyền chi tiết với ngôn ngữ Cedar
Trong khi xác thực thiết lập danh tính người dùng, phân quyền xác định những hành động mà người dùng có thể thực hiện. Verified Permissions cung cấp một dịch vụ phân quyền có khả năng mở rộng dựa trên Cedar, một ngôn ngữ policy được thiết kế đặc biệt cho việc kiểm soát truy cập chi tiết.
Mỗi policy trong Cedar xác định ai (principal) có thể thực hiện hành động (action) nào trên tài nguyên (resource) nào dưới những điều kiện (conditions) nào.

Các thành phần của một policy Cedar bao gồm:
- Effect:
permit(cho phép) hoặcforbid(cấm) xác định liệu policy cho phép hay từ chối truy cập. - Principal: Thực thể (người dùng) đưa ra yêu cầu, được biểu diễn bằng biến
?principal. - Action: Thao tác đang được thực hiện, được định phạm vi trong không gian tên ứng dụng của bạn.
- Resource: Mục tiêu của hành động, cũng được biểu diễn bằng một biến.
- Conditions: Mệnh đề
whenchứa các biểu thức logic phải được đánh giá là đúng.
Các mẫu policy Cedar nâng cao
Phần này mô tả các mẫu policy Cedar thường được sử dụng để triển khai phân quyền chi tiết với Amazon Verified Permissions. Các ví dụ minh họa cách mô hình hóa quyền sở hữu, truy cập dựa trên vai trò, quyền hạn theo cấp bậc và các quyền kiểm soát quản trị trong các ứng dụng thực tế.
Kiểm soát quyền sở hữu tài nguyên
Mẫu này đảm bảo người dùng chỉ có thể truy cập các tài nguyên mà họ sở hữu. Ví dụ, một policy cho phép sinh viên chỉ xem điểm của chính mình bằng cách kiểm tra vai trò Student và xác minh rằng thuộc tính student của tài nguyên điểm khớp với entityId của sinh viên.
Truy cập dựa trên vai trò và loại tài nguyên
Mẫu này cấp quyền truy cập dựa trên vai trò và loại tài nguyên. Ví dụ, một policy cho phép giảng viên chỉnh sửa các khóa học mà họ dạy bằng cách xác minh vai trò Faculty, xác nhận tài nguyên là loại Course và kiểm tra xem thuộc tính instructor của khóa học có khớp với entityId của giảng viên hay không.
Phân quyền theo cấp bậc
Mẫu này cho phép trưởng khoa quản lý các giảng viên trong khoa của họ. Policy yêu cầu người dùng phải là DepartmentHead, xác minh tài nguyên là một giảng viên và khớp phòng ban của giảng viên đó với phòng ban của trưởng khoa.
Ghi đè của quản trị viên
Mẫu này cung cấp quyền truy cập khẩn cấp với lý do chính đáng. Policy cho phép quản trị viên thực hiện bất kỳ hành động nào trên bất kỳ tài nguyên nào, nhưng yêu cầu một cờ truy cập khẩn cấp (emergency access flag) phải được đặt thành true và phải có lý do giải trình. Điều này hỗ trợ trách nhiệm giải trình trong khi vẫn cho phép các hoạt động khẩn cấp.
Luồng xử lý và tối ưu hóa policy
Hiểu cách các policy được đánh giá giúp thiết kế hệ thống phân quyền hiệu quả. Quy trình đánh giá tuân theo các bước sau:
- Người dùng cố gắng truy cập một tài nguyên được bảo vệ.
- Ứng dụng gửi yêu cầu phân quyền đến Verified Permissions.
- Verified Permissions truy xuất các policy Cedar áp dụng từ kho policy.
- Công cụ policy Cedar đánh giá từng policy so với yêu cầu.
- Nếu có bất kỳ policy
forbidnào khớp, quyền truy cập sẽ bị từ chối ngay lập tức. - Nếu có bất kỳ policy
permitnào khớp và không có policyforbidnào khớp, quyền truy cập sẽ được cho phép. - Nếu không có policy nào khớp, quyền truy cập sẽ bị từ chối theo mặc định.
- Kết quả đánh giá (ALLOW hoặc DENY) được trả về cho ứng dụng.
- Ứng dụng thực thi quyết định phân quyền.
Lưu ý: Các policy
forbidluôn được ưu tiên. Nếu bất kỳ policyforbidnào khớp, quyền truy cập sẽ bị từ chối bất kể có các policypermitkhác hay không.

Mẹo tối ưu hóa policy:
- Sắp xếp điều kiện: Đặt các điều kiện có khả năng đúng cao nhất lên đầu trong mệnh đề
whenđể tận dụng short-circuit evaluation. - Sử dụng thuộc tính được đánh chỉ mục: Sử dụng các thuộc tính thực thể mà Verified Permissions đánh chỉ mục tự nhiên (ví dụ:
entityId, vai trò, loại tài nguyên) làm điều kiện chính để tra cứu nhanh hơn. - Lưu cache kết quả đánh giá policy khi thích hợp.
- Giám sát các chỉ số và hiệu suất đánh giá.
Hướng dẫn triển khai mẫu
Để triển khai ứng dụng mẫu, bạn cần có tài khoản AWS đang hoạt động, Python 3.8 trở lên, kiến thức cơ bản về Streamlit và quyền IAM cho Amazon Cognito và Verified Permissions.
- Tải mã nguồn: Tải mã nguồn từ repository mẫu trên GitHub.
- Thiết lập môi trường: Cài đặt AWS SDK cho Python (boto3) và cấu hình thông tin đăng nhập AWS của bạn.
- Tạo tài nguyên AWS: Sử dụng AWS Management Console hoặc các công cụ Infrastructure as Code (IaC) để cấp phát Amazon Cognito user pool và Verified Permissions policy store. Bạn có thể chạy script được cung cấp:
bash
./deploy-demo-environment.sh - Chạy ứng dụng demo: Tương tác với bản demo để kiểm tra các policy và tính năng.

Các phương pháp bảo mật tốt nhất
Khi triển khai kiến trúc này, hãy tuân thủ các phương pháp tốt nhất sau để hỗ trợ bảo mật:
- Bảo mật theo lớp: Sử dụng cả xác thực và phân quyền như các biện pháp kiểm soát bổ sung.
- Tuân thủ nguyên tắc đặc quyền tối thiểu: Chỉ cấp các quyền cần thiết cho các vai trò người dùng cụ thể.
- Quản lý phiên làm việc đúng cách: Đặt chính sách hết hạn và làm mới token phù hợp.
- Xác thực tất cả đầu vào: Làm sạch dữ liệu đầu vào của người dùng để ngăn chặn các cuộc tấn công injection.
- Giám sát các sự kiện xác thực: Thiết lập ghi log và cảnh báo cho các hoạt động đáng ngờ.
- Thực hiện đánh giá bảo mật thường xuyên: Định kỳ kiểm tra các policy và cấu hình bảo mật của bạn.
Kết luận
Bằng cách sử dụng Amazon Cognito và Amazon Verified Permissions, doanh nghiệp có thể xây dựng các biện pháp kiểm soát bảo mật mạnh mẽ mà không cần mã tùy chỉnh phức tạp. Cách tiếp cận này cho phép triển khai xác thực cấp doanh nghiệp, thực thi các policy phân quyền chi tiết, mở rộng quy mô kiểm soát bảo mật và quản lý, kiểm toán các policy một cách tập trung. Điều này giúp các nhóm phát triển tập trung vào việc tạo ra giá trị kinh doanh thay vì lo lắng về việc xây dựng và duy trì các hệ thống bảo mật phức tạp.


