本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
從 VPC 存取 AWS Transform Web 應用程式
當您使用 從 VPC 私下 AWS PrivateLink 存取 AWS Transform API 時,Web 應用程式需要額外的網路組態。它透過需要網際網路連線的 CloudFront 提供靜態內容 (HTML、JavaScript、CSS)。Web 應用程式的 API 呼叫會經過您的 VPC 端點,並保持完全私有。
本指南說明如何設定 VPC 的受控網際網路輸出,讓 Web 應用程式可以載入,同時保持 VPC 鎖定在僅必要網域。
運作方式
AWS Transform Web 應用程式使用兩種網路路徑:
-
API 呼叫 – 當您與 Web 應用程式 (啟動任務、檢視工作區等) 互動時,瀏覽器會將 API 請求傳送至
api.transform.。啟用region.on.awscom.amazonaws.VPC 端點和私有 DNS 後,這些請求會解析為 VPC 中的私有 IP 地址,且永遠不會離開 AWS 網路。region.api.transform -
靜態內容 – Web 應用程式的 HTML、JavaScript 和 CSS 檔案會透過 CloudFront 透過 提供
。載入這些檔案需要網際網路連線,因為 CloudFront 內容交付只能透過公有網際網路提供。tenant-id.transform.region.on.aws -
身分驗證 – AWS IAM Identity Center 登入流程使用
,這也需要網際網路連線。region.signin.aws
若要在維護安全性的同時啟用 Web 應用程式,您可以使用 AWS Network Firewall 搭配網域型篩選來建立受控的輸出路徑。這可讓您的 VPC 僅連接 Web 應用程式所需的特定網域,同時封鎖所有其他網際網路流量。
Architecture
下圖顯示 Web 應用程式流量的網路路徑:
EC2 Instance / Workspace (Private Subnet) | | Route: 0.0.0.0/0 → Network Firewall Endpoint v AWS Network Firewall (Firewall Subnet) | Allows: *.cloudfront.net, *.transform.<region>.on.aws, | <region>.signin.aws, SSO domains, S3 presigned URLs | Blocks: everything else (TLS SNI inspection) | | Route: 0.0.0.0/0 → NAT Gateway v NAT Gateway (Public Subnet) | | Route: 0.0.0.0/0 → Internet Gateway v Internet Gateway → CloudFront Edge Locations
重要
Network Firewall 必須查看兩個流量方向 (對稱路由),才能執行 TLS SNI 檢查。您必須在 NAT Gateway 子網路中設定傳回路由,以透過防火牆傳送目的地為私有子網路的流量。否則,網域型篩選規則將無法運作。
先決條件
開始前,請確保您具備以下條件:
-
具有建立 VPC 資源、Network Firewall 和 NAT Gateways 許可 AWS 的帳戶。
-
具有私有子網路的 VPC,執行個體或工作負載會在其中執行。
-
連接至 VPC 的網際網路閘道 (或建立 VPC 的許可)。
-
啟用私有 DNS
com.amazonaws.的 AWS Transform VPC 端點。這是 Web 應用程式瀏覽器用戶端使用的端點。如需建立端點的指示,請參閱 AWS Transform 和介面端點 (AWS PrivateLink)。region.api.transform
設定 VPC 端點政策
如果您的 com.amazonaws. VPC 端點具有自訂端點政策,您必須新增允許 AWS Transform 操作的陳述式。如果沒有此功能,Web 應用程式將無法透過端點進行 API 呼叫。region.api.transform
將下列陳述式新增至您的 VPC 端點政策。將 AWS_TRANSFORM_PROFILE_ARN 取代為您的 AWS Transform 服務設定檔 ARN,您可以在 設定 頁面的 AWS Transform 主控台中找到。
{ "Statement": [ { "Sid": "AllowAWSTransform", "Effect": "Allow", "Principal": "*", "Action": "*", "Resource": "*", "Condition": { "StringEquals": { "aws:PrincipalArn": [ "AWS_TRANSFORM_PROFILE_ARN" ] } } } ] }
注意
如果您的 VPC 端點使用預設政策 (完整存取),則不需要變更,您可以略過此步驟。
設定受控網際網路輸出
完成下列步驟,使用 AWS Transform Web 應用程式的網域型篩選來設定 Network Firewall。
步驟 1:建立防火牆子網路
建立 Network Firewall 端點專用的小型 /28 子網路。此子網路必須與私有子網路位於相同的可用區域。
aws ec2 create-subnet \ --vpc-idyour-vpc-id\ --cidr-blockfirewall-subnet-cidr\ --availability-zoneyour-az\ --regionregion
步驟 2:建立 NAT 閘道的公有子網路
aws ec2 create-subnet \ --vpc-idyour-vpc-id\ --cidr-blockpublic-subnet-cidr\ --availability-zoneyour-az\ --regionregion
步驟 3:設定公有子網路路由表
為將網際網路流量路由到網際網路閘道的公有子網路建立路由表。
# Create route table PUB_RTB=$(aws ec2 create-route-table \ --vpc-idyour-vpc-id\ --regionregion\ --query 'RouteTable.RouteTableId' --output text) # Add default route to internet gateway aws ec2 create-route \ --route-table-id $PUB_RTB \ --destination-cidr-block 0.0.0.0/0 \ --gateway-idyour-igw-id\ --regionregion# Associate with public subnet aws ec2 associate-route-table \ --route-table-id $PUB_RTB \ --subnet-idpublic-subnet-id\ --regionregion
步驟 4:建立 NAT 閘道
# Allocate an Elastic IP EIP=$(aws ec2 allocate-address --domain vpc \ --regionregion--query 'AllocationId' --output text) # Create NAT Gateway in the public subnet NAT_ID=$(aws ec2 create-nat-gateway \ --subnet-idpublic-subnet-id\ --allocation-id $EIP \ --regionregion\ --query 'NatGateway.NatGatewayId' --output text) # Wait for NAT Gateway to become available (~2 minutes) aws ec2 wait nat-gateway-available \ --nat-gateway-ids $NAT_ID --regionregion
步驟 5:建立 Network Firewall 規則群組
建立狀態規則群組,僅允許流量流向 AWS Transform Web 應用程式所需的網域。
aws network-firewall create-rule-group \ --rule-group-name transform-webapp-domains \ --type STATEFUL \ --capacity 100 \ --rule-group '{ "StatefulRuleOptions": { "RuleOrder": "STRICT_ORDER" }, "RulesSource": { "RulesSourceList": { "Targets": [ ".cloudfront.net", ".transform.region.on.aws", "region.signin.aws", ".s3.region.amazonaws.com", "oidc.region.amazonaws.com", "portal.sso.region.amazonaws.com", "assets.sso-portal.region.amazonaws.com", "directory-id.awsapps.com" ], "TargetTypes": ["TLS_SNI", "HTTP_HOST"], "GeneratedRulesType": "ALLOWLIST" } } }' \ --regionregion
將區域取代為安裝設定檔 AWS AWS Transform 的區域 (例如 us-east-1)。將 directory-id 取代為您的 IAM Identity Center 目錄 ID (例如 d-1234567890)。您可以在 IAM Identity Center 主控台中找到目錄 ID。
下表說明允許的網域。
| 網域 | 用途 |
|---|---|
.cloudfront.net |
CloudFront CDN – 提供 Web 應用程式靜態資產 (JavaScript、CSS、映像) |
.transform. |
Web 應用程式租用戶 URL – 瀏覽器會透過 CloudFront 從此網域載入初始頁面 |
|
SSO 登入重新導向頁面 |
.s3. |
S3 預先簽章URLs – 成品上傳和下載 |
oidc. |
SSO 身分驗證的 OIDC 權杖交換 |
portal.sso. |
SSO 入口網站登入頁面 |
assets.sso-portal. |
SSO 入口網站靜態資產 (CSS、JavaScript) |
|
組織的 IAM Identity Center 入口網站 |
注意
萬.cloudfront.net用字元允許任何 CloudFront 分佈的流量,而不只是 AWS Transform Web 應用程式的 。無法縮小網域篩選條件,因為 CloudFront 邊緣 IPs會跨分佈共用,且 TLS SNI 檢查無法區分相同網域後方的個別分佈。
注意
要api.transform.進行 AWS PrivateLink 且不需要網際網路輸出的 API 呼叫。它們不受防火牆影響。region.on.aws
步驟 6:建立防火牆政策
政策必須使用STRICT_ORDER規則評估搭配 drop_established做為預設動作。這可確保捨棄不符合允許清單的任何流量。
# Get the rule group ARN RG_ARN=$(aws network-firewall describe-rule-group \ --rule-group-name transform-webapp-domains \ --type STATEFUL --regionregion\ --query 'RuleGroupResponse.RuleGroupArn' --output text) # Create the firewall policy aws network-firewall create-firewall-policy \ --firewall-policy-name transform-webapp-policy \ --firewall-policy "{ \"StatelessDefaultActions\": [\"aws:forward_to_sfe\"], \"StatelessFragmentDefaultActions\": [\"aws:forward_to_sfe\"], \"StatefulRuleGroupReferences\": [ { \"ResourceArn\": \"$RG_ARN\", \"Priority\": 1 } ], \"StatefulEngineOptions\": { \"RuleOrder\": \"STRICT_ORDER\" }, \"StatefulDefaultActions\": [\"aws:drop_established\", \"aws:alert_established\"] }" \ --regionregion
步驟 7:建立網路防火牆
# Get the policy ARN FW_POLICY_ARN=$(aws network-firewall describe-firewall-policy \ --firewall-policy-name transform-webapp-policy \ --regionregion\ --query 'FirewallPolicyResponse.FirewallPolicyArn' --output text) # Create the firewall aws network-firewall create-firewall \ --firewall-name transform-webapp-firewall \ --firewall-policy-arn $FW_POLICY_ARN \ --vpc-idyour-vpc-id\ --subnet-mappings SubnetId=firewall-subnet-id\ --regionregion# Wait for the firewall to become READY (3-5 minutes) while true; do STATUS=$(aws network-firewall describe-firewall \ --firewall-name transform-webapp-firewall \ --regionregion\ --query 'FirewallStatus.Status' --output text) echo "Status: $STATUS" if [ "$STATUS" = "READY" ]; then break; fi sleep 15 done
步驟 8:取得防火牆端點 ID
FW_ENDPOINT=$(aws network-firewall describe-firewall \ --firewall-name transform-webapp-firewall \ --regionregion\ --query "FirewallStatus.SyncStates.\"your-az\".Attachment.EndpointId" \ --output text) echo "Firewall endpoint: $FW_ENDPOINT"
步驟 9:設定防火牆子網路路由表
將網際網路繫結流量從防火牆子網路路由到 NAT Gateway。
FW_RTB=$(aws ec2 create-route-table \ --vpc-idyour-vpc-id\ --regionregion\ --query 'RouteTable.RouteTableId' --output text) aws ec2 create-route \ --route-table-id $FW_RTB \ --destination-cidr-block 0.0.0.0/0 \ --nat-gateway-id $NAT_ID \ --regionregionaws ec2 associate-route-table \ --route-table-id $FW_RTB \ --subnet-idfirewall-subnet-id\ --regionregion
步驟 10:更新私有子網路路由表
透過防火牆路由來自私有子網路的所有網際網路繫結流量。
aws ec2 create-route \ --route-table-idprivate-subnet-route-table-id\ --destination-cidr-block 0.0.0.0/0 \ --vpc-endpoint-id $FW_ENDPOINT \ --regionregion
如果預設路由已存在,請使用 replace-route而非 create-route。
步驟 11:新增對稱傳回路由 (必要)
重要
此步驟至關重要。Network Firewall 使用 TLS SNI 檢查,且必須查看 TCP 連線的兩個方向。在 NAT Gateway 子網路的路由表中新增路由,透過防火牆傳送目的地為私有子網路的傳回流量。
aws ec2 create-route \ --route-table-id $PUB_RTB \ --destination-cidr-blockprivate-subnet-cidr\ --vpc-endpoint-id $FW_ENDPOINT \ --regionregion
將 private-subnet-cidr 取代為私有子網路的 CIDR 區塊 (例如 10.0.144.0/20)。
如果沒有對稱路由,防火牆只會看到一個流量方向。TLS 檢查引擎無法從 TLS 交握中擷取伺服器名稱指示 (SNI),而且所有以網域為基礎的規則都將無提示地失敗。
步驟 12:移除 IPv6 預設路由 (如果有)
如果私有子網路路由表具有直接指向網際網路閘道的 IPv6 預設路由 (::/0),它會略過IPv6-capable目的地的防火牆。移除它:
aws ec2 delete-route \ --route-table-idprivate-subnet-route-table-id\ --destination-ipv6-cidr-block ::/0 \ --regionregion
驗證
從私有子網路中的執行個體,驗證組態:
# Should SUCCEED - web application content via CloudFront (allowed) curl -vL --connect-timeout 15 \ 'https://tenant-id.transform.region.on.aws' # Should SUCCEED - API via PrivateLink (does not use firewall) curl -v --connect-timeout 15 \ 'https://api.transform.region.on.aws/' # Should FAIL - non-allowlisted domain (blocked by firewall) curl -v --connect-timeout 15 'https://www.example.com' # Expected: TLS connection error (firewall drops after SNI inspection)
疑難排解
- 防火牆會封鎖對 api.transform 的 API 呼叫
-
網域
api.transform.應透過 VPC 端點解析為私有 IP 地址,且不應到達您的網際網路防火牆。region.on.aws-
確認您已建立
com.amazonaws.端點。region.api.transform -
確認已在端點上啟用私有 DNS:
aws ec2 describe-vpc-endpoints \ --filters "Name=service-name,Values=com.amazonaws.region.api.transform" \ --query 'VpcEndpoints[*].[State,PrivateDnsEnabled]' \ --output table預期的輸出:
available | True
-
- Web 應用程式不會載入 (連線逾時)
-
-
確認私有子網路路由表具有指向防火牆端點的
0.0.0.0/0路由。 -
確認防火牆子網路路由表具有指向 NAT Gateway 的
0.0.0.0/0路由。 -
驗證 NAT 閘道處於
available狀態。
-
- 未允許清單的網域不會遭到封鎖
-
-
檢查指向網際網路閘道的 IPv6
::/0路由。這會略過防火牆。將其移除 (步驟 12)。 -
確認已設定對稱路由。NAT Gateway 子網路路由表必須透過防火牆為私有子網路 CIDR 設定傳回路由 (步驟 11)。
-
驗證防火牆政策使用
STRICT_ORDER搭配drop_established和alert_established做為預設動作。
-
成本考量
| 資源 | 大約成本 |
|---|---|
| Network Firewall | 每個可用區域 ~$0.395/小時 (~$288/月) |
| NAT 閘道 | ~$0.045/小時 (~$33/月) + 資料處理費用 |
| 彈性 IP (公有 IPv4) | ~$0.005/小時 (~$3.60/月) |
| Network Firewall 資料處理 | 0.065 USD/GB |
| NAT Gateway 資料處理 | $0.045/GB |
單一可用區域部署的預估基本成本約為每月 325 美元。對於生產部署,請在私有子網路存在的每個可用區域中部署防火牆、NAT Gateway 和相關聯的子網路。
清除
若要移除本指南建立的所有資源,請以相反順序執行下列命令。將預留位置取代為部署中的資源 IDs。您可以在 AWS 管理主控台中找到這些值,或使用設定步驟中的describe命令。
# Remove return route from NAT Gateway subnet aws ec2 delete-route --route-table-idpub-rtb-id\ --destination-cidr-blockprivate-subnet-cidr\ --regionregion# Remove route from private subnet aws ec2 delete-route \ --route-table-idprivate-subnet-route-table-id\ --destination-cidr-block 0.0.0.0/0 --regionregion# Delete Network Firewall (takes ~5 minutes) aws network-firewall delete-firewall \ --firewall-name transform-webapp-firewall \ --regionregion# Delete firewall policy and rule group aws network-firewall delete-firewall-policy \ --firewall-policy-name transform-webapp-policy \ --regionregionaws network-firewall delete-rule-group \ --rule-group-name transform-webapp-domains \ --type STATEFUL --regionregion# Delete NAT Gateway (wait ~5 minutes for full deletion) aws ec2 delete-nat-gateway --nat-gateway-idnat-gateway-id\ --regionregion# Release Elastic IP aws ec2 release-address --allocation-ideip-allocation-id\ --regionregion# Delete subnets aws ec2 delete-subnet --subnet-idfirewall-subnet-id\ --regionregionaws ec2 delete-subnet --subnet-idpublic-subnet-id\ --regionregion