
Apache Airflow Akeyless Provider 版本演进深度解析从 AkeylessHook 到云原生 Secrets Backend【免费下载链接】airflowApache Airflow - A platform to programmatically author, schedule, and monitor workflows项目地址: https://gitcode.com/GitHub_Trending/ai/airflowApache Airflow 的apache-airflow-providers-akeylessProvider 为 Airflow 提供了对接 Akeyless Vault Platform 的完整能力一个用于操作静态、动态与轮转密钥的AkeylessHook一个用于从 Akeyless 动态获取 Connections、Variables 与 Configuration 的AkeylessBackend秘密后端以及一套带专属 UI 字段的akeyless连接类型。本文以该 Provider 的官方变更日志 changelog.rst 为骨架逐版本剖析 0.1.0 至 0.3.1 的能力演进与安全加固并结合 hooks/akeyless.py 与 secrets/akeyless.py 的源码实现帮助你理解每个版本号背后到底改了什么、为什么要改以及如何在自己的 Airflow 环境中落地这些能力。版本演进总览截至当前仓库Akeyless Provider 共发布了 4 个版本见 provider.yaml当前版本为0.3.1版本类型核心内容对应 PR0.1.0初始发布AkeylessHook、AkeylessBackend、自定义akeyless连接类型初始版本0.2.0破坏性变更连接字段jwt更名为jwt_token修复 JWT 凭据未被日志脱敏的问题#674430.3.0新特性为 Secrets Backend 新增云身份认证aws_iam/gcp/azure_ad#697720.3.1Bug 修复拒绝寻址其他团队命名空间的 Akeyless 密钥 ID多团队模式安全加固#72646其余如 0.3.1 中的#72503提升 common-compat 下限、#717942026-08-18 发布准备、#71186采用 flit 4 构建后端、#71324约束锁定以及 0.3.0 中的#68991文档与 pyproject 一致性修复、0.2.0 中的#664242026-05-05 发布准备等均为发布流程类变更未出现在对外 Changelog 的正式条目中。0.1.0 初始发布Provider 的三大支柱0.1.0 是 Akeyless Provider 的初始版本一次性地交付了三个核心组件构成了此后所有版本的基础AkeylessHook用于与 Akeyless Vault Platform 交互的 Hook覆盖静态、动态与轮转密钥的读取密钥条目的增删改查以及多种认证方式AkeylessBackend用于从 Akeyless 获取 Airflow Connections、Variables 与 Configuration 的秘密后端自定义akeyless连接类型为所有认证方式提供专属 UI 字段。AkeylessHook薄封装之上的完整能力AkeylessHook定义在 hooks/akeyless.py本质上是 Akeyless Python SDK 的薄封装thin wrapper通过client属性返回缓存的akeyless.V2Api客户端默认 API 地址为https://api.akeyless.io可通过连接 Host 或 Extra 中的api_url覆盖见 hooks/akeyless.py。围绕密钥操作Hook 提供了以下方法均以authenticate()获取 token 为前提见 hooks/akeyless.py方法能力底层 SDK 调用get_secret_value(name)按路径读取单个静态密钥GetSecretValueget_secret_values(names)批量读取多个静态密钥GetSecretValuecreate_secret(name, value, description)创建静态密钥CreateSecretupdate_secret_value(name, value)更新静态密钥值UpdateSecretValdelete_item(name)删除密钥/条目DeleteItemdescribe_item(name)读取条目元数据DescribeItemlist_items(path)列出路径下的条目ListItemsget_dynamic_secret_value(name)生成动态密钥值如数据库临时凭据GetDynamicSecretValueget_rotated_secret_value(name)读取轮转密钥值GetRotatedSecretValue此外Hook 还实现了test_connection()供 Airflow UI 的 Test 按钮校验连通性见 hooks/akeyless.py。AkeylessBackend三种密钥类型的统一来源AkeylessBackend继承自 Airflow 的BaseSecretsBackend定义在 secrets/akeyless.py通过实现get_connection、get_variable、get_config三个接口见 secrets/akeyless.py让 Airflow 在解析连接、变量与配置时自动回源到 Akeyless。密钥的查找规则是base_path sep key例如连接postgres_default会被解析到/airflow/connections/postgres_default。自定义连接类型八种认证方式自定义akeyless连接类型conn_type akeyless默认连接akeyless_default在 UI 行为上隐藏了extra、schema、port字段并将login、password、host分别重命名为 Access ID、Access Key、API URL见 provider.yaml 与 hooks/akeyless.py。VALID_AUTH_TYPES定义了 8 种认证方式见 hooks/akeyless.pyapi_key, aws_iam, gcp, azure_ad, uid, jwt, k8s, certificateauthenticate()方法hooks/akeyless.py按access_type分支处理api_key使用 Access ID Access Keyuid直接返回 Extra 中的uid_tokenk8s需要k8s_auth_config_namecertificate需要 PEM 格式的certificate_data与private_key_data。详细字段说明见 connections.rst。0.2.0 破坏性变更jwt更名为jwt_token0.2.0 是当前唯一包含破坏性变更的版本。变更日志明确指出Akeyless 连接字段jwt已更名为jwt_token以确保凭据能在日志中被正确脱敏对应 PR #67443。这条变更的工程背景值得展开在 Airflow 中连接 Extra 里若存在名为jwt之类的字段Airflow 的敏感值掩码机制Secrets Masker无法识别它是需要脱敏的凭据从而可能在日志中明文泄露 JWT。将其重命名为带token后缀的jwt_token后掩码器即可正确识别并打码。从源码可以看到当前 Hook 的认证逻辑读取的正是self._extra.get(jwt_token)见 hooks/akeyless.pyUI 表单小部件也注册了jwt_token字段hooks/akeyless.pyprovider.yaml的连接字段定义同样使用jwt_token见 provider.yaml。升级注意事项由于该 Provider 仍处于 1.0 之前的阶段破坏性变更被允许合入次要版本minor release。若你正在使用jwt认证升级到 0.2.0 及以上时必须把既有 Akeyless 连接中 Extra 的jwt字段重命名为jwt_token否则认证将因读取不到 token 而失败。0.3.0 新特性云身份认证进入 Secrets Backend0.3.0 的核心特性PR #69772是为AkeylessBackend增加三种基于云身份的认证方式aws_iam、gcp、azure_ad。此前 Backend 仅支持api_key与uid现在_SUPPORTED_BACKEND_AUTH_TYPES扩展为五种见 secrets/akeyless.pyapi_key, uid, aws_iam, gcp, azure_ad这三类云认证的共同点是无需在 Airflow 侧保存静态密钥而是利用运行环境自身的云身份换取 Akeyless 的 cloud-id 完成认证非常适合托管型 Airflow 环境access_type身份来源适用场景据文档 secrets-backend.rstaws_iam主机所在 AWS IAM 角色Amazon MWAA、EC2/ECS/EKSgcpGCP Workload IdentityGoogle 托管版 AirflowCloud Composer、GCE/GKEazure_adAzure AD 身份Azure 上托管的 Airflow从实现上看_get_cloud_id()secrets/akeyless.py调用可选的akeyless_cloud_id包生成对应云平台的 identity tokenAWS 用cid.generate()GCP 用generateGcp(gcp_audience)Azure 用generateAzure(azure_object_id)。因此使用云认证前需要安装可选依赖pip install apache-airflow-providers-akeyless[cloud_id]以 Amazon MWAA 为例完整步骤见 secrets-backend.rst在requirements.txt中加入apache-airflow-providers-akeyless[cloud_id]在 MWAA 控制台配置secrets.backend指向AkeylessBackend、secrets.backend_kwargs设置access_type: aws_iam并确保 MWAA 的 VPC 可出网访问 Akeyless API 端点最后在 Akeyless 侧创建与该执行角色 ARN 绑定的aws_iamAuth Method 即可。Hook 侧同样支持这三种云认证见 hooks/akeyless.py且akeyless_cloud_id未安装时会抛出带有安装提示的ImportError。此外0.3.0 还包含一项文档类变更#69478在各 Provider 的文档索引中说明其可选 extras。0.3.1 安全修复拒绝跨团队命名空间寻址0.3.1 是当前最新版本唯一的正式条目是一个安全修复PR #72646拒绝寻址其他团队命名空间的 Akeyless 密钥 ID。要理解这个修复需要先了解 Backend 的多团队multi-team查找逻辑。Airflow 3 的多团队部署模式下core.multi_team True_get_team_or_global_secret()secrets/akeyless.py会按以下顺序查找密钥团队作用域路径{base_path}/{team_name}/{key}若设置了global_secrets_path回退到全局路径{base_path}/{global_secrets_path}/{key}否则回退到普通全局路径{base_path}/{key}。安全风险在于第 3 步的回退路径{base_path}/{key}是所有团队密钥的共同前缀目录。假如alpha团队的调用者请求密钥beta/db_password其中beta是另一个团队的名字团队路径{base_path}/alpha/beta/db_password查找未命中后会回退到{base_path}/beta/db_password——而这恰好是beta团队私有的密钥路径导致跨团队越权读取。0.3.1 的修复手段是_escapes_its_namespace()secrets/akeyless.py当多团队模式开启、团队作用域查找开启use_team_secrets_pathTrue、调用方带team_name、且密钥名中包含路径分隔符sep时判定该请求可能通过回退路径越权直接拒绝查找并返回None同时通过_log_refusal()输出告警日志secrets/akeyless.py。值得注意的是这个拒绝逻辑被刻意设计得很窄源码注释明确说明 The refusal is deliberately narrow因为sep本身就是常规路径分隔符嵌套密钥是合法的文档化布局。因此以下情况不受影响use_team_secrets_pathFalse完全禁用团队作用域查找自然不存在回退越界嵌套密钥照常工作调用方没有team_name直接在共享命名空间解析不经过团队回退非多团队模式不存在团队命名空间概念。同时get_config()路径不设此守卫见 secrets/akeyless.py 的注释配置查找不携带team_nameAirflow 也不会通过秘密后端做团队作用域的配置查找因此不会构建团队路径、没有可越过的边界拒绝嵌套 ID 反而会破坏子目录形式的配置布局。从 Changelog 到实战安装与配置要点围绕 Changelog 中的能力落地使用时需要关注以下要点。安装与依赖当前版本0.3.1要求apache-airflow2.11.0、akeyless5.0.0、apache-airflow-providers-common-compat1.12.0支持 Python 3.103.14见 README.rstpip install apache-airflow-providers-akeyless # 基础安装 pip install apache-airflow-providers-akeyless[cloud_id] # 启用 aws_iam/gcp/azure_ad 云认证Secrets Backend 最小配置在airflow.cfg中启用 Backend完整参数表见 secrets-backend.rst[secrets] backend airflow.providers.akeyless.secrets.akeyless.AkeylessBackend backend_kwargs { connections_path: /airflow/connections, variables_path: /airflow/variables, config_path: /airflow/config, api_url: https://api.akeyless.io, access_id: p-xxxxxxxxx, access_key: your-access-key, access_type: api_key }也可用环境变量方式注入AIRFLOW__SECRETS__BACKEND与AIRFLOW__SECRETS__BACKEND_KWARGS。核心参数中connections_path/variables_path/config_path默认分别为/airflow/connections、/airflow/variables、/airflow/config置为None可停用对应类型sep默认/token_ttl默认 600 秒控制 API token 的缓存刷新周期见 secrets/akeyless.py。连接存储的三种格式Akeyless 中的连接值支持三种存储格式单元测试 test_akeyless.py 对三种格式均有覆盖验证URI 字符串postgresql://user:passwordhost:5432/dbnameJSON 对象含conn_uri{conn_uri: postgresql://user:passwordhost:5432/dbname}JSON 对象逐字段包含conn_type、host、login、password、schema、port等键。get_connection()内部会先尝试json.loads解析解析失败则按 URI 处理见 secrets/akeyless.py变量与配置的值若为{value: ...}形式的 JSON 对象则取其value字段见 secrets/akeyless.py。升级路径提醒从 0.1.x 升级到 0.2.0务必执行jwt→jwt_token字段重命名否则 JWT 认证失效升级到 0.3.x 后如需云认证安装[cloud_id]extra并在backend_kwargs中设置对应的access_typeaws_iam/gcp/azure_ad及gcp_audience、azure_object_id等可选参数升级到 0.3.1 后若使用多团队模式注意嵌套密钥名在带团队上下文的查找中会被拒绝返回None并记录告警日志这是预期的安全行为可通过use_team_secrets_pathFalse关闭团队作用域查找以保留嵌套密钥能力。从 0.1.0 的三件套起步到 0.2.0 的凭据脱敏修正再到 0.3.0 拥抱云原生身份、0.3.1 封堵多团队越权路径Akeyless Provider 的每次版本迭代都对应着真实的生产环境诉求。理解这份 Changelog 背后的实现细节能帮助你在选择认证方式、规划密钥路径布局与升级版本时做出更稳妥的决策。进一步可阅读 connections.rst连接配置、secrets-backend.rst后端配置、README.rst安装与依赖以及系统测试用例 example_dag_akeyless.py 获取完整的实战参考。【免费下载链接】airflowApache Airflow - A platform to programmatically author, schedule, and monitor workflows项目地址: https://gitcode.com/GitHub_Trending/ai/airflow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考