airflow 의 DAG-level Permission 을 사용하면 다음과 같은 접근 제어가 가능함

- A 사용자는 A 사용자만을 위한 DAG 만 볼 수 있음
- A 사용자는 B 사용자을 위한 DAG 는 볼 수 없음

- A 사용자가 B 사용자의 DAG 를 보려면 권한(Role) 을 받아야 함

 

어떤 계정으로 접근하면 해당 계정에서만 보이는 dag 가 존재하고
그 dag 는 다른 계정에서는 보이지 않음

 

 

 

 

 

아래부터 DAG-level Permission 설정 방법에 대해 설명함

user1, user2 계정을 새롭게 만들고,

user1 계정으로 로그인해야만 보이는 dag 와

user2 계정으로 로그인해야만 보이는 dag 를 만들어 볼 예정

 

 

아래 절차대로 작업 진행
1. airflow Role 생성
2. airflow 계정 생성
3. 각 계정을 위한 dag 생성

 

 

 

 

 

 

< airflow Role 생성 >

 

admin 계정으로 접속한 후, Security - List Roles 클릭

 

Admin 을 클릭한 상태에서 Actions - Copy Role 클릭하여 Admin Role 을 복사

 

새롭게 복사한 Role 의 Edit record 버튼 누름

 

이름은 user1 로 명명

또한 Permissions 중에 'can read on DAGs' 와 'can edit on DAGs' 삭제 후 저장

 

여기까지 user1 을 위한 Role 을 하나 생성함
위와 같은 방식으로 user2 를 위한 Role 도 추가로 만듦

 

 

 

 

 

 

< airflow 계정 생성 >

 

아래 airflow 명령어로 user1, user2 airflow 계정 생성

 

airflow users create --username user1 --password user1 --role user1 --email user1@example.com --firstname user1 --lastname user1
airflow users create --username user2 --password user2 --role user2 --email user2@example.com --firstname user2 --lastname user2

Security - List Users 에서 잘 생성된 것을 확인

 

 

 

 

 

< 각 계정을 위한 dag 생성 >

 

user1 계정으로 로그인했을 때만 보이는 dag 는 아래와 같이 작성할 수 있음

 

only_for_user1.py

from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import datetime, timedelta

default_args = {
    "owner": "user1",
    "email_on_failure": "user1@example.com",
    "email_on_retry": "user1@example.com",
    "email": "user1@example.com",
    "retries": 3,
    "retry_delay": timedelta(minutes=1)
}

def _test():
    print("hi user1!")

with DAG(dag_id="only_for_user1",
    start_date=datetime(2022, 6, 25),
    schedule_interval="* * * * *",
    default_args=default_args,
    catchup=False,
    access_control={'user1':{'can_read', 'can_edit'}}
    ) as dag:

    test = PythonOperator(
        task_id="test",
        python_callable=_test,
    )

 

위와 같이 dag 를 작성한 후 genie_dev Role 을 살펴보면
다음과 같이 새로운 Role 이 추가된 것을 볼 수 있음

 

 

DAG 중간에 있는 access_control 을 해석해보면,


access_control={'[Role 이름]' : { '[권한]', '[권한]',.... }}


access_control={'user1':{'can_read', 'can_edit'}}


 

user1 이라는 Role 를 갖어야

dag_id 가 'only_for_user1'인 dag 를 볼 수 있다는 의미가 됨

 

user1 라는 Role 을  갖는 user1 계정으로 접근하면, only_for_user1 dag 가 보이게 됨

user2 라는 Role 을 갖는 user2 계정으로 접근하면, only_for_user1 dag 는 보이지 않음

 

실제로 airflow 화면은 아래와 같이 보여짐

 

 

 

user1 로 로그인 했을 때 보이는 airflow 화면

 

 

user2 로 로그인 했을 때 보이는 airflow 화면

 

 

 

 

 

같은 방식으로 user2 에서 보이는 dag 는 다음과 같이 작성 가능

 

only_for_user2.py

from airflow import DAG
from airflow.operators.bash import BashOperator
from datetime import datetime, timedelta

default_args = {
    "owner": "user2",
    "email_on_failure": "user2@example.com",
    "email_on_retry": "user2@example.com",
    "email": "user2@example.com",
    "retries": 3,
    "retry_delay": timedelta(minutes=1)
}

with DAG(dag_id="only_for_user2",
    start_date=datetime(2022, 6, 25),
    schedule_interval="* * * * *",
    default_args=default_args,
    catchup=False,
    access_control={'user2':{'can_read', 'can_edit'}}
    ) as dag:

    test = BashOperator(
            task_id='test',
            bash_command='echo "hello user2!"',
    )

 

 

 

 

 

user1 로 로그인 했을 때 보이는 airflow 화면

 

 

user2 로 로그인 했을 때 보이는 airflow 화면

 

 

 

 

 

only_for_user1.py 의 access_control 내용을 아래처럼 바꾸면

 


access_control={'user1':{'can_read', 'can_edit'}, 'user2':{'can_read', 'can_edit'}}

 

only_for_user1 dag 는 user1 혹은 user2 라는 Role 을 갖는 계정에서 보이게 됨

따라서 user2 Role 을 갖고 있는 user2 계정도 only_for_user1.py dag 를 볼 수 있음

 

 

 

access_control 을 수정 후, user2 로 로그인 했을 때 보이는 airflow 화면

 

 

 

 

 

 

 

 

참고

 

https://airflow.apache.org/docs/apache-airflow/stable/security/access-control.html 
https://swalloow.github.io/airflow-multi-tenent-1/ 
https://cloud.google.com/composer/docs/airflow-rbac?hl=ko

 

 

+ Recent posts