Apache Airflow의 DAG별 접근 제어 구현하기

graphy-young·2024년 5월 27일
0

Apache Airflow

목록 보기
2/3
post-thumbnail

01. 개요

만약 하나의 Apache Airflow에서 다양한 조직의 사용자가 존재하며, DAG의 종류 또는 개별 접근 제어(Access Control)를 구현해야한다면 어떻게 해야할까?
Airflow는 Resource 및 DAG-level 기반의 권한을 Role을 통해 권한을 정의한 후, 이를 사용자 계정에 할당함으로써 사용자별 접근 제어를 구현할 수 있다.

  1. Resource-base permission (2.0+)
    자원 기반 권한은 Airflow 내 다음 객체를 대상으로 지정할 수 있다.

    • Dag
    • DagRun
    • Task
    • Connection
    • 그 외 특정 Menu, Profile 등

    또한 상기 자원에 대해 CRUD Action을 제어할 수 있다.

    • can_create
    • can_read
    • can_edit
    • can_delete
  2. DAG-level permission
    DAG 단계에서의 권한은 Role 내에서 전체 DAG(DAGs.[action]) 또는 특정 DAG(DAG:[dag_id].[action])을 지정하여 설정할 수 있으며, DAG를 정의할 때 airflow.DAG 객체 내 access_control 속성을 통해 Role별로 Action을 지정할 수 있다.

    from airflow import DAG
    from airflow.utils.dates import days_ago
    
    DAG(dag_id="permission_example_dag",
        start_date=days_ago(1),
        access_control={
            "Viewer": {"can_edit", "can_read", "can_delete"}, 
            # access_control 속성은 {”role_name”: {”action_1”, “action_2”}, …}와 같은 형식의 dict형으로 입력
        },
    )

02. 실험

  1. 요구사항
    1. Apache Airflow 2.0 이상 버전의 실험 환경
  1. 실험에 사용할 Airflow 사용자 계정 및 Role 생성

    • 테스트에 사용할 Role(taylor_role) 생성 및 Airflow Webserver에 로그인할 수 있도록 Website에 대한 읽기 권한 부여
      airflow roles create taylor_role 
      airflow roles add-perms taylor_role -r Website -a can_read
    • 테스트에 사용할 2가지 사용자 계정 생성 - taylor (user), trey (admin)
      airflow users create --username taylor --password taylor --role taylor_role --email taylor@example.com --firstname taylor --lastname kim
      airflow users create --username trey --password trey --role Admin --email trey@example.com --firstname trey --lastname yi
  2. 실험에 사용할 DAG를 Airflow의 DAG 경로(일반적으로 $AIRFLOW_HOME/dags)에 생성

    from airflow import DAG
    from airflow.operators.dummy_operator import DummyOperator
    from airflow.utils.dates import days_ago
    
    with DAG(
        dag_id='test_role_dag',
        tags=['test'],
        start_date=days_ago(1),
        schedule_interval=None,
        default_args={
            'owner': 'airflow',
            'retries': 0
        },
        catchup=False,
        is_paused_upon_creation=False
    ) as dag:
    
        task_for_user1 = DummyOperator(task_id='task')
  1. taylor로 로그인하여 생성한 예시 DAG(test_role_dag)가 Airflow Webserver에서 보이는지 확인

    taylor 계정에는 어떠한 읽기 권한이 없기 때문에 해당 계정에서는 아무런 DAG도 보이지 않는다.

  2. taylor와 비교하기 위해 Admin role을 가진 trey로 로그인

    trey 계정은 Apache Airflow에서 기본 제공되는 Admin Role의 권한 내 DAGs(DAG 전체)에 대한 can_read 권한을 가지고 있으므로 별도의 설정 없이 모든 DAG를 확인할 수 있음.

  3. taylor에 특정(또는 모든) DAG(DAG(s))에 대한 읽기 권한(can_read)을 부여

    airflow roles add-perms taylor_role -r DAGs -a can_read
    
    # or
    
    airflow roles add-perms taylor_role -r DAG:test_role_dag -a can_read

  4. test_role_dag DAG 내 access_control 속성에 권한을 지정해보기

    (글 순서대로 진행했을 경우) taylor_roleDAG:test_role_dag 또는 DAGs에 대한 can_read 권한이 있을 경우 제거 필요

    from airflow import DAG
    from airflow.operators.dummy_operator import DummyOperator
    from airflow.utils.dates import days_ago
    
    with DAG(
        dag_id='test_role_dag',
        tags=['test'],
        start_date=days_ago(1),
        schedule_interval=None,
        default_args={
            'owner': 'airflow',
            'retries': 0
        },
        catchup=False,
        is_paused_upon_creation=False
    ) as dag:
    
        task_for_user1 = DummyOperator(task_id='task')

    Role에 지정된 권한이 없어도 DAG에서 지정된 권한을 통해 taylor 계정에서 정상적으로 표시됨.

  5. 테스트에 사용한 계정 및 Role 정리

    airflow users delete --username trey
    airflow users delete --username taylor
    airflow roles delete taylor_role

03. 결론

  • Apache Airflow 2.X 버전에서는 DAG 객체의 owner argument를 통한 접근 권한 관리가 불가능하다.
  • 사용자 계정에 포함되는 Role에 DAG 전체 또는 개별 DAG에 대한 권한 명시를 통해 ACL 가능, 그러나 변경이나 추가 발생시 수행해야하는 CLI 또는 SQL을 자동화하는 것은 복잡할 수 있다.
  • Role에 각 DAG에 대한 개별적 관리를 정의하는것보다 DAG 객체에 access_control 속성에 Role에 대한 권한을 명시하고 관리하는 것이 관리적인 측면에서 효율적일 것이다.

99. Appendix

Airflow에 Okta를 연동하여 SSO(Single Sign-On) 구축하기

Integrating Airflow with Okta

  • Apache Airflow는 공식적으로 Okta integration을 지원하지 않지만, 아래 링크와 같은 사례가 있음
  • Okta API Integration은 별도 추가 비용이 발생하지 않으므로(사용자 계정 당 비용 발생) 외부 팀 사용자가 늘어날 경우 Okta 연동과 본 글에서 소개한 ACL을 통해 접근 제어 구현을 고려해볼 수 있음

참고자료

  1. Apache Airflow Documentation
profile
키보드 한 자루로 시작하는 데이터 엔지니어링 삽질기

0개의 댓글