Bài đăng này được viết bởi Omkar Deshmane, Senior SA và Anton Aleksandrov, Principal SA của Serverless.
Bài đăng này sẽ hướng dẫn cách sử dụng Amazon API Gateway với một trình xác thực tùy chỉnh để xử lý các yêu cầu đến, xác thực chứng chỉ mTLS của khách hàng, trích xuất chủ đề chứng chỉ khách hàng và truyền nó cho ứng dụng hạ tầng dưới dạng header HTTP mã hóa base64.
Mô hình này cho phép bạn kết thúc mTLS tại edge để các ứng dụng hạ tầng dưới không cần thực hiện xác thực chứng chỉ khách hàng. Với cách tiếp cận này, các nhà phát triển có thể tập trung vào logic ứng dụng và giảm bớt quản lý và xác thực chứng chỉ mTLS cho một dịch vụ chuyên dụng như API Gateway.
Tổng quan
Xác thực là một trong những khía cạnh bảo mật cốt lõi mà bạn phải giải quyết khi xây dựng một ứng dụng cloud. Việc xác thực thành công chứng minh bạn là người đang giả là ai. Có nhiều mẫu xác thực phổ biến, chẳng hạn như xác thực dựa trên cookie, xác thực dựa trên token, hoặc chủ đề của bài đăng blog này – xác thực dựa trên chứng chỉ.
Chứng chỉ Transport Layer Security (TLS) là trung tâm của một internet an toàn và bảo mật. Chứng chỉ TLS bảo vệ kết nối giữa khách hàng và máy chủ bằng cách mã hóa dữ liệu, đảm bảo giao tiếp riêng tư. Khi sử dụng giao thức TLS, máy chủ phải chứng minh danh tính của mình cho khách hàng bằng chứng chỉ được ký bởi một cơ quan chứng nhận được tin tưởng bởi khách hàng.
Mutual TLS (mTLS) giới thiệu một lớp bảo mật bổ sung, trong đó cả khách hàng và máy chủ phải chứng minh danh tính của họ cho nhau. Nhà phát triển thường sử dụng mTLS để xác thực ứng dụng-đến-ứng dụng – sử dụng chứng chỉ số để đại diện cho cả ứng dụng khách hàng và máy chủ là một mẫu xác thực phổ biến cho các luồng công việc như vậy. Chúng tôi rất khuyến khích tách biệt mTLS khỏi logic kinh doanh của ứng dụng để bạn không phải cập nhật ứng dụng khi thay đổi cấu hình mTLS. Đây là mẫu thường gặp để thực hiện xác thực và kết thúc mTLS trong một thiết bị mạng tại đường biên, chẳng hạn như Amazon API Gateway.
Trong giải pháp này, chúng tôi trình bày một mẫu sử dụng API Gateway với một bộ xác thực được triển khai với AWS Lambda để xác minh chứng chỉ mTLS của khách hàng, trích xuất chủ đề chứng chỉ của khách hàng và truyền nó cho ứng dụng hạ tầng trong một tiêu đề HTTP được mã hóa base64.
Trong khi blog này mô tả cách triển khai mô hình này cho các danh tính được trích xuất từ chứng chỉ khách mTLS, bạn có thể tổng quát hóa và áp dụng để truyền thông tin được thu thập thông qua bất kỳ phương pháp xác thực nào khác.
Ứng dụng mẫu mTLS
Blog này bao gồm một ứng dụng mẫu được triển khai bằng AWS Serverless Application Model (AWS SAM). Nó tạo ra một môi trường demo chứa các tài nguyên như API Gateway, một Lambda authorizer và một instance Amazon EC2, giả lập ứng dụng backend.
Instance EC2 được sử dụng cho ứng dụng backend để mô phỏng các kịch bản phổ biến của khách hàng. Bạn có thể sử dụng bất kỳ loại tính toán nào khác, chẳng hạn như các hàm Lambda hoặc ứng dụng được đóng gói trong container với Amazon Elastic Container Service (Amazon ECS) hoặc Amazon Elastic Kubernetes Service (Amazon EKS), làm tầng ứng dụng backend.
Sơ đồ sau cho thấy kiến trúc giải pháp:

- Lưu trữ chứng chỉ khách hàng trong một kho tin cậy trong một bucket Amazon S3.
- Khách hàng tạo yêu cầu đến điểm cuối API Gateway, cung cấp chứng chỉ khách hàng để thiết lập phiên mTLS.
- API Gateway truy xuất kho tin cậy từ bucket S3. Nó xác thực chứng chỉ khách hàng, khớp các tổ chức được tin tưởng và chấm dứt kết nối mTLS.
- API Gateway gọi Lambda authorizer, cung cấp ngữ cảnh yêu cầu và thông tin chứng chỉ khách hàng.
- Lambda authorizer trích xuất chủ đề chứng chỉ khách hàng. Nó thực hiện bất kỳ kiểm tra tùy chỉnh cần thiết và trả lại chủ đề đã trích xuất cho API Gateway như một phần của ngữ cảnh ủy quyền.
- API Gateway chèn chủ đề đã trích xuất ở bước trước vào phần tiêu đề HTTP yêu cầu tích hợp và gửi yêu cầu đến điểm cuối hạ tầng phía dưới.
- Ứng dụng backend nhận yêu cầu, trích xuất chủ đề đã chèn và sử dụng nó với logic kinh doanh tùy chỉnh.
Yêu cầu và triển khai sẵn
Một số tài nguyên được tạo ra như một phần của việc triển khai kiến trúc mẫu này sẽ có chi phí kèm theo, khi chạy và khi không hoạt động. Điều này bao gồm các tài nguyên như Amazon Virtual Private Cloud (Amazon VPC), VPC NAT Gateway và EC2 instances. Chúng tôi khuyên bạn nên xóa bỏ các bộ nguồn triển khai sau khi khám phá giải pháp để tránh chi phí bất ngờ. Xem phần Dọn dẹp để biết chi tiết.
Tham khảo kho mã nguồn dự án để biết hướng dẫn triển khai giải pháp bằng cách sử dụng AWS SAM. Việc triển khai cung cấp nhiều tài nguyên, mất vài phút để hoàn thành.
Sau khi triển khai thành công, tham khảo biến RestApiEndpoint trong phần Output để tìm địa chỉ kết nối API Gateway. Ghi nhớ giá trị này để kiểm tra sau này.

