完全指南)
Envoy AWS Request Signing 过滤器的凭证提供者链Credentials Provider Chain完全指南【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy导读在 Envoy 中AWS Request Signing 过滤器envoy.filters.http.aws_request_signing用于为发往 AWS 服务的请求自动计算并注入 SigV4/SigV4A 签名其签名密钥来源于一套可配置的AWS 凭证提供者链AWS Credentials Provider Chain。本文以仓库中的 aws_credentials.rst 为核心系统讲解该过滤器的凭证获取顺序、各级提供者的实现细节、顺序覆盖与自定义链的配置方法以及相关统计指标同时结合 credential_provider.proto 与示例配置帮助读者在生产环境中准确配置 AWS 请求签名能力。读完本文你将能够理解默认凭证链的完整搜索顺序与缓存语义、通过credential_provider字段覆盖或重建凭证链、并为 EC2/ECS/EKS 等容器与实例场景正确落地配置。凭证获取的总览默认链与两种介入方式AWS Request Signing 过滤器使用多种凭证提供者来获取 AWS access key ID、AWS secret access key 与可选的 AWS session token。默认情况下过滤器按下文描述的固定顺序依次尝试各个提供者一旦某个提供者返回了 access key ID 和 secret access keysession token 可选即停止继续向下搜索。这一默认行为可以通过过滤器配置中的credential_provider字段以两种方式介入修改默认链modify在custom_credential_provider_chain为false默认值时配置中给出的提供者设置作为对默认凭证提供者链的修饰器用于覆盖默认链中对应提供者的环境变量、凭证参数与文件位置等细节自定义链custom在custom_credential_provider_chain为true时创建一个只包含配置中指定提供者设置的全新凭证链默认链被整体禁用。上述两个字段定义在 credential_provider.proto 的AwsCredentialProvider消息中注释明确写道If set to TRUE, the credential provider chain that is created contains only those set in this credential provider message. If set to FALSE, the settings provided here will act as modifiers to the default credential provider chain. Defaults to FALSE.设为 TRUE 时仅包含配置中指定的提供者设为 FALSE 时作为默认链的修饰器默认 FALSE。此外AwsCredentialProvider还声明了以下可配置的提供者类型对应 proto 中的字段号proto 字段提供者类型可配置参数inline_credential内联凭证access_key_id、secret_access_key必填、session_token可选assume_role_with_web_identity_providerAssumeRoleWithWebIdentityweb_identity_token_data_source、role_arn、role_session_namecredentials_file_provider凭证文件credentials_data_source、profileconfig_credential_providerAWS 配置文件无参数—container_credential_provider容器凭证无参数—environment_credential_provider环境变量无参数—instance_profile_credential_providerEC2 实例配置文件无参数—assume_role_credential_providerSTS AssumeRole角色链role_arn、role_session_name、external_id、session_duration、内嵌credential_provideriam_roles_anywhere_credential_providerIAM Roles Anywhererole_arn、certificate、certificate_chain、private_key、trust_anchor_arn、profile_arn、role_session_name、session_duration注意proto 中的字段顺序inline、assume_role_with_web_identity、credentials_file、config、container、environment、instance_profile、assume_role、iam_roles_anywhere与默认链的搜索顺序并不一致。默认搜索顺序由过滤器内部实现决定详见下文默认凭证提供者顺序一节。默认凭证链的 6 级搜索顺序默认情况下过滤器按下述顺序逐级尝试获取凭证1. inline_credentials 内联凭证最高优先级如果配置了inline_credential字段则不会使用任何其他提供者——整条链被直接短路。在 credential_provider.proto 中注释为If inline credential is provided, no chain will be created and only the inline credential will be used.InlineCredentialProvider消息credential_provider.proto等价于设置AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY及可选的AWS_SESSION_TOKEN环境变量其中access_key_id与secret_access_key均要求min_len: 1非空校验且secret_access_key与session_token被标记为敏感字段sensitive注解在日志与调试输出中会被脱敏。2. credential_provider 字段的覆盖能力过滤器配置的credential_provider字段即上文所述的两类介入方式可以覆盖默认提供者、环境变量、凭证参数与文件位置。当配合custom_credential_provider_chain: true时将创建仅含指定提供者的自定义链。具体配置示例见 aws-request-signing-filter-credential-provider-config.yaml 与 aws-request-signing-filter-assumeroleprovider.yaml。3. 环境变量读取标准 AWS 环境变量AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY与AWS_SESSION_TOKEN。该提供者对应 proto 中的environment_credential_provider空消息无任何可配置参数列出它即可在自定义链中启用。4. AWS 凭证文件若设置了AWS_SHARED_CREDENTIALS_FILE与AWS_PROFILE环境变量则优先使用否则回退到文件~/.aws/credentials与default配置节使用配置节中定义的aws_access_key_id、aws_secret_access_key、aws_session_token字段该类凭证缓存 1 小时。在 proto 中对应credentials_file_provider额外支持credentials_data_source从 Envoy DataSource 读取凭证文件与profile指定配置节缺省为 default详见 credential_provider.proto。注意当通过watched_directory配置监视目录后一旦检测到文件移动file move凭证文件会被重新读取实现凭证的滚动更新。5. AssumeRoleWithWebIdentitySTS Web 身份该提供者向 AWS Security Token Service 发起AssumeRoleWithWebIdentityAPI 调用通过AWS_WEB_IDENTITY_TOKEN_FILE环境变量指向的文件读取WebIdentityToken通过AWS_ROLE_ARN环境变量读取 role ARN若配置了credential_provider则可在assume_role_with_web_identity_provider中直接指定role_arn、web_identity_token_data_source与role_session_name字段取代环境变量方式返回结果中提取AccessKeyId、SecretAccessKey、SessionToken字段凭证缓存 1 小时或直到其过期取决于返回的Expiration字段。文件轮换token rotation自动感知assume_role_with_web_identity_provider会自动监视所配置的 web identity token 文件所在目录若未显式设置watched_directory则从 token 文件的目录自动推断因此当 token 文件被轮换时新 token 会被拾取。即使发生文件轮换当前凭证仍会继续使用直到过期过期后再用新 token 获取新凭证。这一点在 credential_provider.proto 中也有对应说明This behaviour differs from the standard envoy data source behavior, which does not automatically watch the directory of a file data source.STS 静态集群为获取凭证Envoy 会创建一个名为sts_token_service_internal-region的静态集群指向区域化 AWS Security Token Service。SigV4A 下的 STS 集群主机选择signing_algorithm: AWS_SIGV4A时生效如果region来自 profile、环境变量或内联配置被配置为 SigV4A 区域集region set且第一个区域包含通配符标准端点sts.amazonaws.comFIPS 端点sts-fips.us-east-1.amazonaws.com否则使用区域端点sts.first-region.amazonaws.comAWS 其他分区如中国区或 GovCloud提示使用 SigV4A 签名时若需访问中国区如cn-northwest-1、GovCloud 等分区请将第一个 SigV4A 区域设置为不含通配符的具体区域以便正确选择区域端点。6. 实例元数据EC2 / ECS / EKS Pod Identity最后一级尝试从计算实例的元数据服务获取凭证EC2 instance metadata使用字段AccessKeyId、SecretAccessKey、Token凭证缓存 1 小时ECS task metadata使用字段AccessKeyId、SecretAccessKey、Token凭证缓存 1 小时或直到过期依据Expiration字段EKS Pod Identity环境变量AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE指向容器内挂载的文件其中包含发送给 EKS Pod Identity Agent 的Authorization头所需字符串。使用字段AccessKeyId、SecretAccessKey、Token凭证缓存 1 小时或直到过期。两种凭证获取方式当前实现支持两种元数据获取方式——HTTP async client新推荐libcurllegacy 兼容。必须配置静态集群要从 EC2 或 ECS 获取凭证必须在配置中指定指向凭证提供者的静态集群EC2集群名ec2_instance_metadata_server_internalECS集群名ecs_task_metadata_server_internal这些静态集群自动托管若 bootstrap 配置中未指定会自动添加即使在envoy.reloadable_features.use_http_client_to_fetch_aws_credentials被禁用时也会创建以确保后续将该 reloadable feature 置为true启用 HTTP client 获取凭证时集群配置已就绪。默认凭证提供者顺序Credential Provider Ordering默认情况下凭证提供者按以下顺序被依次搜索inline_credential内联凭证environment_credential_provider环境变量credentials_file_provider凭证文件assume_role_credential_providerSTS AssumeRole 角色链assume_role_with_web_identity_providerWeb 身份container_credential_provider容器凭证ECSinstance_profile_credential_provider实例配置文件EC2通过credential_provider字段可以只启用部分提供者或覆盖任意可配置提供者的设置。assume_role 提供者的特殊性assume_role_credential_provider是一个特例——它自己拥有一个内嵌的credential_provider字段。原因在于该提供者本身需要先获得一组凭证来完成sts:AssumeRole调用。默认情况下其内嵌提供者的搜索顺序与上述默认顺序相同除非你选择覆盖其中的提供者与设置。相关消息定义见 credential_provider.proto其中role_arn必填external_id、role_session_name可选session_duration的取值范围为 900 秒5 分钟至 43200 秒12 小时未提供时由 AWS 端按 IAM AssumeRole 默认时长表 决定。另外内嵌credential_provider的提供者列表中不允许再出现 assume_role 提供者若出现则会被忽略防止无限递归的角色链。注意proto 中assume_role_credential_provider在字段编号上是 10 号而默认链将其排在第 4 位再次说明字段编号 ≠ 搜索优先级默认顺序以本节的编号 1–7 为准。从源码实现看默认链的构建位于 credential_provider_chains.cc其中通过singletonManager().getTypedAwsClusterManagerImpl管理 STS/元数据静态集群见该文件第 112–115 行附近并分别创建ContainerCredentialsProvider与InstanceProfileCredentialsProvider第 324 行、第 356 行附近与文档描述的容器/实例提供者一一对应。自定义链配置实操两份官方示例示例一仅使用凭证文件并监视目录变更以下配置来自 aws-request-signing-filter-credential-provider-config.yaml演示了用custom_credential_provider_chain: true关闭默认链、仅启用凭证文件提供者并通过watched_directory让过滤器在凭证文件变化时自动重载http_filters: - name: envoy.filters.http.aws_request_signing typed_config: type: type.googleapis.com/envoy.extensions.filters.http.aws_request_signing.v3.AwsRequestSigning credential_provider: custom_credential_provider_chain: true credentials_file_provider: credentials_data_source: filename: /tmp/a watched_directory: path: /tmp service_name: vpc-lattice-svcs region: * signing_algorithm: AWS_SIGV4A use_unsigned_payload: true match_excluded_headers: - prefix: x-envoy - prefix: x-forwarded - exact: x-amzn-trace-id要点解读custom_credential_provider_chain: true整条默认链被禁用链中仅包含下面列出的credentials_file_providercredentials_data_source.filename: /tmp/a从/tmp/a读取 AWS 凭证格式文件watched_directory.path: /tmp监视/tmp目录检测到文件移动如轮换写入时重新读取凭证文件signing_algorithm: AWS_SIGV4Aregion: *使用通配区域集简化多区域配置。示例二通过 AssumeRole 实现角色链以下配置来自 aws-request-signing-filter-assumeroleprovider.yaml演示了 assume_role 提供者及其内嵌凭证链的用法——先以 EC2 实例配置文件凭证签署sts:AssumeRole请求再以换取的角色凭证对外签名http_filters: - name: envoy.filters.http.aws_request_signing typed_config: type: type.googleapis.com/envoy.extensions.filters.http.aws_request_signing.v3.AwsRequestSigning credential_provider: custom_credential_provider_chain: true assume_role_credential_provider: role_arn: arn:aws:iam::12345678:role/testassume credential_provider: custom_credential_provider_chain: true instance_profile_credential_provider: {} service_name: vpc-lattice-svcs region: ap-southeast-2 signing_algorithm: AWS_SIGV4 use_unsigned_payload: true match_excluded_headers: - prefix: x-envoy - prefix: x-forwarded - exact: x-amzn-trace-id要点解读外层assume_role_credential_provider指定目标角色role_arn其内嵌credential_provider声明仅使用instance_profile_credential_provider空消息无参数来签署 AssumeRole 请求——这正好印证了上文assume_role 提供者自己拥有内嵌 credential_provider的特殊设计若内嵌credential_provider未设置则按默认链顺序环境变量 → 凭证文件 → …获取签署 AssumeRole 请求所需的凭证。过滤器基础配置速览在进入统计指标之前补充过滤器的最简配置来自 aws-request-signing-filter.yaml便于对照理解上文各字段的上下文http_filters: - name: envoy.filters.http.aws_request_signing typed_config: type: type.googleapis.com/envoy.extensions.filters.http.aws_request_signing.v3.AwsRequestSigning service_name: s3 region: us-west-2 use_unsigned_payload: true match_excluded_headers: - prefix: x-envoy - prefix: x-forwarded - exact: x-amzn-trace-idservice_name签名所针对的 AWS 服务名如s3、vpc-lattice-svcsregionSigV4 目标区域若使用 SigV4A 则作为区域集region set支持逗号分隔与通配符如us-east-*甚至*use_unsigned_payload: true不对请求体缓冲计算 payload hash适合 S3 等允许 unsigned payload 的服务默认为false此时超过缓冲区限制的请求会收到 413 响应match_excluded_headers从签名中排除的请求头常用于排除可能在重试等场景中发生变化的头x-forwarded-for、x-forwarded-proto、x-amzn-trace-id默认始终被排除。关于凭证相关的更完整过滤器语义可进一步阅读 AWS Request Signing 过滤器文档其中包含头部修改行为Header Modificationauthorization头被替换为计算出的 SigV4/SigV4A 值x-amz-security-token被移除或按 session token 替换x-amz-date被替换为当前日期使用 SigV4A 时x-amz-region-set被替换查询串签名query string signing签名放入查询串而非头部附带expiration_time默认 5 秒、最大 3600 秒URL 在此时间内可重放建议尽量取小值上游 HTTP 过滤器用法upstream filter由于签名基于 host/URL/payload 计算若 Envoy 在签名后还会修改这些字段会导致签名失效因此可将该过滤器配置在 cluster 的http_filters链中作为转发前签名的最后一步。统计指标Statistics凭证相关统计输出在aws.metadata_credentials_provider命名空间下其中provider_cluster为实际的提供者集群名如 STS 集群sts_token_service_internal-region、ec2_instance_metadata_server_internal、ecs_task_metadata_server_internal名称类型描述provider_cluster.credential_refreshes_performedCounter该集群执行的凭证刷新总次数provider_cluster.credential_refreshes_failedCounter该集群凭证刷新失败的总次数。例如 WebIdentity token 过期时会自增provider_cluster.credential_refreshes_succeededCounter该集群凭证刷新成功的总次数。成功刷新意味着有可用凭证用于签名provider_cluster.metadata_refresh_stateGauge0 表示集群处于初始刷新状态尚未完成任何成功的凭证刷新。在 0 状态下集群最多每 30 秒尝试一次凭证刷新1 表示集群处于基于凭证过期的正常刷新状态这些指标与 AWS Request Signing 过滤器自身的统计http.stat_prefix.aws_request_signing.*命名空间下的signing_added、signing_failed、payload_signing_added、payload_signing_failed互补前者反映凭证侧的健康度刷新是否成功后者反映签名侧的处理结果。实践要点与排查建议优先内联、慎用默认链生产环境若凭证来源单一推荐用custom_credential_provider_chain: true明确指定提供者避免默认链在多级元数据服务间反复探测可能引入延迟与额外 STS 调用。容器/实例场景必须配置静态集群EC2 需集群名ec2_instance_metadata_server_internal、ECS 需集群名ecs_task_metadata_server_internal虽然未配置时 Envoy 会自动创建但显式声明有助于你通过统计指标定位问题。凭证轮换是自动的凭证文件提供者支持watched_directory监视文件移动Web 身份 token 目录会被自动监视。轮换发生后旧凭证会继续用到过期随后自动用新 token 换发。SigV4A 分区注意中国区 / GovCloud 等非标准分区请将首个 SigV4A 区域写为无通配符的具体区域名如cn-northwest-1确保 STS 端点选择正确。监控三个刷新指标重点关注credential_refreshes_failed与metadata_refresh_state是否长期处于 0初始状态可快速判断凭证链是否真正生效。【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考