aws-samples/sample-bedrock-agentcore-waf-patterns

GitHub: aws-samples/sample-bedrock-agentcore-waf-patterns

为 Amazon Bedrock AgentCore Runtime 提供 AWS WAF 防护的两种架构参考模式及配套示例代码。

Stars: 1 | Forks: 1

# 使用 AWS WAF 保护 Amazon Bedrock AgentCore Runtime 伴随 AWS 博客文章 **"Securing Amazon Bedrock AgentCore Runtime with AWS WAF"** 发布的示例代码。 本仓库包含两种架构模式经过测试的构件,这两种模式将 AWS WAF 置于 Amazon Bedrock AgentCore Runtime 之前: - **模式 1**:ALB → Lambda 代理 → VPC Endpoint → AgentCore(完全的请求控制;Lambda 跳转会增加一些延迟) - **模式 2**:ALB → VPC Endpoint ENI → AgentCore(组件更少,没有额外的计算跳转) 这两种模式都使用挂载了 WAF 的面向互联网的 ALB,通过 VPC Interface Endpoint 路由到 `com.amazonaws..bedrock-agentcore` 数据平面,并需要 AgentCore 资源策略来关闭直接访问的后门。 ## ⚠️ 免责声明 这是**仅供演示和教育目的的示例代码。未经进一步审查、强化和安全测试,不适用于生产环境。**本仓库中的构件用于演示随附博客文章中描述的架构模式,尚未经过正式的应用安全审查。在部署任何代码之前,您有责任根据自身的安全、合规性和运营要求对其进行评估,执行适当的测试,并使其适应您的环境。所有占位符值(账户 ID、ARN、VPC Endpoint ID、子网和安全组 ID、DNS 名称)必须替换为您自己的值。 ## 此示例涵盖的内容(以及未涵盖的内容) **已涵盖:** - 针对 AgentCore Runtime 的两种 WAF + ALB + VPC Endpoint 集成模式 - 参考 Lambda SigV4 代理、IAM 策略、AgentCore 资源策略模板、示例 WAFv2 WebACL 以及调用示例 **未涵盖 — 您在生产前需承担的责任:** - 强化示例。IAM 策略、WAF 规则和安全组只是最低限度的起点,并非完整的生产基准。 - TLS 证书置备 (ACM)、DNS 以及完整的 ALB/监听器创建,这些仅在概念上进行了描述,并未编写完整的脚本。 - WAF 规则调优(托管规则组、速率阈值)、日志记录和可观测性、告警以及成本控制。 - 生产变更管理、多账户和多区域考虑因素以及灾难恢复。 - 在进行任何生产部署之前,进行独立的安全测试和应用安全审查。 ## 仓库结构 ``` . ├── README.md (this file) ├── lambda/ │ ├── sigv4_proxy.py Lambda code for Pattern 1 (signs requests, forwards to VPCE) │ ├── sigv4_proxy-config.json Lambda config (VPC, env vars, runtime) │ └── health_test_target.py Stub Lambda used for ALB health-check testing ├── iam/ │ ├── lambda-role-trust-policy.json Trust policy for the Lambda execution role │ ├── lambda-role-policy.json Inline policy granting bedrock-agentcore:InvokeAgentRuntime │ └── agentcore-runtime-resource-policy.json Resource policy template (deny-direct-access) ├── waf/ │ └── agentcore-waf-webacl.json Sample WAFv2 WebACL (rate-based rule) └── examples/ ├── invoke_sigv4.py Python client invoking via ALB with SigV4 ├── invoke_oauth.sh curl example invoking via ALB with Cognito JWT └── verify_resource_policy.sh Verification: direct call should be denied, ALB should pass ``` ## 快速部署(模式 2 — 最简单) ``` REGION=us-east-1 VPC_ID=vpc-xxxxxxxx PRIVATE_SUBNETS="subnet-aaaa subnet-bbbb" ALB_SG=sg-xxxxxxxx # ALB security group VPCE_SG=sg-yyyyyyyy # VPC endpoint security group (allow 443 from ALB_SG) RUNTIME_ARN=arn:aws:bedrock-agentcore:${REGION}::runtime/ # 1. 创建 VPC Endpoint aws ec2 create-vpc-endpoint \ --vpc-id ${VPC_ID} \ --service-name com.amazonaws.${REGION}.bedrock-agentcore \ --vpc-endpoint-type Interface \ --subnet-ids ${PRIVATE_SUBNETS} \ --security-group-ids ${VPCE_SG} \ --region ${REGION} VPCE_ID=vpce-xxxxxxxx # 2. 获取 ENI IP ENIS=$(aws ec2 describe-vpc-endpoints --vpc-endpoint-ids ${VPCE_ID} \ --region ${REGION} --query 'VpcEndpoints[0].NetworkInterfaceIds' --output text) IPS=$(aws ec2 describe-network-interfaces --network-interface-ids ${ENIS} \ --region ${REGION} --query 'NetworkInterfaces[].PrivateIpAddress' --output text) # 3. 创建不需要身份验证的健康检查 IP target group aws elbv2 create-target-group \ --name agentcore-vpce-tg \ --target-type ip --protocol HTTPS --port 443 \ --vpc-id ${VPC_ID} \ --health-check-protocol HTTPS --health-check-port 443 --health-check-path / \ --matcher HttpCode=200-499 \ --region ${REGION} # 4. 将 IP 注册为 targets TG_ARN=arn:aws:elasticloadbalancing:...:targetgroup/agentcore-vpce-tg/... for IP in ${IPS}; do aws elbv2 register-targets --target-group-arn ${TG_ARN} \ --targets Id=${IP},Port=443 --region ${REGION} done # 5. 创建 ALB + HTTPS listener(带有 ACM cert),附加 WAF(参见 waf/agentcore-waf-webacl.json) # 6. 应用 AgentCore resource policy(关闭后门) sed -e "s||${RUNTIME_ARN}|g" \ -e "s||${VPCE_ID}|g" \ iam/agentcore-runtime-resource-policy.json > /tmp/policy.json aws bedrock-agentcore-control put-resource-policy \ --resource-arn ${RUNTIME_ARN} \ --policy file:///tmp/policy.json \ --region ${REGION} ``` ## 快速部署(模式 1 — Lambda 代理) 与模式 2 的 VPC Endpoint 设置相同。然后执行: ``` # 1. 从 lambda/sigv4_proxy.py 创建 Lambda(在 VPC 中 zip + deploy,附加 lambda-role-policy.json) cd lambda && zip sigv4_proxy.zip sigv4_proxy.py aws lambda create-function \ --function-name agentcore-sigv4-proxy \ --runtime python3.12 --handler sigv4_proxy.lambda_handler \ --role arn:aws:iam:::role/agentcore-proxy-lambda-role \ --zip-file fileb://sigv4_proxy.zip \ --vpc-config SubnetIds=${PRIVATE_SUBNETS// /,},SecurityGroupIds=${LAMBDA_SG} \ --environment "Variables={AGENTCORE_ENDPOINT=https://${VPCE_DNS}}" \ --timeout 30 --memory-size 256 --region ${REGION} # 2. 创建 Lambda target group,注册该函数,并将其附加到 ALB listener # 3. 附加相同的 WAF WebACL # 4. 应用 AgentCore resource policy(与 Pattern 2 相同) ``` ## 关键配置说明 - **VPC Endpoint 服务**:使用 `com.amazonaws..bedrock-agentcore`(数据平面)。`bedrock-agentcore.gateway` endpoint 仅适用于 AgentCore Gateway。 - **ALB 目标组健康检查(模式 2)**:使用路径 `/` 并搭配匹配器 `200-499`。AgentCore 在 `/` 路径上会返回 404,因为它不是有效的 API 路径,但 404 仍然表明 VPCE 是可达的。 - **身份验证方法**:每个 runtime 使用一种方法。如果 runtime 配置了 OAuth authorizer,SigV4 将被拒绝。 - **Cognito client_credentials 授权**:JWT 包含 `client_id` 声明,没有 `aud`。请使用 `allowedClients`(匹配 `client_id`)而不是 `allowedAudience` 来配置 AgentCore OAuth authorizer。 ## 纵深防御层 | 层级 | 保护 | |-------|------------| | AWS WAF | 速率限制、SQLi、XSS、机器人控制 | | ALB 安全组 | 仅允许来自授权源的 HTTPS 443 | | VPC Endpoint 安全组 | 入站 443 仅限 ALB SG 访问 | | AgentCore 身份验证 | 每次调用都需要 SigV4 或 OAuth | | AgentCore 资源策略 | 拒绝所有非来自您的 VPC Endpoint 的访问 | | VPC Endpoint 策略(可选) | 进一步限制特定的 IAM 主体/操作 | ## 清理 为避免持续收费,请按相反的依赖顺序删除您创建的资源: **警告:**其中几个步骤会永久删除资源和配置。删除 AgentCore Runtime 将移除所有代理配置,而删除 Amazon Cognito User Pool 将移除所有用户和应用客户端。这些操作无法撤销。在继续操作之前,请备份所需的任何配置。 ``` # 1. 从 AgentCore Runtime 中移除 resource policy aws bedrock-agentcore-control delete-resource-policy --resource-arn ${RUNTIME_ARN} --region ${REGION} # 2. 从 ALB 解除关联 WAF WebACL aws wafv2 disassociate-web-acl --resource-arn ${ALB_ARN} --region ${REGION} # 3. 删除 ALB listener aws elbv2 delete-listener --listener-arn ${LISTENER_ARN} --region ${REGION} # 4. 删除 ALB target groups aws elbv2 delete-target-group --target-group-arn ${TG_ARN} --region ${REGION} # 5. 删除 Lambda 代理函数(仅限 Pattern 1) aws lambda delete-function --function-name ${FUNCTION_NAME} --region ${REGION} # 6. 删除 Application Load Balancer aws elbv2 delete-load-balancer --load-balancer-arn ${ALB_ARN} --region ${REGION} # 7. 删除 VPC Interface Endpoint aws ec2 delete-vpc-endpoints --vpc-endpoint-ids ${VPCE_ID} --region ${REGION} # 8. 删除 ALB security group aws ec2 delete-security-group --group-id ${ALB_SG_ID} --region ${REGION} # 9. 删除 VPC Endpoint security group aws ec2 delete-security-group --group-id ${VPCE_SG_ID} --region ${REGION} # 10.(可选)如果为测试而创建,请删除 AgentCore Runtime # 这将永久移除所有 agent 配置。 aws bedrock-agentcore-control delete-agent-runtime --agent-runtime-id ${RUNTIME_ID} --region ${REGION} # 11.(可选)如果为 OAuth 测试而创建,请删除 Cognito User Pool # 这将永久移除所有 users 和 app clients。 aws cognito-idp delete-user-pool --user-pool-id ${USER_POOL_ID} --region ${REGION} ``` ## 生产环境注意事项 ### VPCE ENI IP 稳定性(模式 2) 模式 2 将 VPC Endpoint ENI 私有 IP 直接注册到 ALB 目标组中。如果重新创建 endpoint(例如,在基础设施更新或账户迁移期间),这些 IP 可能会更改。在生产环境中,不要依赖静态 IP 注册。可选方案: - 在 VPC endpoint 生命周期事件上使用 Amazon EventBridge 规则触发 Lambda 自动重新注册目标。 - 将 Network Load Balancer 与 VPC endpoint 服务集成(完全避免原始 IP 定位)。 - 实施目标组健康检查,并自动替换不健康的目标。 ### 生产部署的推荐日志记录 此示例未配置日志记录或可观测性(它是演示代码)。对于生产部署,请启用以下内容: - **AWS WAF 日志记录:**将评估的请求(允许和阻止的)发送到 Amazon S3 或 Amazon CloudWatch Logs 以进行安全分析。 - **ALB 访问日志:**将访问日志启用到 S3 存储桶以进行连接级别的审计。 - **Lambda CloudWatch Logs(模式 1):**代理 Lambda 仅记录状态码和通用错误消息。它不会记录请求标头、Authorization token、x-amz-security-token 值或请求/响应正文。请根据您的合规性要求设置日志保留策略。 - **AWS CloudTrail:**捕获控制平面 API 调用(CreateWebACL、UpdateRule、InvokeAgentRuntime 等)。 - **AgentCore Runtime 可观测性:**如果使用 AgentCore 的内置追踪功能,追踪和指标将自动发送到 Amazon CloudWatch。 ### Lambda 日志中的凭证安全 Lambda 代理 (`lambda/sigv4_proxy.py`) 旨在防止凭证泄露: - 只有两个 `print()` 语句,用于记录状态码和通用错误消息。 - 处理程序的 `event` 参数(包含来自 ALB 的入站请求标头,包括任何 Authorization 标头)从不被记录。 - SigV4 凭证在内存中构建并直接用于出站请求;它们不会被写入任何日志。 为了实现纵深防御,请在生产环境中将 Lambda 日志级别设置为 WARN 或 ERROR,并考虑启用 CloudWatch Logs 数据保护策略以自动掩码凭证模式。 ## 许可证 MIT-0
标签:Amazon Bedrock, AWS, DPI, SecOps, WAF, 云安全架构, 网络访问控制, 逆向工具