← 학습 카테고리

Learn

Airflow

151개 모듈 · 현재 112번째

Airflow 모듈 112/151 airflow-learn-112

Workload 격리 - Impersonation과 실행 격리 현황

Apache Airflow Official Documentation (in-repo snapshot) — Apache Software Foundation security/workload.rst (전체)

이 모듈을 다 읽으면

  • run_as_user 기반 Unix impersonation의 동작 조건(sudo, sudoers 설정)을 설명할 수 있다
  • 워커 프로세스 메모리 보호(prctl PR_SET_DUMPABLE)가 왜 JWT 토큰 탈취를 막는 핵심 장치인지 설명할 수 있다
  • Execution API 레벨에서 현재 보장되는 것과 보장되지 않는 것(교차 워크로드/팀 격리)을 구분할 수 있다

workload.rst는 Unix 사용자 impersonation을 통한 태스크 격리 기능과, Airflow 3의 Execution API 기반 워크로드 격리 현황·한계를 다룬다. 리눅스의 prctl(PR_SET_DUMPABLE) 보호가 왜 중요한지, 그리고 실험적 multi-team 기능이 아직 무엇을 보장하지 못하는지를 security_model.rst의 내용과 같은 결을 유지하며 정리한다.

Unix Impersonation (run_as_user)

Airflow는 태스크의 ``run_as_user`` 파라미터에 지정된 사용자 이름을 기반으로 태스크 인스턴스 실행 시 유닉스 사용자를 impersonate하는 기능을 갖고 있다.

impersonation이 동작하려면 Airflow에 ``sudo``가 필요하다 - 서브태스크는 ``sudo -u``로 실행되고 파일 권한이 변경되기 때문이다. 또한 그 유닉스 사용자가 워커에 실제로 존재해야 한다. 예시 sudoers 항목은 Airflow가 ``airflow`` 사용자로 실행된다고 가정할 때 ``airflow ALL=(ALL) NOPASSWD: ALL``과 같은 형태이며, 이는 Airflow 사용자가 사실상 root와 동등하게 신뢰되어야 함을 의미한다.

impersonation을 사용하는 서브태스크는 여전히 같은 폴더에 로그를 남기지만, 그 유닉스 사용자만 쓸 수 있도록 파일 권한이 변경된다.

impersonation을 쓰지 않는 태스크가 sudo 권한으로 실행되는 것을 막으려면, ``core:default_impersonation`` 설정으로 ``run_as_user``가 지정되지 않았을 때의 기본 impersonation 사용자를 지정할 수 있다.

핵심 포인트

  • run_as_user impersonation은 sudo -u로 서브태스크를 실행하며 sudo 권한과 대상 유닉스 사용자의 실존이 필요하다
  • sudoers에 NOPASSWD: ALL을 주는 예시가 보여주듯, Airflow 실행 사용자는 사실상 root와 동등하게 신뢰되어야 한다
  • core:default_impersonation으로 run_as_user 미지정 태스크의 기본 impersonation 사용자를 지정할 수 있다

워커 프로세스 메모리 보호 (Linux)

리눅스에서 supervisor 프로세스는 ``supervise_task()`` 시작 시점에 태스크 프로세스를 fork하기 전에 ``prctl(PR_SET_DUMPABLE, 0)``을 호출한다. 이 플래그는 fork된 자식에 상속된다. 프로세스를 non-dumpable로 표시하면 동일 UID의 형제 프로세스가 ``/proc/<pid>/mem``, ``/proc/<pid>/environ``, ``/proc/<pid>/maps``를 읽거나 ``ptrace(PTRACE_ATTACH)``로 attach하는 것을 막는다. 각 supervisor가 메모리에 서로 다른 JWT 토큰을 들고 있기 때문에 이 보호가 중요하다 - 이 보호가 없다면 동일 유닉스 사용자로 실행되는 악의적인 태스크 프로세스가 형제 supervisor 프로세스로부터 토큰을 훔칠 수 있다.

이 보호는 왜 환경 변수를 통한 민감 설정 전달이 설정 파일보다 안전한지의 이유 중 하나이기도 하다 - 환경 변수는 프로세스 자신(과 root)만 읽을 수 있는 반면, 디스크의 설정 파일은 동일 사용자로 실행되는 파일시스템 접근 권한을 가진 어떤 프로세스든 읽을 수 있다.