Các vùng chính trong mã dự án mẫu
Có hai vùng chính trong mã dự án mẫu.
Trong src/authorizer/index.js, mã Lambda authorizer trích xuất chủ đề từ chứng chỉ khách hàng. Nó trả về giá trị là một phần của đối tượng ngữ cảnh cho API Gateway. Điều này cho phép API Gateway sử dụng giá trị này trong yêu cầu tích hợp tiếp theo.
JavaScript
const crypto = require(‘crypto’);
exports.handler = async (event) => {
console.log (‘> handler’, JSON.stringify(event, null, 4));
const clientCertPem = event.requestContext.identity.clientCert.clientCertPem;
const clientCert = new crypto.X509Certificate(clientCertPem);
const clientCertSub = clientCert.subject.replaceAll(‘\n’, ‘,’);
const response = {
principalId: clientCertSub,
context: { clientCertSub },
policyDocument: {
Version: ‘2012-10-17’,
Statement: [{
Action: ‘execute-api:Invoke’,
Effect: ‘allow’,
Resource: event.methodArn
}]
}
};
console.log(‘Authorizer Response’, JSON.stringify(response, null, 4));
return response;
};
Trong template.yaml, API Gateway chèn chủ đề chứng chỉ khách hàng được trích xuất bởi Lambda authorizer trước đó vào yêu cầu tích hợp dưới dạng tiêu đề HTTP X-Client-Cert-Sub. X-Client-Cert-Sub là tên tiêu đề tùy chỉnh và bạn có thể chọn bất kỳ tên tiêu đề tùy chỉnh nào khác thay cho nó.
YAML
SayHelloGetMethod:
Type: AWS::ApiGateway::Method
Properties:
AuthorizationType: CUSTOM
AuthorizerId: !Ref CustomAuthorizer
HttpMethod: GET
ResourceId: !Ref SayHelloResource
RestApiId: !Ref RestApi
Integration:
Type: HTTP_PROXY
ConnectionType: VPC_LINK
ConnectionId: !Ref VpcLink
IntegrationHttpMethod: GET
Uri: !Sub ‘http://${NetworkLoadBalancer.DNSName}:3000/’
RequestParameters:
‘integration.request.header.X-Client-Cert-Sub’: ‘context.authorizer.clientCertSub’
Kiểm thử ví dụ
Bạn tạo một khóa và chứng chỉ khách hàng trong quá trình triển khai, được lưu trữ trong thư mục /certificates. Sử dụng lệnh curl để yêu cầu đến điểm cuối API REST bằng cách sử dụng các tệp này.
Curl
curl –cert certificates/client.pem –key certificates/client.key \
<use the RestApiEndpoint found in CloudFormation output>

Yêu cầu của khách hàng đến API Gateway sử dụng mTLS với chứng chỉ khách hàng được cung cấp để xác thực TLS đối xứng. API Gateway sử dụng trình xác thực Lambda để trích xuất chủ đề chứng chỉ và chèn nó vào yêu cầu tích hợp.
Máy chủ HTTP chạy trên instance EC2, mô phỏng ứng dụng backend. Nó chấp nhận yêu cầu đến và phản hồi lại, cung cấp tiêu đề yêu cầu như một phần của phản hồi. Phản hồi HTTP nhận được từ ứng dụng backend chứa một thông điệp đơn giản và một bản sao của các tiêu đề yêu cầu được gửi từ API Gateway đến backend.
Một tiêu đề là x-client-cert-sub với giá trị Common Name mà bạn cung cấp cho chứng chỉ khách hàng trong quá trình tạo. Xác minh rằng giá trị khớp với Common Name mà bạn cung cấp khi tạo chứng chỉ khách hàng.

API Gateway đã xác thực chứng chỉ khách hàng mTLS, sử dụng trình xác thực Lambda để trích xuất tên chung chứng chỉ từ khách hàng và chuyển tiếp nó đến ứng dụng phía dưới.
Dọn dẹp
Sử dụng lệnh xóa sam trong thư mục api-gateway-certificate-propagation để xóa cơ sở hạ tầng ứng dụng mẫu:
Bash
sam delete
Bạn cũng có thể tham khảo hướng dẫn dọn dẹp trong kho mã nguồn dự án.
Kết luận
Bài viết này cho thấy cách sử dụng API Gateway với một Lambda authorizer để xác thực chứng chỉ khách hàng mTLS, trích xuất trường tùy chỉnh và truyền xuống cho các hệ thống backend. Mô hình này cho phép bạn kết thúc mTLS tại cạnh để các ứng dụng hạ tầng phía dưới không phải chịu trách nhiệm cho việc xác thực chứng chỉ khách hàng.
Để biết thêm tài liệu, hãy tham khảo Sử dụng API Gateway với Lambda Authorizer. Tải mã nguồn mẫu từ kho mã nguồn dự án. Đối với các nguồn tài liệu học tập về serverless khác, hãy truy cập Serverless Land.