RBAC; Role-Based Access Control
참고: https://airflow.apache.org/docs/stable/security.html#rbac-ui-security
Airflow 1.10.9 버전 이후 Web UI가 Flask-Admin
에서 Flask-Appbuilder
기반으로 변경되면서 RBAC를 활성화할 수 있다.
다음과 같이 다섯개의 Role 이 정의돼 있고 이 외에도 커스텀 롤을 생성할 수 있다.
- Admin
- Op
- User
- Viewer
- Public
각 Role들은 아래와 같은 형태의 권한들의 집합인데 세부 권한들은 다음과 같은 형태로 정의 돼 있어서
menu access on {menu}
- 어떤 화면에 접근할 수 있는지
{operation} on View
- 그 화면에서 어떤 기능들을 이용할 수 있는지
can dag (read|edit) on DAG
- 만약 DAG와 관련된 기능이라면 어떤 DAG에 위 기능들을 적용할 수 있는지
를 role(사용자) 별로 제어할 수 있다.
Admin Role
최초 설치시 Admin Role에 부여된 권한(설치 직후 시점의 모든 권한)은 다음과 같다.
menu access on List Users
menu access on Security
menu access on List Roles
menu access on User's Statistics
menu access on Base Permissions
menu access on Views/Menus
menu access on Permission on Views/Menus
menu access on DAG Runs
menu access on Browse
menu access on Jobs
menu access on Logs
menu access on SLA Misses
menu access on Task Instances
menu access on Configurations
menu access on Admin
menu access on Connections
menu access on Pools
menu access on Variables
menu access on XComs
menu access on Documentation
menu access on Docs
menu access on GitHub
menu access on Version
menu access on About
can this form get on ResetPasswordView
can this form post on ResetPasswordView
can this form get on ResetMyPasswordView
can this form post on ResetMyPasswordView
can this form get on UserInfoEditView
can this form post on UserInfoEditView
can show on UserLDAPModelView
can add on UserLDAPModelView
can userinfo on UserLDAPModelView
can edit on UserLDAPModelView
can download on UserLDAPModelView
can delete on UserLDAPModelView
can list on UserLDAPModelView
userinfoedit on UserLDAPModelView
can show on RoleModelView
can add on RoleModelView
can edit on RoleModelView
can download on RoleModelView
can delete on RoleModelView
can list on RoleModelView
copyrole on RoleModelView
can chart on UserStatsChartView
can list on PermissionModelView
can list on ViewMenuModelView
can list on PermissionViewModelView
can get on MenuApi
can trigger on Airflow
can tree on Airflow
can dagrun failed on Airflow
can code on Airflow
can dag stats on Airflow
can task stats on Airflow
can failed on Airflow
can rendered on Airflow
can clear on Airflow
can refresh on Airflow
can gantt on Airflow
can dagrun clear on Airflow
can paused on Airflow
can log on Airflow
can last dagruns on Airflow
can elasticsearch on Airflow
can dagrun success on Airflow
can index on Airflow
can task on Airflow
can extra links on Airflow
can blocked on Airflow
can duration on Airflow
can pickle info on Airflow
can task instances on Airflow
can get logs with metadata on Airflow
can success on Airflow
can xcom on Airflow
can tries on Airflow
can run on Airflow
can landing times on Airflow
can dag details on Airflow
can graph on Airflow
can delete on Airflow
can list on DagModelView
can show on DagModelView
can list on DagRunModelView
can add on DagRunModelView
muldelete on DagRunModelView
set failed on DagRunModelView
set running on DagRunModelView
set success on DagRunModelView
can list on JobModelView
can list on LogModelView
can list on SlaMissModelView
can list on TaskInstanceModelView
clear on TaskInstanceModelView
set failed on TaskInstanceModelView
set retry on TaskInstanceModelView
set running on TaskInstanceModelView
set success on TaskInstanceModelView
can conf on ConfigurationView
can add on ConnectionModelView
can list on ConnectionModelView
can edit on ConnectionModelView
can delete on ConnectionModelView
muldelete on ConnectionModelView
can add on PoolModelView
can list on PoolModelView
can edit on PoolModelView
can delete on PoolModelView
muldelete on PoolModelView
can add on VariableModelView
can list on VariableModelView
can edit on VariableModelView
can delete on VariableModelView
can varimport on VariableModelView
muldelete on VariableModelView
varexport on VariableModelView
can add on XComModelView
can list on XComModelView
can edit on XComModelView
can delete on XComModelView
muldelete on XComModelView
can version on VersionView
can dag edit on all_dags
can dag read on all_dags
can edit on UserDBModelView
can delete on UserDBModelView
can add on UserDBModelView
can download on UserDBModelView
can userinfo on UserDBModelView
can list on UserDBModelView
can show on UserDBModelView
resetmypassword on UserDBModelView
resetpasswords on UserDBModelView
userinfoedit on UserDBModelView]
※ all_dags
라는 dag는 실제 dag 이름이 all_dags가 아닌 권한 관리에서만 나오는 special dag로 와일드카드이다.
Public Role
기본 정의된 Public
Role 은 아무런 권한이 없는데 이 Role을 부여받은 사용자는 로그인 직후 ERR_TOO_MANY_REDIRECTS 에러가 발생해서 아무것도 할 수가 없다. 이 문제를 해소하려면 웹 브라우저에 https://${airflow_host}/logout
으로 접근해서 강제로 logout api 를 호출해야 한다.
로그인 직후에는 메인 화면인 /home
으로 리디렉션 되는데 관련된 기본 View 들에 대한 menu access 조차 없어서 home -> login -> home -> login 의 무한 루프에 빠진다.
위와같은 문제가 있어서, 아래와 같이 new_role
이라는 새로운 롤을 만들면 다음과 같은 최소한의 권한들이 기본적으로 포함되도록 처리한 것 같은데 기본 롤인 Public
만 Public = []
상태로 남아있다. Public
롤은 FAB 에서 일단 가져오긴 했는데 Airflow 에서는 쓸모가 없는 듯.
특정 DAG 에 대해 can read on 권한만 부여하면 해당 DAG 의 작업 이력 및 코드 등을 조회만 가능하고 off, delete 등의 조작을 할 수 없다. (그런데 버튼은 활성화 돼 있고, 해당 api 접근하면 access denied 라고 flash 된다. on/off 와 같은 토글 버튼은 flash 메시지 조차 발생하지 않아서 설정이 된건지 만건지 확인도 안 됨.)