工作负载
本章节描述了如何配置 Airflow 以保护您的工作负载。
冒充
Airflow 可以在运行任务实例时根据任务的 run_as_user 参数冒充 Unix 用户,该参数接受用户的名称。
注意: 为了使冒充生效,Airflow 需要 sudo,因为子任务是使用 sudo -u 运行的,并且文件权限会被更改。此外,Unix 用户必须在工作节点上存在。下面是一个简单的 sudoers 文件条目的示例,假设 Airflow 以 airflow 用户运行。这意味着 Airflow 用户必须被信任,并且与 root 用户相同对待。
airflow ALL=(ALL) NOPASSWD: ALL
带有冒充的子任务仍会记录到同一文件夹,只是它们写入的文件权限会被更改,只有该 Unix 用户能够写入。
默认冒充
为了防止未使用冒充的任务在具有 sudo 权限的情况下运行,您可以设置 core:default_impersonation 配置,该配置在未设置 run_as_user 时设置默认的用户冒充。
[core]
default_impersonation = airflow
工作负载隔离及当前限制
本节描述了 Apache Airflow 中工作负载隔离的当前状态,包括已实现的保护措施、已知的限制以及计划的改进。
有关完整的安全模型和部署加固指南,请参阅 Airflow 安全模型。有关工作人员和内部组件使用的 JWT 认证流程的详细信息,请参阅 JWT 令牌身份验证。
工作进程内存保护(Linux)
在 Linux 上,监督进程会在 supervise() 开始之前调用 prctl(PR_SET_DUMPABLE, 0)。此标志会被 fork 出的子进程继承。将进程标记为不可转储可以阻止同 UID 的兄弟进程读取 /proc/<pid>/mem、/proc/<pid>/environ 或 /proc/<pid>/maps,并阻止 ptrace(PTRACE_ATTACH)。这点非常关键,因为每个监督进程都在内存中保存一个独立的 JWT 令牌——如果没有此保护,运行在相同 Unix 用户下的恶意任务进程就可能从兄弟监督进程中窃取令牌。
此保护是通过环境变量传递敏感配置比通过配置文件更安全的原因之一:环境变量只能被自身进程(以及 root)读取,而磁盘上的配置文件只要同一用户拥有文件系统访问权限的任意进程都可以读取。
注意
此保护仅适用于 Linux。在非 Linux 平台上,_make_process_nondumpable() 调用是一个空操作。 在非 Linux 平台上运行 Airflow 的部署管理员应实现其他隔离措施。
无跨工作负载隔离
所有工作节点工作负载使用相同的 Execution API 并使用共享相同签名密钥、受众和发行者的令牌进行身份验证。虽然 ti:self 范围的强制执行可以防止工作节点访问另一个任务实例的特定端点(例如 heartbeat、状态转换),但令牌仍然授予对共享资源的访问权限,例如连接、变量和 XCom,这些资源并未对单个任务进行范围限制。
执行 API 中没有团队级别的隔离(实验性多团队功能)
实验性的多团队功能([core] multi_team)在 UI 以及 REST API 级别提供了团队间的 RBAC 隔离,但 仍未保证任务级别的隔离。在 Execution API 层面,没有对基于团队的访问边界进行强制。来自一个团队的任务可以访问与另一团队任务相同的连接、变量和 XCom。所有工作负载共享相同的 JWT 签名密钥和受众,无论其所属团队如何。
在未在部署层面实施额外加固措施的部署中,来自一个团队的任务有可能访问属于另一团队的资源(参见 Airflow 安全模型)。部署管理员需要深刻理解配置和部署安全,以便以能够保证团队之间隔离的方式进行配置。任务级别的团队隔离将在 Airflow 的未来版本中得到改进。
Dag 文件处理器和触发器可能绕过 JWT 并访问数据库
如 JWT 令牌身份验证 所述,默认部署为所有团队运行单个 Dag 文件处理器和单个触发器。两者都可能通过进程内传输绕过 JWT 身份验证。若要实现多团队隔离,部署管理员必须为每个团队运行独立实例,但即便如此,每个实例仍可能保留直接的数据库访问权限。Dag 编写者的代码在这些组件中运行时,可能直接访问数据库——包括其他团队的数据或 JWT 签名密钥配置——除非部署管理员限制每个实例可使用的数据库凭证和配置。
计划改进
Airflow 的未来版本将通过以下方式解决这些限制:
更细粒度的令牌作用域,绑定到特定资源(连接、变量)和团队。
在 Execution API 中强制实施基于团队的隔离。
内置对每个团队的 Dag 文件处理器和触发器实例的支持。
改进 Dag 文件处理器和触发器中用户提交代码的沙箱机制。
多团队功能的完整任务级别隔离。