Sử dụng Amazon API Gateway APIs riêng tư bằng cách sử dụng TLS chung

Bài viết được viết bởi Thomas Moore, Senior Solutions Architect and Josh Hart, Senior Solutions Architect.

Amazon API Gateway cho phép các lập trình viên tạo REST APIs riêng tư chỉ cho phép truy cập từ virtual private cloud (VPC). Lượng truy cập tới API riêng bảo đảm kết nối và không cho thoát khỏi mạng AWS, có nghĩa AWS độc lập chính nó khỏi public internet. Điều này làm cho private API Gateway endpoints phù hợp để xuất bản các APIs nội bộ, ví dụ như các API được giao tiếp bởi backend microservice.

Trong kiến trúc microservice, nhiều đội xây dựng và quản lý components, các tài khoản AWS khác nhau thường sử dụng private API endpoints.

Bài viết này cho thấy cách một dịch vụ có thể sử dụng private API Gateway endpoint được xuất bản trong tài khoản khác một cách an toàn thông qua AWS PrivateLink.

Consuming API Gateway private endpoint cross-account via AWS PrivateLink.

Bài viết này đề cập đến việc sử dụng các API Gateway endpoints theo tài khoản chéo. Cho tài khoản chéo tài nguyên sau API Gateway, đọc this existing blog post.


Tổng quan

Để truy cập API Gateway private endpoints, bạn phải tạo interface VPC endpoint (được đặt tên execute-api) bên trong VPC của bạn. Điều này tạo ra 1 AWS PrivateLink kết nối giữa VPC của tài khoản AWS của bạn và VPC của dịch vụ API Gateway. Kết nối PrivateLink cho phép lượng truy cập chảy qua không gian địa chỉ IP private mà không cần thông qua internet.

PrivateLink cho phép truy cập private API Gateway endpoints trong các tài khoản AWS khác, mà không cần VPC peering, các kết nối VPN, hoặc AWS Transit Gateway. Execute-api endpoint duy nhất được sử dụng kết nối tới bất kỳ API Gateway nào, bất kể API Gateway đích nằm trong tài khoản AWS nào. Resource policies quản lý VPC endpoints nào có truy cập tới API Gateway private endpoint. Điều này làm cho kiến trúc theo cross-account đơn giản hơn, với không cần định tuyến phức tạp hoặc kết nối giữa các VPC.

Theo dõi biểu đồ cho thấy interface VPC endpoints trong một tài khoản của người dùng tạo kết nối PrivateLink trở lại VPC của tài khoản dịch vụ API Gateway. Những resource policy được áp dụng cho private API quyết định VPC endpoints có thể truy cập API. Chính vì lý do này, điều quan trọng là để đảm bảo resource policy là chính xác ngăn chặn truy cập không mong muốn từ các điểm cuối VPC của tài khoản AWS khác.

Access to private API Gateway endpoints requires an AWS PrivateLink connection to an AWS service account VPC.

Trong ví dụ này, resource policy từ chối tất cả kết nối tới private API endpoint trừ khi điều kiện aws:SourceVpce khớp với vpce-1a2b3c4d ở tài khoản A. Điều này có nghĩa là kết nối từ execute-api VPC endpoints đã bị từ chối. Để cho phép truy cập từ tài khoản B, hãy thêm vpce-9z8y7x6w vào resource policy. Liên quan tới documentation để tìm hiểu về điều kiện keys khác bạn có thể sử dụng trong API Gateway resource policies.

Để biết thêm chi tiết cách VPC links hoạt động, đọc  Understanding VPC links in Amazon API Gateway private integrations.

Các phần sau đây bao gồm ba mẫu kiến trúc tới sử dụng API Gateway private endpoints cros-account:

  1. Regional API Gateway tới private API Gateway
  2. Lambda function gọi API Gateway ở tài khoản khác
  3. Container microservice gọi API Gateway ở tài khoản khác sử dụng mTLS

Regional API Gateway tới private API Gateway cross-account

Khi xây dựng microservices trong các tài khoản AWS khác nhau, private API Gateway endpoints thường được sử dụng để cho phép giao tiếp giữa service-to-service. Thỉnh thoảng một phần của endpoints phải được công khai cho người dùng cuối sử dụng. Một mẫu cho việc này là có một API Gateway công khai trung tâm, hoạt động như cửa trước cho nhiều điểm cuối API Gateway riêng tư. Điều này cho phép quản trị trung tâm về xác thực, ghi nhật ký và giám sát.

Theo dõi biểu đồ cho thấy cách đạt được điều này bằng cách sử dụng VPC link. VPC links cho phép bạn kết nối các tích hợp API Gateway với tài nguyên riêng tư bên trong VPC. API Gateway VPC interface endpoints là tài nguyên VPC bạn muốn kết nối tới, như là định tuyến lượng truy cập tới private API Gateway endpoints trong các tài khoản AWS khác.  

API Gateway Regional endpoint consuming API Gateway private endpoints cross-account

VPC link yêu cầu sử dụng Network Load Balancer (NLB). Mục đích nhóm của NLB trỏ tới địa chỉ IP private của VPC endpoint, thông thường là 1 địa chỉ cho mỗi Availability Zone. Mục đích của nhóm health check phải xác nhận rằng dịch vụ API Gateway đang trực tuyến. Bạn có thể sử dụng đường dẫn /ping dành riêng cho API Gateway cho việc này, đường dẫn này trả về trạng thái HTTP mã 200 khi dịch vụ hoạt động bình thường.

Bạn có thể triển khai mẫu này trong tài khoản của bạn sử dụng ví dụ mẫu CDK code được tìm GitHub.

Lambda function gọi private API Gateway cross-account

