基于 Credential Access Boundaries 的降级凭证(Downscoping)实战:python-docs-samples 中的受限访问令牌实现

📅 发布时间:2026/10/3 2:14:46
基于 Credential Access Boundaries 的降级凭证(Downscoping)实战:python-docs-samples 中的受限访问令牌实现
示例工程【免费下载链接】python-docs-samplesCode samples used on cloud.google.com项目地址https://gitcode.com/GitHub_Trending/py/python-docs-samples点击查看免费下载本指南以 python-docs-samples 仓库中 auth/downscoping/README.md 为核心系统讲解如何利用 Credential Access BoundariesCAB凭证访问边界生成降级downscoped短时访问令牌并将其注入 Cloud Storage 客户端实现最小权限的只读访问。读完本文你将掌握从定义访问边界规则、生成降级凭证到令牌消费者自动刷新令牌并访问受限对象的完整落地流程以及对应的测试验证方法。什么是 Downscoping 与 Credential Access BoundariesDownscoping 是 IAM 提供的一种凭证最小化机制它允许从高权限的源凭证例如拥有cloud-platform全量作用域的服务账号凭证中派生出权限范围被显式收窄的短时访问令牌。派生令牌的有效期通常为 1 小时且无法进一步扩展权限从而降低凭证泄露带来的影响面。收窄权限的规则由Credential Access BoundariesCAB描述一个 CAB 由若干条AccessBoundaryRule访问边界规则组成每条规则包含三个核心要素available_resource目标资源格式为 IAM 资源全名例如 Cloud Storage 存储桶的//storage.googleapis.com/projects/_/buckets/{bucket_name}available_permissions允许的权限列表支持inRole:roles/xxx或permission:xxx两种形式availability_condition可选的细粒度条件表达式用于进一步限定资源子集例如只允许对象名以特定前缀开头的对象。在生产架构中通常存在两个角色Token Broker令牌经纪人持有高权限源凭证负责按需签发降级令牌并分发给下游Token Consumer令牌消费者只持有降级令牌用它完成受限操作无法越权。仓库中的 snippets.py 将这两个角色分别封装为get_token_from_broker与token_consumer两个函数并在main中串联演示完整链路。环境准备按照 README 的指引运行本示例前需要完成以下三步配置应用默认凭证ADC。代码通过google.auth.default()自动读取 ADC 获取源凭证因此环境必须已配置认证信息。如果你在 Cloud Shell 或 Compute Engine 上运行ADC 已自动就绪本地开发环境可执行gcloud auth application-default login完成登录。安装依赖。进入示例目录并执行pip install -r requirements.txt依赖清单见 auth/downscoping/requirements.txt核心是google-auth2.38.0提供google.auth.downscoped模块与google-cloud-storage2.9.0。设置项目环境变量。将GOOGLE_CLOUD_PROJECT指向你的 GCP 项目 ID更多环境配置细节可参考仓库根目录的 AUTHORING_GUIDE.md。第一步在 Token Broker 侧定义访问边界规则get_token_from_broker(bucket_name, object_prefix)模拟了一个 Token Broker其核心是先构造 CAB 规则。源码中snippets.py通过google.auth.downscoped提供的三个类逐步组装规则# 目标资源整个存储桶 available_resource f//storage.googleapis.com/projects/_/buckets/{bucket_name} # 权限只读查看者角色 available_permissions [inRole:roles/storage.objectViewer] # 条件只允许对象名以指定前缀开头的对象 availability_expression ( resource.name.startsWith(projects/_/buckets/{}/objects/{}).format( bucket_name, object_prefix ) ) availability_condition downscoped.AvailabilityCondition(availability_expression) # 组装单条规则 rule downscoped.AccessBoundaryRule( available_resourceavailable_resource, available_permissionsavailable_permissions, availability_conditionavailability_condition, ) # 组装 Credential Access Boundary credential_access_boundary downscoped.CredentialAccessBoundary(rules[rule])要点说明available_resource使用 IAM 资源全名格式Cloud Storage 的固定前缀为//storage.googleapis.com/projects/_/buckets/其中projects/_是存储服务的全局项目占位符available_permissions使用inRole:前缀引用预定义角色也可改用permission:形式枚举具体权限点availability_expression是 CELCommon Expression Language表达式这里通过resource.name.startsWith(...)把访问范围进一步收窄到对象前缀子集这是实现桶内分片授权的关键多条规则可通过rules[...]同时传入实现更复杂的组合授权。第二步创建降级凭证并刷新令牌规则定义完成后Broker 从 ADC 读取源凭证构造downscoped.Credentials并触发刷新snippets.py# 通过 ADC 获取源凭证 source_credentials, _ google.auth.default() if source_credentials.requires_scopes: source_credentials source_credentials.with_scopes( [https://www.googleapis.com/auth/cloud-platform] ) # 创建降级凭证 downscoped_credentials downscoped.Credentials( source_credentialssource_credentials, credential_access_boundarycredential_access_boundary, ) # 刷新令牌 downscoped_credentials.refresh(requests.Request()) # 将令牌与过期时间交给 Token Consumer access_token downscoped_credentials.token expiry downscoped_credentials.expiry这里的实现细节值得注意若源凭证声明需要 scope如服务账号凭证必须先显式附加cloud-platform全量作用域否则降级凭证无法通过 token exchange 换取新令牌downscoped.Credentials内部会携带 CAB 定义向 STSSecurity Token Service发起 token exchange返回的令牌是短时的expiry字段记录其过期时间Broker 返回(access_token, expiry)二元组这通常意味着令牌将经由安全认证通道如内部 API 或受控消息队列传递给下游消费者仓库注释中也明确说明这是常见生产模式。第三步Token Consumer 侧使用降级令牌token_consumer(bucket_name, object_name)展示了消费者的标准做法snippets.py不直接使用一次性 token/expiry而是通过refresh_handler回调让google.oauth2.credentials.Credentials在令牌过期时自动向 Broker 重新索要新令牌def refresh_handler(request, scopesNone): # 生产环境应由 Token Broker 通过安全认证通道下发令牌 # 此处为演示在本地直接生成降级令牌 return get_token_from_broker(bucket_name, object_prefixobject_name[0:3]) creds credentials.Credentials( None, scopes[https://www.googleapis.com/auth/cloud-platform], refresh_handlerrefresh_handler, ) # 用降级凭证初始化 Cloud Storage 客户端 storage_client storage.Client(credentialscreds) bucket storage_client.bucket(bucket_name) blob bucket.blob(object_name) print(blob.download_as_bytes().decode(utf-8))这一设计带来两点实战价值自动续期消费者侧无需编写任何令牌过期管理代码SDK 检测到令牌过期时会自动调用refresh_handler获取新令牌适合长时间运行的任务前缀级最小权限演示中object_prefixobject_name[0:3]将访问边界收窄到对象名前 3 个字符作为前缀从实现层面印证了即便 Broker 被攻破消费者也只能读到前缀匹配的少数对象。如果业务上允许访问桶内全部对象则可省略该条件。运行示例README 指出直接运行示例需要调用main(bucket_name, object_name)并传入两个参数一个已创建的 Cloud Storage 存储桶名称以及桶内用于测试访问的目标对象名snippets.py 中main会依次打印Testing token consumer read access...与Donefrom snippets import main main(your-bucket-name, your-object-name.txt)运行前请确保桶与对象真实存在且源凭证ADC 主体对该桶拥有读取权限——因为降级令牌的权限以源凭证权限为上限Broker 无法签发超出源凭证能力的令牌。用测试验证降级访问行为仓库提供了 snippets_test.py 作为端到端系统测试验证要点如下资源编排test_bucketfixture 用 UUID 生成不重复的桶名并创建临时桶测试结束后bucket.delete(forceTrue)清理资源test_blobfixture 在桶内写入一个名为customer-a-data.txt的对象内容为hello world断言逻辑test_main调用main并断言输出中不含error忽略大小写且能匹配到Testing.*Done模式从而确认降级凭证确实完成了受限读取。运行测试同样需要认证环境且 README 特别提醒运行测试的 ADC 主体必须拥有创建和删除 Cloud Storage 桶的权限。测试命令基于 nox用法详见 AUTHORING_GUIDE.md 的 Testing Guidelines 章节nox -s py-3.7 -- snippets_test.py测试依赖见 auth/downscoping/requirements-test.txt其中pytest9.0.3用于驱动用例google-cloud-storage用于 fixture 中的桶/对象创建。最佳实践与安全边界总结最小权限分层CAB 允许在资源桶与子资源对象前缀两个维度同时收权建议生产环境将availability_expression收窄到业务必需的最小对象子集令牌分发通道降级令牌属于敏感短时凭证Broker 到 Consumer 的传递应走经过认证与加密的通道仓库示例为便于本地演示而在消费者内直接调用 Broker这是刻意简化而非生产推荐令牌生命周期降级令牌是短时的通常约 1 小时配合refresh_handler可平滑续期切勿在代码中硬编码或长期缓存令牌权限上限约束降级令牌的最终权限是源凭证权限 ∩ CAB 规则因此管控源凭证本身仍是安全基线。本示例的完整源码、测试与依赖文件均可在仓库 auth/downscoping 目录下查看也可参考 AUTHORING_GUIDE.md 了解本仓库样本的编写与测试规范。更多关于 downscoped credentials 的底层实现可查阅 google-auth-library-python 项目README 中列出的附加资源并结合 auth 目录下其他认证示例如 auth/custom-credentials构建完整的云上凭证管理体系。赞分享示例工程【免费下载链接】python-docs-samplesCode samples used on cloud.google.com项目地址https://gitcode.com/GitHub_Trending/py/python-docs-samples点击查看免费下载相关推荐DataHub 访问令牌Access Token管理实战基于 GraphQL API 的创建、查询与吊销全指南DataHub 访问令牌Access Token管理实战基于 GraphQL API 的创建、查询与吊销全指南 导读 DataHub 以 GraphQL数据目录数据治理数据血缘后端前端数据工程数据集成基于 python-docs-samples 的 Google Compute Engine Python 实战指南认证、实例管理与代码示例运行基于 python docs samples 的 Google Compute Engine Python 实战指南认证、实例管理与代码示例运行 本指南以 c示例工程python-docs-samples 实战使用自定义 AWS 凭证供应商AwsSecurityCredentialsSupplier实现 AWS 身份登录 Google Cloudpython docs samples 实战使用自定义 AWS 凭证供应商AwsSecurityCredentialsSupplier实现 AWS 身份登示例工程上一篇YouTube.js 解析器中的 Alert 节点告警类型体系、源码实现与实战应用下一篇ArchiMate企业架构标准化建模平台开源工具链驱动的架构治理方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考