세용용용용 2024. 9. 14. 16:43

 

Apache Airflow 기반의 데이터 파이프라인 공부한 후 정리한 내용 입니다!!!

 

  • airflow 접근을 방지하기 위한 핵심 사항 고려

 

 

1. RBAC 인터페이스 사용자 추가

(1-1) RBAC 역할

RBAC : 역할기반 접근 제어 ( 사용자가 특정 역할 기반으로 시스템 접근 )

# Airflow 데이터베이스 초기화 및 사용자 생성
RUN airflow db init && \
    airflow users create \
        --username admin \
        --password admin \
        --firstname sy \
        --lastname ju \
        --role Admin \
        --email admin@example.org

 

 

airflow RBAC 역할 종류

Admin: 모든 권한이 필요한 관리자
User: DAG 실행 권한이 필요한 일반 사용자
Op: DAG의 실행과 모니터링만 필요하고, DAG 편집이 필요 없는 운영자
Viewer: DAG을 보기만 해야 하는 사용자
Public: 로그인하지 않은 사용자가 매우 제한된 정보만 접근할 수 있도록 함

 

  • airflow ui > Security에서 역활 확인 가능

 

 

(1-2) RBAC 인터페이스 설정

webserver_config.py는 RBAC 인터페이스 기본 프레임워크 구성이 포함

APP_THEME="sandstone.css" #설정시 테마 변경

 

그외.. 다양한 테마 존재

 

 

 

2. 미사용 데이터 암호화

  • airflow 웹 서버는 미 초대 게스트에 잠재적 액세스 경로 제공.. 이를 보호함으로 공격 가능성을 낮추는 방법

 

(2-1) Fernet Key 생성

  • airflow는 Fernet Key를 사용해 보안 사항을 암호화 및 복호화

1) Fernet 키 생성
python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"

2) 항목을 설정해 airflow에 제공
AIRFLOW__CORE__FERNET_KEY = ....

3) airflow.cfg 파일에서 fernet_key 항목에 설정

airflow.cfg

  • Fernet key 사용시 민감한 정보를 암호화해 database에 저장가능

 

3. LDAP 서비스로 연결

  • airflow를 기존 사용자 관리 시스템에 연결
  • 디렉터리 서비스 사용 ( Azure AD, OpenLDAP 과 같은 LDAP 프로토콜 지원 서비스 사용 )

LDAP 

  • 디렉터리 서비스 : 네트워크 내의 자원에 대한 정보를 조직하고, 관리하는 서비스입니다. LDAP는 이러한 디렉터리 서비스에 접근하는 표준 프로토콜

 

  • airflow 로그인시 백그라운드 LDAP 서비스에서 사용자 정보 가져옴
  • 사용자 정보는 디렉터리 서비스에 저장

(3-1) 디렉터리 서비스

데이터 및 정보를 조직하고, 관리하는 서비스

LDAP 이러한 디렉터리 서비스를 쿼리하는데 사용

트리구조 데이터 저장

디렉터리 서비스 구조

DN : 각 항목의 고유 경로, 트리 구조에서 그 항목의 위치
DC : 도메인
CN : 사용자의 이름입니다.
OU : 조직 단위, 항목을 그룹화

 

 

디렉터리 서비스 & 관계형 데이터베이스 차이

1) 디렉터리 서비스
트리 구조를 사용해 데이터를 계층적으로 저장, 빠른 읽기 전용 검색에 최적화

2) 관계형 데이터베이스
테이블 구조로 데이터를 저장하고, SQL 쿼리를 통해 복잡한 읽기와 쓰기 작업을 지원
CRUD(생성, 읽기, 업데이트, 삭제) 작업에 최적화

 

 

LDAP 작업 개요

## LDAP 작업 명령어
Abandon : 이전 요청 작업 중단
Add : 새 항목 만듬
Bind : 지정 사용자 id로 변경해 디렉터리 서비스 특정 작업 수행 ( 디렉터리 서비스 연결 )
Compare : 주어진 항목에 주어진 속성값 포함 확인
Delete : 항목 제거
Exetended : LDAP 표준에 정의 되지 않지만, 디렉터리 서비스 사용할 수 있는 작업 요청
Modify DN : 항목의 DN 변경
Modfiy : 항목 속성 편집
Search : 기준과 일치하는 항목을 검색하고 반환
Unbind : 디렉터리 서비스 연결 닫음

