보안 모델 개요 - Deployment Manager, Dag Author, Authenticated UI User
Apache Airflow Official Documentation (in-repo snapshot) — Apache Software Foundation security/security_model.rst - "Airflow security model - user types" ~ "Capabilities of authenticated UI users" 섹션 (약 18-186행)
이 모듈을 다 읽으면
- Airflow 보안 모델이 정의하는 세 가지 사용자 유형(Deployment Manager, Dag Author, Authenticated UI User)의 권한 범위를 구분해 설명할 수 있다
- Authenticated UI User 하위 세부 역할(Admin, Operations, Connection configuration, Audit log, Regular, Viewer)이 서로 어떻게 다른 접근 권한을 갖는지 설명할 수 있다
- Airflow 3에서 Connection의 민감 정보 조회 권한이 Airflow 2 대비 어떻게 강화되었는지 설명할 수 있다
Airflow의 보안 모델은 신뢰 수준이 다른 세 부류의 사용자 - 설치 전체를 통제하는 Deployment Manager, Dag 코드를 작성/제출하는 Dag Author, UI/API로 접근하는 Authenticated UI User - 를 축으로 설계되어 있다. 이 문서는 각 사용자 유형이 무엇을 할 수 있고 무엇을 신뢰받아야 하는지, 그리고 Authenticated UI User 내부의 세부 역할이 어떤 차등적 접근권을 갖는지를 규정한다. (Airflow 3.x 문서 기준)
세 가지 사용자 유형과 Non-authenticated 예외
작은 규모의 설치에서는 한 사람이 모든 역할을 수행할 수 있지만, 규모가 커지면 책임과 권한을 분리해야 한다. Airflow는 이를 위해 Deployment Manager, Authenticated UI user, Dag author 세 유형을 정의한다.
Airflow는 기본적으로 비인증 사용자를 지원하지 않는다. 다만 두 가지 예외가 있다: 다른 시스템이 상태를 조회할 수 있어야 하는 ``/api/v2/monitor/health`` 헬스체크 엔드포인트, 그리고 로그인 전이라 당연히 비인증 상태여야 하는 ``/login`` 엔드포인트다. 이 두 엔드포인트를 제외하고 비인증 접근을 허용한다면 그로 인한 잠재적 취약점은 전적으로 Deployment Manager가 평가하고 책임져야 한다.
핵심 포인트
- 사용자 유형은 Deployment Manager, Authenticated UI user, Dag author 세 가지로 나뉜다
- Airflow는 기본적으로 비인증 사용자를 지원하지 않는다
- 헬스체크(/api/v2/monitor/health)와 로그인(/login) 엔드포인트만 비인증 접근이 의도된 예외다
Deployment Manager와 Dag Author의 권한
Deployment Manager는 가장 높은 수준의 접근과 통제 권한을 가진다. Airflow를 설치·설정하고 기술과 권한에 대한 의사결정을 내리며, 이론적으로 설치 전체를 삭제하거나 모든 자격증명에 접근할 수 있다. 감사 로그, 백업을 Airflow 바깥에 별도로 보관하는 것도 Deployment Manager의 선택이며, 이는 Airflow의 보안 모델이 다루는 범위 밖이다.
Dag Author는 Dag 파일을 생성, 수정, 삭제할 수 있다. 그 코드는 워커, Dag File Processor, Triggerer에서 실행되므로, Dag Author는 사실상 이 컴포넌트들에서 실행되는 코드를 바꿀 수 있고 그 코드가 접근하는 외부 시스템의 자격증명에도 잠재적으로 접근할 수 있다.
Airflow 3에서는 컴포넌트별로 데이터베이스 격리 수준이 다르다. 워커에서 실행되는 태스크 코드는 Execution API를 통해서만 API 서버와 통신하며 데이터베이스 자격증명을 받지 않으므로 메타데이터 DB에 직접 접근할 수 없다. 반면 Dag File Processor와 Triggerer는 Dag Author 코드가 실수로 DB에 접근하는 것을 막는 소프트웨어 가드가 있지만, 이 프로세스들이 DB 자격증명을 가진 부모 프로세스와 동일한 Unix 사용자로 실행되기 때문에, 의도적으로 악의적인 Dag Author는 부모 프로세스에서 자격증명을 탈취해 DB에 직접 접근할 수 있다.
핵심 포인트
- Deployment Manager는 설치 삭제와 모든 자격증명 접근까지 가능한 최고 권한 보유자다
- Dag Author 코드는 워커, Dag File Processor, Triggerer에서 실행된다
- Airflow 3의 워커는 Execution API로만 통신하며 DB 자격증명 자체가 없어 직접 DB 접근이 원천 불가능하다
- Dag File Processor/Triggerer는 소프트웨어 가드가 있지만, 부모와 동일 Unix 사용자로 실행되므로 의도적 자격증명 탈취까지는 막지 못한다
Authenticated UI User 세부 역할
Authenticated UI user의 실제 권한은 Deployment Manager나 Admin이 구성한 역할과 권한에 따라 달라지며, 단일 Dag만큼 좁게 스코핑될 수도, Admin만큼 넓을 수도 있다. 문서는 개념 이해를 돕기 위해 네 가지 범주를 제시한다.
Admin은 다른 사용자에게 권한을 부여/관리하며 모든 UI 기능에 전체 접근권을 갖는다. Connection을 구성해 워커에서 코드를 실행시킬 수 있으므로 이 권한을 남용하지 않을 것이라는 신뢰가 필요하다. 민감한 자격증명에 접근하고 수정할 수 있지만, 기본적으로 시스템 레벨 설정에는 접근하지 못한다. API Server에 DoS를 유발할 수도 있어 이 역시 신뢰가 전제된다. 감사 로그는 기본적으로 Admin만 접근 가능하다.
Operations user는 Admin과 거의 동일한 접근권을 갖지만, 권한 관리/부여와 감사 로그 접근은 할 수 없다는 점이 유일한 차이다.
Connection configuration user(:ref:`connection-configuration-users`)는 Connection을 구성하고 그 결과로 Dag 실행 중 워커에서 코드가 실행될 수 있으므로 신뢰가 필요하다. Airflow 3부터는 민감 자격증명에 대해 write-only 권한만 가지며 값을 조회(view)할 수는 없다 - Airflow 2까지는 브라우저 Inspect 기능이나 Connection extra의 평문 노출을 통해 조회가 가능했지만, Airflow 3는 API 레벨에서 이 값을 마스킹해 평문으로 반환하지 않는다. 잘못된 Connection 설정은 API Server DoS나 일부 프로바이더에서 원격 코드 실행으로 이어질 수 있어 고신뢰 역할로 취급된다.
Audit log user는 설치 전체의 감사 이벤트를 조회할 수 있다. Regular user는 Dag/태스크 인스턴스/Dag 실행을 보고 편집하며 태스크 로그를 볼 수 있다. Viewer user는 Dag 관련 정보와 태스크 로그를 읽기 전용으로만 볼 수 있고, 감사 로그에는 접근할 수 없다.
핵심 포인트
- Admin과 Operations의 유일한 차이는 권한 관리/부여 능력과 감사 로그 접근 여부다
- Connection configuration user는 Airflow 3부터 민감 자격증명에 write-only 권한만 가지며 조회는 불가능하다 - Airflow 2에서는 조회도 가능했다
- Viewer user는 읽기 전용이며 감사 로그 접근권이 없다
- 감사 로그는 기본적으로 Admin과 Audit log user만 접근할 수 있다
민감 정보(Sensitive information)의 처리 범위
민감 정보는 Connection 상세정보, Variable, Configuration을 포괄한다. Airflow 3.0 이후 버전에서는 이런 민감 정보가 API, UI, ``airflowctl``을 통해 노출되지 않는다. 다만 task-sdk는 여전히 민감 정보에 접근할 수 있다 - 예를 들어 태스크 전용 JWT 토큰으로 SDK API 클라이언트를 통해 Variable을 가져오는 경우다. 로컬 CLI는 ``--show_values``를 명시하지 않으면 키만 반환하고 값은 반환하지 않는다.
민감 정보는 로그, UI, API 출력에서 마스킹되지만, Dag Author가 환경 변수 등 다른 경로로 민감 정보를 노출시키는 경우 그 값은 마스킹되지 않는다.
핵심 포인트
- Airflow 3.0+에서 민감 정보(Connection/Variable/Configuration)는 API/UI/airflowctl을 통해 노출되지 않는다
- task-sdk는 태스크 전용 JWT로 여전히 민감 정보(Variable 등)에 접근할 수 있다
- 로컬 CLI는 --show_values 옵션 없이는 값이 아닌 키만 반환한다
- 마스킹은 Connection/Variable 접근 경로에 한정되며, 환경 변수 등 다른 경로로 유출된 값은 마스킹되지 않는다