이 보호는 리눅스 전용이다. 비Linux 플랫폼에서는 ``_make_process_nondumpable()`` 호출이 no-op이 된다. 비Linux 플랫폼에서 Airflow를 운영하는 Deployment Manager는 대안적인 격리 조치를 구현해야 한다.

핵심 포인트

  • supervisor는 태스크 프로세스 fork 전에 prctl(PR_SET_DUMPABLE, 0)을 호출하고 이 플래그는 자식에 상속된다
  • non-dumpable 표시는 동일 UID 형제 프로세스의 /proc/<pid>/mem·environ·maps 읽기와 ptrace attach를 차단한다
  • 각 supervisor가 메모리에 서로 다른 JWT 토큰을 보관하므로, 이 보호가 없으면 형제 프로세스 간 토큰 절취가 가능해진다
  • 이 보호는 리눅스 전용이며 비Linux 플랫폼에서는 no-op이므로 대안 격리 조치가 필요하다

교차 워크로드/팀 격리의 현재 상태

모든 워커 워크로드는 동일한 서명 키, audience, issuer를 공유하는 토큰으로 동일한 Execution API에 인증한다. ``ti:self`` 스코프 강제는 한 워커가 다른 태스크 인스턴스의 특정 엔드포인트(예: heartbeat, 상태 전이)에 접근하는 것은 막지만, 개별 태스크로 스코핑되지 않은 Connection·Variable·XCom 같은 공유 자원에는 여전히 접근할 수 있다.

실험적 multi-team 기능(``[core] multi_team``)은 UI 레벨과 REST API 레벨의 RBAC 격리를 팀 간에 제공하지만, 아직 태스크 레벨 격리는 보장하지 않는다. Execution API 레벨에서는 팀 기반 접근 경계에 대한 강제가 없다 - 한 팀의 태스크가 다른 팀의 Connection, Variable, XCom에 동일하게 접근할 수 있다. 모든 워크로드는 팀 배정과 무관하게 동일한 JWT 서명 키와 audience를 공유한다.

배포 레벨에서 추가 하드닝 조치가 구현되지 않은 경우, 한 팀의 태스크가 다른 팀에 속한 리소스에 잠재적으로 접근할 수 있다. 기본 배포는 모든 팀에 대해 단일 Dag File Processor와 단일 Triggerer를 실행하며, 이 둘 다 in-process 전송을 통해 JWT 인증을 잠재적으로 우회한다. 멀티팀 격리를 위해서는 Deployment Manager가 팀별로 별도의 인스턴스를 운영해야 하지만, 그렇게 해도 각 인스턴스는 잠재적으로 직접 DB 접근을 유지하므로, 그 인스턴스에서 실행되는 Dag Author 코드는 부모 프로세스로부터 자격증명을 탈취해 다른 팀의 데이터를 포함한 DB에 직접 접근하거나 JWT 서명 키 설정에 접근할 수 있다 - 각 인스턴스에 제공되는 DB 자격증명과 설정을 Deployment Manager가 제한하지 않는 한 그렇다.

향후 Airflow는 Connection/Variable 등 특정 리소스와 팀에 종속된 더 세분화된 토큰 스코프, Execution API의 팀 기반 격리 강제, 팀별 Dag File Processor/Triggerer 인스턴스에 대한 내장 지원, Dag File Processor/Triggerer의 사용자 제출 코드 샌드박싱 개선, multi-team 기능의 완전한 태스크 레벨 격리로 이런 한계를 해결할 계획이다.

핵심 포인트

  • 모든 워커는 동일 서명 키/audience/issuer를 공유하며, ti:self는 특정 엔드포인트만 제한하고 Connection/Variable/XCom 공유는 막지 못한다
  • multi_team은 UI/REST API 레벨 RBAC 격리만 제공하며 Execution API 레벨의 팀 경계 강제는 없다
  • 기본 배포는 단일 DFP/단일 Triggerer가 모든 팀을 처리하며 둘 다 JWT를 잠재적으로 우회한다
  • 팀별 인스턴스를 분리해도 각 인스턴스가 직접 DB 접근을 유지하므로 DB 자격증명/설정 제한 없이는 다른 팀 데이터 접근 가능성이 남는다