## LDAP 검색
ldapsearch -b "dc=apacheairflow,dc=com" "(uid=bsmith)"
>>> dc=apacheairflow, dc=com, uid=bsmith 값 나열
>>> ldap와 통신하는 ap는 이런 검색을 수행하여 값을 가져옴

 

 

(3-2) LDAP 서비스에서 사용자 가져오기

  • LDAP인증은 FAB을 통해 지원하므로 airflow webserver_config.py에 구성
  • airflow 웹서버 구성시 ldap 서비스는 주어진 사용자 이름과 비번 검색
from flask_appbuilder.security.manager import AUTH_LDAP

AUTH_TYPE=AUTH_LDAP # 인증 타입 LDAP로 설정
AUTH_USER_REGISTRATION=True # 처음 로그인시 Airflow 내에서 해당 사용자의 계정이 자동으로 생성
AUTH_USER_REGISTRATION_ROLE = "User" # 기본 역할

AUTH_LDAP_SERVER="~~~" # LDAP 서버
AUTH_LDAP_USE_TLS=False
AUTH_LDAP_SEARCH = "dc=apacheairflow,dc=com" # LDAP 검색

# 바인드할 사용자
AUTH_LDAP_BIND_USER = "cn=admin,dc=apacheairflow,dc=com" 
AUTH_LDAP_BIND_PASSWORD = "admin"

AUTH_LDAP_UID_FIELD = "uid" # LDAP 필드 이름

 

  • LDAP 설정시 중앙에서 airflow 사용자 관리 가능!!
  • 즉, 애플리케이션은 자신이 관리하지 않고 LDAP 서비스에 사용자 자격 증명 가능

 

4. 웹 서버에 대한 트래픽 암호화

  • 침입자는 시스템간 데이터 전송중 시점에도 데이터 탈취 가능.. ㅠㅠ

MITM

  • MITM은 사용자&airflow 사이 트래픽을 가로채고 인식하지 못하도록 다시 사용자에 전달

 

(4-1) HTTPS

HTTP, HTTPS 차이

http : 웹사이트 탐색시 요청id 확인을 위해 양쪽에 어떤 검사도 수행하지 않음
https : 웹사이트 탐색시 통신을 위한 핸드세이크 초기 원격 측의 유효성 확인을 위한 많은 단계가 포함

https 초기 핸드셰이크

  • TLS 사용 (전송 계층 보안)

 

(4-2) HTTPS 인증서 구성

  • airflow 웹서버를 https 환경으로 구성해 한쪽 끝에서 암호화, 반대 쪽 끝에서 복호화 되는 환경을 구성
  • 엔드 포인트 웹서버를 보호에 두 가지 필요 ( 개인키 , 인증서 )
1) 자체서명 인증서 만들기
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout airflow_key.pem -out airflow_cert.pem

2) airflow에 인증서, 키 경로 지정 ( airflow.cfg )
AIRFLOW__WEBSERVER__WEB_SERVER_SSL_CERT = /opt/airflow/pem_dir/airflow_cert.pem
AIRFLOW_WEEBSERVER__WEB_SERVER_SSL_KEY = /opt/airflow/pem_dir/airflow_key.pem

 

http://192.168.219.20:9898 더이상 접속 안됨

192.168.219.20:9898 접속 화면

 

https://192.168.219.20:9898 접속

 

  • 자체 서명 인증서 이기에 경고문구를 확인
  • 경고 문구를 없애기 위해선 신뢰할수 있는 기관에서 인증서 발급해야됨

 

5. 시크릿 관리 시스템에서 자격 증명 가져오기

  • 중앙 시크릿 저장 시스템에 기밀 저장( 암호, 인증서, 키)후 각각의 애플리케이션에 보안사항 저장하지 않고 필요시 중앙 시스템에 요청가능
  • airflow는 시크릿 백엔드는 시크릿 스토리지 연결하기 위한 서브클래스 구성할수있는 클래스 제공
  • 시크릿 백엔드 구성을 위해선 airflow.cfg파일에 secrets_backend 관련 설정 추가
  • conn_id를 통해 연결할당
  • 시크릿 백엔드를 통해 기밀정보 저장 및 관리를 별도의 시스템이서 구성가능
  • 각 애플리케이션은 기밀관련 정보를 자체 보관할 필요 없음 ( 필요시 시크릿 백엔드에 요청 )