rbac
기능을 이용하면 DAG-level Access Control
이 가능하다고 한다. 새롭게 추가된 tag 기능에 더해져서 tag-level 권한 관리도 됐으면 좋았겠지만.. rbac 기능을 이용하면 기본적 제공되는 롤 뿐만 아니라 Customized role 을 통해 가능해질 사용자 권한 관리를 기대하며 최신 1.10.10 버전을 설치해본다.
기존에 LDAP 연동해서 사용하던 Airflow 시스템을 업그레이드 해서 사용할 수 있을지 확인해보기 위해 OpenLDAP 환경을 간단하게 구축한 뒤 rbac 이 정상 동작 하는지 확인 먼저 해본 뒤 이런저런 기능을 사용해볼 예정이며 CentOS7 서버에 설치한다.
OpenLDAP 설치; https://oboki.net/workspace/system/linux/openldap-%ec%84%a4%ec%b9%98/
환경변수 설정
다음과 같이 환경변수를 설정했기 때문에 mysql, python 은 먼저 준비가 되어야 한다.
export PATH=\
$HOME/usr/mysql/bin:\
$HOME/usr/python/bin:\
$JAVA_HOME/bin:\
$PATH
export LD_LIBRARY_PATH=\
$HOME/usr/mysql/lib:\
$HOME/usr/python/lib:\
$LD_LIBRARY_PATH
export AIRFLOW_HOME=$HOME/usr/airflow
Python 설치
파이썬 설치에 앞서 사전 준비해야하는 시스템 라이브러리가 많아서 파이썬 설치 스크립트를 따로 적어둠.
yum -y install gcc openssl-devel zlib-devel libffi-devel bzip2-devel sqlite-devel ncurses-devel gdbm-devel tk-devel xz-devel readline-devel openldap-devel
curl -O https://www.python.org/ftp/python/3.7.7/Python-3.7.7.tgz && tar xf Python-3.7.7.tgz && cd Python-3.7.7
./configure --prefix=$HOME/usr/python/3.7.7 --enable-shared && make -j 4 && make install
cd $HOME/usr/python && ln -s ./3.7.7/* .
which python3
pip3 install --upgrade setuptools pip wheel
데이터베이스 생성
airflow:airflow@localhost:3306/airflow
와 같이 데이터베이스를 생성했고 explicit_defaults_for_timestamp
값을 활성화했다. (세션 단위로 설정해도 되지만 편의상 global 파라미터를 적용)
create database airflow;
create user airflow@'%' identified by 'airflow';
grant all privileges on airflow.* to airflow@'%';
flush privileges;
set global explicit_defaults_for_timestamp = 1;
Airflow 설치
Airflow 패키지 설치
pip3 install -r requirements.txt
airflow 1.10.10 설치 기준으로 requirements.txt
는 다음과 같다.
cat requirements.txt
alembic==1.4.2
amqp==2.5.2
apache-airflow==1.10.10
apispec==1.3.3
argcomplete==1.11.1
attrs==19.3.0
Babel==2.8.0
billiard==3.6.3.0
cached-property==1.5.1
cattrs==0.9.2
celery==4.4.2
certifi==2020.4.5.1
cffi==1.14.0
chardet==3.0.4
click==7.1.2
colorama==0.4.3
colorlog==4.0.2
configparser==3.5.3
croniter==0.3.31
cryptography==2.9.2
defusedxml==0.6.0
dill==0.3.1.1
dnspython==1.16.0
docutils==0.16
email-validator==1.1.0
Flask==1.1.2
Flask-Admin==1.5.4
Flask-AppBuilder==2.3.4
Flask-Babel==1.0.0
Flask-Caching==1.3.3
Flask-JWT-Extended==3.24.1
Flask-Login==0.4.1
Flask-OpenID==1.2.5
Flask-SQLAlchemy==2.4.1
flask-swagger==0.2.13
Flask-WTF==0.14.3
funcsigs==1.0.2
future==0.18.2
graphviz==0.14
gunicorn==19.10.0
idna==2.9
importlib-metadata==1.6.0
iso8601==0.1.12
itsdangerous==1.1.0
Jinja2==2.10.3
json-merge-patch==0.2
jsonschema==3.2.0
kombu==4.6.8
lazy-object-proxy==1.4.3
ldap3==2.7
lockfile==0.12.2
Mako==1.1.2
Markdown==2.6.11
MarkupSafe==1.1.1
marshmallow==2.21.0
marshmallow-enum==1.5.1
marshmallow-sqlalchemy==0.23.0
mysqlclient==1.4.6
numpy==1.18.4
pandas==0.25.3
pendulum==1.4.4
prison==0.1.3
psutil==5.7.0
pyasn1==0.4.8
pyasn1-modules==0.2.8
pycparser==2.20
Pygments==2.6.1
PyJWT==1.7.1
PyMySQL==0.9.3
pyrsistent==0.16.0
python-daemon==2.1.2
python-dateutil==2.8.1
python-editor==1.0.4
python-ldap==3.2.0
python3-openid==3.1.0
pytz==2020.1
pytzdata==2019.3
PyYAML==5.3.1
requests==2.23.0
setproctitle==1.1.10
six==1.14.0
SQLAlchemy==1.3.17
SQLAlchemy-JSONField==0.9.0
SQLAlchemy-Utils==0.36.5
tabulate==0.8.7
tenacity==4.12.0
termcolor==1.1.0
text-unidecode==1.2
thrift==0.13.0
typing-extensions==3.7.4.2
tzlocal==1.5.1
unicodecsv==0.14.1
urllib3==1.25.9
vine==1.3.0
Werkzeug==0.16.1
WTForms==2.3.1
zipp==3.1.0
zope.deprecation==4.4.0
패키지 설치가 완료되면, 파이썬 바이너리 경로에 airflow 스크립트가 생성되면서 airflow
명령을 수행할 수 있다. 초기 설정 파일들을 불러오기 위해 initdb
수행하면
airflow initdb
$AIRFLOW_HOME
경로에 로그, sqlite db 그리고 설정파일이 생성되는데 vim $AIRFLOW_HOME/airflow.cfg
파일에서 아래 항목들을 수정한다.
[core]
executor = LocalExecutor
sql_alchemy_conn = mysql+pymysql://airflow:airflow@localhost:3306/airflow
[webserver]
authenticate = True
rbac = True
변경된 repo DB 및 추가 설정파일을 로드하기 위해 다시한번 initdb
수행해주면
airflow initdb
rbac 활성화로 FAB 관련 설정 파일이 아래와 같이 생성된다.
vim $AIRFLOW_HOME/webserver_config.py
파일에 LDAP 정보를 입력해주고
# from flask_appbuilder.security.manager import AUTH_DB
from flask_appbuilder.security.manager import AUTH_LDAP
#AUTH_TYPE = AUTH_DB
AUTH_TYPE = AUTH_LDAP
AUTH_LDAP_SERVER = "ldap://centos:389"
AUTH_LDAP_USE_TLS = False #개발환경에 SSL 설정이 안 된 경우; ldaps 가 아닌 ldap 프로토콜
AUTH_LDAP_SEARCH = "ou=People,dc=centos"
AUTH_LDAP_BIND_USER = "uid=oboki,ou=People,dc=centos"
AUTH_LDAP_BIND_PASSWORD = "oboki"
다음 명령으로 웹서버와 스케줄러를 실행하면 기본적은 설정은 끝
airflow webserver -D
airflow scheduler
웹서버에서 다음과 같은 로그가 나오면
{manager.py:710} WARNING - No user yet created, use flask fab command to do it.
AUTH_DB 와는 다르게 LDAP 시스템과 연동된 사용자를 등록해주어야 하는데 패스워드는 ldap 에서 관리를 하기때문에 --use_random_password
옵션으로 임의의 패스워드 값을 저장해두면 된다. (패스워드를 지정하더라도 상관없고 어차피 사용하지 않을 값)
airflow create_user -r Admin -u oboki -e oboki@example.com -f oboki -l " " --use_random_password
Admin 사용자만 등록하면 이후 다른 사용자들은 Web UI 이용해서 관리할 수 있다.