Bài post được viết bởi Madhu Singh (Kiến trúc sư giải pháp) và Krupanidhi Jay (Kiến trúc sư giải pháp)
Lambda function URL là điểm cuối HTTP chuyên dụng cho AWS Lambda. Bạn có thể định cấu hình URL chức năng để có hai phương thức xác thực: IAM và NONE. Xác thực IAM có nghĩa là bạn đang hạn chế quyền truy cập vào URL function(và quyền truy cập lần lượt để gọi hàm Lambda) đối với một số nguyên tắc AWS nhất định (chẳng hạn như vai trò hoặc người dùng). Loại xác thực NONE có nghĩa là URL Lambda function không có xác thực và mở cho bất kỳ ai gọi hàm.
Blog này trình bày cách sử dụng Lambda URL với loại xác thực là NONE và sử dụng logic ủy quyền tùy chỉnh như một phần của code và chỉ cho phép các yêu cầu xuất trình thông tin xác thực Amazon Cognito hợp lệ khi gọi hàm. Bạn cũng tìm hiểu cách bảo vệ Lambda URL trước các mối đe dọa bảo mật phổ biến như DDoS bằng AWS WAF và Amazon CloudFront.
Lambda URL cung cấp một cách đơn giản hơn để gọi hàm của bạn bằng HTTP. Tuy nhiên, nó không phải là sự thay thế cho Amazon API Gateway, nó cung cấp các tính năng nâng cao như xác thực yêu cầu và điều tiết tốc độ.
TỔNG QUAN GIẢI PHÁP
Có bốn thành phần lõi trong ví dụ.
- Lambda đã bật tính năng URL
Cốt lõi của ví dụ này là Lambda có tính năng URL của hàm được bật với loại xác thực là KHÔNG. Hàm này phản hồi bằng thông báo thành công nếu mã ủy quyền hợp lệ được chuyển trong quá trình gọi. Nếu không, nó sẽ phản hồi bằng một thông báo lỗi.
- Amazon Cognito User Po
Amazon Cognito user pools cho phép xác thực người dùng trên các trang web và ứng dụng di động. Bạn cũng có thể kích hoạt các trang Đăng nhập và Đăng ký có thể truy cập công khai trong ứng dụng của mình bằng tính năng của nhóm người dùng Amazon Cognito được gọi là giao diện người dùng được lưu trữ.
Trong ví dụ này, bạn sử dụng user pool và Giao diện người dùng được lưu trữ được liên kết để cho phép người dùng đăng nhập và đăng ký trên trang web được sử dụng làm điểm truy cập. Lambda xác thực mã ủy quyền đối với nhóm người dùng Amazon Cognito này.
- Phân phối CloudFront bằng AWS WAF
CloudFront là dịch vụ mạng phân phối nội dung (CDN) giúp phân phối nội dung đến người dùng cuối với độ trễ thấp, đồng thời cải thiện tình trạng bảo mật cho ứng dụng của bạn.
AWS WAF là tường lửa ứng dụng web giúp bảo vệ các ứng dụng web hoặc API của bạn khỏi các bot và khai thác web thông thường. AWS Shield là dịch vụ bảo vệ từ chối dịch vụ (DDoS) phân tán được quản lý nhằm bảo vệ các ứng dụng chạy trên AWS. AWS WAF kiểm tra yêu cầu đến theo quy tắc Danh sách kiểm soát truy cập web (web ACL) đã được cấu hình.
Thêm CloudFront trước Lambda URL của bạn sẽ giúp lưu nội dung vào bộ nhớ đệm gần hơn với người xem, đồng thời kích hoạt AWS WAF và AWS Shield giúp tăng cường trạng thái bảo mật trước nhiều loại tấn công, bao gồm cả các cuộc tấn công DDoS của lớp ứng dụng và mạng
- Trang web công khai gọi hàm Lambda
Ví dụ này cũng tạo một trang web công khai được xây dựng trên React JS và được lưu trữ trong AWS Amplify làm điểm bắt đầu cho bản demo. Trang web này hoạt động cả ở chế độ xác thực và chế độ khách. Để xác thực, trang web sử dụng giao diện người dùng được lưu trữ trên Amazon Cognito user pool.
Kiến trúc giải pháp
Điều này cho thấy kiến trúc của ví dụ và luồng thông tin cho các yêu cầu của người dùng
Trong luồng yêu cầu :
- Điểm vào là trang web được lưu trữ trong AWS Amplify. Trong trang chủ, khi bạn chọn “đăng nhập”, bạn sẽ được chuyển hướng đến giao diện người dùng được lưu trữ trên Amazon Cognito cho nhóm người dùng.
- Sau khi đăng nhập thành công, Amazon Cognito trả về authorization code, mã này được lưu trữ dưới dạng cookie có tên “code”. Người dùng được chuyển hướng quay lại trang web có nút “Execute Lambda”
- Khi người dùng chọn “Execute Lambda”, giá trị từ cookie “code” sẽ được chuyển trong nội dung yêu cầu đến điểm cuối phân phối CloudFront
- Quy tắc ACL của AWS WAF được định cấu hình để xác định xem yêu cầu có xuất phát từ địa chỉ IP của Hoa Kỳ hay Canada hay không và để xác định xem yêu cầu có được phép gọi Lambda URL gốc hay không
- Các yêu cầu được phép được chuyển tiếp đến điểm cuối phân phối CloudFront.
- CloudFront được định cấu hình để cho phép các CORS header và có nguồn gốc được đặt thành Lambda URL. Yêu cầu mà CloudFront nhận được sẽ được chuyển tới Lambda URL.
- Thao tác này gọi Lambda được liên kết với URL để xác thực mã thông báo
- Chức năng thực hiện theo thứ tự sau:
- Trao đổi authorization code trong request body (được chuyển dưới dạng đối tượng sự kiện sang hàm Lambda) thành access_token bằng cách sử dụng điểm cuối mã thông báo của Amazon Cognito (kiểm tra tài liệu để biết thêm chi tiết)
- Các thuộc tính của Amazon Cognito user pool như URL, client ID và Secret được truy xuất từ AWS Systems Manager Parameter Store (SSM Parameters)
- Các giá trị này được lưu trữ trong SSM Parameter Store tại thời điểm các tài nguyên này được triển khai thông qua AWS CDK (xem phần “cách triển khai”)
- Access token sau đó được xác minh để xác định tính xác thực của nó
- Nếu hợp lệ, hàm Lambda trả về thông báo cho biết người dùng được xác thực là <username> và quá trình thực thi đã thành công
- Ví dụ: nếu không có authorization code, người dùng đang ở “chế độ khách” trên trang web hoặc mã không hợp lệ hoặc đã hết hạn, thì hàm Lambda sẽ trả về thông báo cho biết rằng người dùng không được phép thực thi hàm
- Trao đổi authorization code trong request body (được chuyển dưới dạng đối tượng sự kiện sang hàm Lambda) thành access_token bằng cách sử dụng điểm cuối mã thông báo của Amazon Cognito (kiểm tra tài liệu để biết thêm chi tiết)
- Trang web hiển thị thông báo trả về hàm Lambda dưới dạng cảnh báo
Bắt đầu
Điều kiện tiên quyết
Trước khi triển khai giải pháp, làm theo README từ GitHub và thực hiện các bước cần thiết để đáp ứng các điều kiện tiên quyết.
Triển khai giải pháp
- Tại root, tải xuống các dependencies.
npm install
- Bắt đầu triển khai các tài nguyên AWS cần thiết
cdk deploy
Lưu ý:
- Có thể truyền –profile vào nếu cần
- Quá trình triển khai có thể mất khoảng 15 phút
- Sau khi triển khai hoàn tất, kết quả đầu ra trông giống như thế này
Mở amplifyAppUrl trong trình duyệt của bạn. Đây là URL của trang web demo. Nếu bạn không thấy trang “Welcome to Compute Blog”, nghĩa là ứng dụng Amplify vẫn đang được xây dựng và trang web chưa khả dụng. Hãy thử lại sau vài phút. Trang web này hoạt động ở trạng thái được xác thực hoặc không được xác thực
Kiểm tra luồng xác thực
- Để kiểm tra luồng xác thực, chọn “Sign In”
- Trong trang đăng nhập, chọn đăng ký (lần đầu tiên) và tạo tên người dùng và mật khẩu
- Để sử dụng tên người dùng và mật khẩu hiện có, hãy nhập các thông tin đăng nhập đó và chọn đăng nhập
- Sau khi đăng nhập hoặc đăng ký thành công, bạn sẽ được chuyển hướng trở lại trang web bằng nút “Execute Lambda”
- Chọn nút này. Trong vài giây, một cửa sổ cảnh báo bật lên hiển thị người dùng đã đăng nhập và việc thực thi Lambda thành công.
Kiểm thử luồng không được xác thực
- Để kiểm tra luồng chưa được xác thực, từ Trang chủ, hãy chọn “Tiếp tục”
- Chọn “Execute Lambda” và sau vài giây, bạn sẽ thấy thông báo rằng bạn không được phép thực thi hàm Lambda
Kiểm thử tính năng chặn địa lý của AWS WAF
- Truy cập trang web từ một Khu vực không phải là Hoa Kỳ hoặc Canada. Nếu bạn thực sự ở Hoa Kỳ hoặc Canada, bạn có thể sử dụng dịch vụ VPN để kết nối với Khu vực không phải Hoa Kỳ hoặc Canada
- Chọn nút “Execute Lambda”. Trong truy vết Mạng của trình duyệt, bạn có thể thấy lệnh gọi gọi hàm Lambda đã bị chặn bằng phản hồi Forbidden.
- Để thử lại luồng đã được xác thực hoặc chưa được xác thực, hãy chọn “Return to Home Page” để quay lại trang chủ bằng nút “Sign In” và “Continue”
Dọn dẹp
Để xóa tài nguyên được cung cấp, hãy chạy lệnh cdk destroy từ AWS CDK CLI
Kết luận
Trong blog này, bạn tạo một hàm Lambda với các URL được bật với loại xác thực là NONE. Sau đó, bạn đã triển khai cơ chế xác thực tùy chỉnh như một phần của Lambda. Bạn cũng đã tăng cường tính bảo mật của URL hàm Lambda bằng cách đặt URL này làm Origin cho bản phân phối CloudFront và sử dụng các quy tắc giới hạn địa lý và IP của AWS WAF để bảo vệ khỏi các mối đe dọa web phổ biến, như DDoS.