Các yêu cầu phổ biến khác là cho phép AWS Lambda functions được kích hoạt các API Gateway endpoints cross-account. Điều này cho phép giao tiếp giữa service-to-service trong kiến trúc microservice.

Theo dõi kiến trúc cho thấy cách đạt được điều này bằng cách sử dụng interface endpoints for Lambda, cho phép truy cập tới nguồn tài nguyên riêng tư bên trong VPC của bạn. Điều này cho phép Lambda truy cập vào API Gateway VPC endpoint và do đó, private API Gateway endpoints trong tài khoản khác.

Consuming API Gateway private endpoints from Lambda cross-account

Không giống như ví dụ trước, ở đây không có NLB hoặc VPC link được yêu cầu. Resource policy trên private API Gateway phải cho phép truy cập từ VPC endpoint trong tài khoản nơi có Lambda function sử dụng.

Vì Lambda function được đính kèm với VPC, nó sẽ sử dụng DNS quyết định từ bên trong VPC. Điều này có nghĩa nếu bạn đã chọn bật lựa chọn Private DNS Name khi tạo interface VPC endpoint bởi API Gateway https://{restapi-id}.execute-api.{region}.amazonaws.com endpoint sẽ tự động phân giải các địa chỉ IP private. Lưu ý rằng cấu hình DNS đó có thể chặn truy cập từ Regional và edge-optimized API endpoints từ bên trong VPC. Để biết thêm thông tin, tham khảo tới knowledge center article.

Bạn có thể triển khai mẫu này trong tài khoản AWS của bạn sử dụng CDK code mẫu tìm trên GitHub.

Gọi private API Gateway cross-account với TLS (mTLS) chung

Khách hàng hoạt động trong các ngành được quản lý nghiêm ngặt, như ngân hàng mở, phải thường thực hiện mutual TLS(mTLS) để truy cập vào APIs của họ một cách an toàn. Nó cũng rất tốt cho các ứng dụng Internet of Things(IoT) để xác thực thiết bị sử dụng chứng chỉ kỹ thuật số

Mutual TLS (mTLS) verifies both the client and server via certificates with TLS

Regional API Gateway có native support for mTLS nhưng hiện nay private API Gateway không hỗ trợ mTLS, nên bạn phải terminate mTLS trước API Gateway. Một kiểu là để thực thi dịch vụ proxy trong tài khoản nhà sản xuất giải quyết bắt tay mTLS, terminates mTLS, và các proxy yêu cầu tới private API Gateway qua HTTPS thông thường.

Theo dõi biểu đồ cho thấy cách sử dụng kết hợp của PrivateLink, proxy dựa trên NGINX, và private API Gateway để thực hiện mTLS và sử dụng private API trên nhiều tài khoản.

Consuming API Gateway private endpoints cross-account with mTLS

Trong biểu đồ kiến trúc này, Amazon ECS Fargate được sử dụng để lưu trữ tác vụ container chạy máy chủ proxy NGINX. Proxy này xác thực chứng chỉ được truyền bởi client kết nối trước khi chuyển qua kết nối tới API Gateway thông qua execute-proxy VPC endpoint. Cấu hình NGINX mẫu sau đây cho thấy cách dịch vụ mTLS proxy làm việc bằng cách sử dụng cài đặt ssl_verify_client và ssl_client_certificate để xác thực chứng chỉ của client kết nối, và proxy_pass chuyển tiếp yêu cầu sang API Gateway.

nginx

server {    listen 443 ssl;
    ssl_certificate     /etc/ssl/server.crt;    ssl_certificate_key /etc/ssl/server.key;    ssl_protocols       TLSv1.2;    ssl_prefer_server_ciphers on;    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
    ssl_client_certificate /etc/ssl/client.crt;    ssl_verify_client      on;
    location / {        proxy_pass https://{api-gateway-endpoint-api};    }}

server {

    listen 443 ssl;

    ssl_certificate     /etc/ssl/server.crt;

    ssl_certificate_key /etc/ssl/server.key;

    ssl_protocols       TLSv1.2;

    ssl_prefer_server_ciphers on;

    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

    ssl_client_certificate /etc/ssl/client.crt;

    ssl_verify_client      on;

    location / {

        proxy_pass https://{api-gateway-endpoint-api};

    }

}

Kết nối client phải cung cấp chứng chỉ trước khi kết nối tới API thông qua dịch vụ VPC endpoints:

bashcurl –key client.key –cert client.crt –cacert server.crt https://{vpc-endpoint-service-url}

bash

curl –key client.key –cert client.crt –cacert server.crt https://{vpc-endpoint-service-url}

Sử dụng VPC security group rules trên cả VPC endpoint và proxy NGINX để ngăn chặn client bỏ qua mTLS endpoint và kết nối thẳng tới API Gateway endpoint.

Đây là ví dụ cấu hình NGINX và Dockerfile để cấu hình giải pháp này trên GitHub repository.

Kết luận

Bài viết này khám phá 3 giải pháp sử dụng private API Gateway trên các tài khoản AWS accounts. Thành phần chính của các giải pháp là VPC interface endpoint. Bằng cách sử dụng VPC Endpoints & PrivateLink, bạn có thể sử dụng nguồn tài nguyên một cách an toàn và thậm chí các microservice của bạn trên các tài khoản AWS. Để biết thêm chi tiết hơn, đọc Enabling New SaaS Strategies with AWS PrivateLink. Thăm GitHub repository để bắt đầu thực hiện 1 trong 3 giải pháp hôm nay.

Thêm tài nguyên học tập serverless, thăm Serverless Land.

Bài viết được dịch dựa vào bài viết gốc ở đây