Kerberos 인증 설정과 운영상 주의점
Apache Airflow Official Documentation (in-repo snapshot) — Apache Software Foundation security/kerberos.rst (전체)
이 모듈을 다 읽으면
- Airflow의 Kerberos 지원 범위와 한계(웹 인터페이스 미통합, Celery 미검증)를 설명할 수 있다
- keytab 생성부터 airflow.cfg 설정까지 Kerberos 활성화 절차를 순서대로 설명할 수 있다
- 기본 ccache 위치가 world-readable이라는 문제와 그 하드닝 방법을 설명할 수 있다
Airflow는 자체적으로 Kerberos 티켓을 갱신하고 캐시에 저장할 수 있지만, 이는 초기 수준의 지원이다. 웹 인터페이스에는 통합되어 있지 않고 일부 hook만 지원하며, 기본 ccache 위치는 world-readable이라 별도 하드닝이 필요하다.
Kerberos 지원 범위와 한계
Airflow는 Kerberos에 대한 초기 수준의 지원을 갖고 있다. 이는 Airflow가 스스로 Kerberos 티켓을 갱신하고 티켓 캐시에 저장할 수 있다는 뜻이며, hook과 Dag는 이 티켓을 이용해 kerberize된 서비스에 인증할 수 있다.
다만 현재 모든 hook이 이 기능을 활용하도록 조정되어 있지는 않다. 또한 Kerberos는 웹 인터페이스에는 통합되어 있지 않으므로, 당분간은 서비스를 안전하게 유지하기 위해 네트워크 레벨 보안에 의존해야 한다. Celery 연동은 아직 시도되고 검증되지 않았다 - 다만 호스트마다 keytab을 생성하고 워커 옆에 티켓 갱신기를 띄운다면 동작할 가능성이 높다고 문서는 설명한다.
핵심 포인트
- Airflow는 자체 Kerberos 티켓 갱신/캐시 저장을 지원하며 hook/Dag가 이를 이용해 인증할 수 있다
- 모든 hook이 Kerberos를 지원하도록 조정된 것은 아니다
- 웹 인터페이스에는 Kerberos가 통합되어 있지 않아 네트워크 레벨 보안에 의존해야 한다
- Celery 연동은 검증되지 않았으나 호스트별 keytab + 티켓 갱신기 조합으로 동작할 가능성이 있다
Keytab 생성과 airflow.cfg 설정
Kerberos를 활성화하려면 먼저 서비스 keytab을 생성해야 한다. ``kadmin.local``이나 ``kadmin`` 셸에서 ``addprinc -randkey``로 Airflow principal을 만들고, ``xst -norandkey -k airflow.keytab``으로 keytab 파일을 추출한다. 이 파일은 Airflow 사용자가 읽을 수 있는 위치에 ``chmod 600``으로 저장해야 한다.
``airflow.cfg``에는 ``[core] security = kerberos``와 ``[kerberos]`` 섹션에 ``keytab``, ``reinit_frequency``, ``principal``을 설정한다. 도커 기반 환경에서는 ``airflow.cfg``를 수정하는 대신 ``AIRFLOW__CORE__SECURITY``, ``AIRFLOW__KERBEROS__KEYTAB``, ``AIRFLOW__KERBEROS__INCLUDE_IP`` 같은 환경 변수로도 동일하게 설정할 수 있다.
더 세밀한 옵션으로 ``ccache``(kinit 수행 후 ccache 파일 위치, 기본값 ``/tmp/airflow_krb5_ccache``), ``principal``(fqdn이 자동으로 덧붙여짐), ``reinit_frequency``, ``kinit_path``, ``keytab``, ``forwardable``(티켓을 forwardable 플래그로 만들지 여부, 기본 True), ``include_ip``(로컬 IP를 티켓에 포함할지 여부, 기본 True - 호스트 시스템 IP 뒤에 NAT된 VM 안에서 Airflow를 쓸 때 특히 유용)가 있다.
핵심 포인트
- keytab은 kadmin의 addprinc(principal 생성) → xst(keytab 추출) 순서로 만들고 chmod 600으로 보호해야 한다
- [core] security=kerberos와 [kerberos] keytab/reinit_frequency/principal이 핵심 설정이다
- 도커 환경에서는 AIRFLOW__CORE__SECURITY 등 환경 변수로 동일하게 설정 가능하다
- forwardable(기본 True)과 include_ip(기본 True, NAT된 VM에서 유용) 같은 세부 옵션이 있다
ccache 위치의 취약점과 하드닝
기본 ``ccache`` 위치인 ``/tmp/airflow_krb5_ccache``는 대부분의 유닉스 시스템에서 world-readable 디렉터리 안에 있다. 이는 같은 호스트의 다른 로컬 사용자가 Kerberos 자격증명 캐시를 읽거나 조작해 Airflow 서비스 principal을 사칭(impersonate)할 수 있다는 뜻이다. 프로덕션 배포에서는 ``ccache``를 Airflow 서비스 계정만 접근 가능한 디렉터리 - 예를 들어 ``/run/airflow/krb5_ccache``나 ``/var/lib/airflow/krb5_ccache`` 같은 서비스 전용 런타임 디렉터리 - 로 지정해야 하며, 이 디렉터리는 mode ``0700``으로 생성하고 Airflow 사용자가 소유해야 한다. keytab에 이미 적용하는 것과 동일한 원칙 - ``chmod 600`` - 을 적용해야 한다.
Kerberos 티켓은 ``kinit``으로 생성되며 기본적으로 로컬 ``krb5.conf``를 사용한다는 점도 유념해야 한다. 티켓 갱신기는 ``airflow kerberos`` 명령으로 실행하며, ``--one-time`` 플래그로 실행 모드를 선택할 수 있다: standard 모드(기본값)는 무한히 실행되며 몇 초마다 만료된 티켓을 갱신하고, one-time 모드는 한 번 실행 후 종료하며 실패 시 메인 태스크가 기동되지 않는다.
핵심 포인트
- 기본 ccache 위치(/tmp/airflow_krb5_ccache)는 world-readable이라 다른 로컬 사용자가 캐시를 읽거나 조작해 Airflow principal을 사칭할 위험이 있다
- 프로덕션에서는 ccache를 mode 0700의 Airflow 전용 런타임 디렉터리로 옮겨야 한다 - keytab과 동일한 원칙(chmod 600)을 적용하는 것
- airflow kerberos 명령은 standard(무한 실행, 주기적 갱신) 모드가 기본이며 --one-time으로 1회 실행 모드를 선택할 수 있다
Hadoop Impersonation과 Hive Hook 연동
Kerberos impersonation을 사용하려면 Hadoop ``core-site.xml``에서 ``hadoop.proxyuser.airflow.groups``, ``hadoop.proxyuser.airflow.users``, ``hadoop.proxyuser.airflow.hosts``를 활성화해야 한다(문서 예시는 모두 와일드카드 ``*``이며, 실제 보안 강화를 위해서는 이를 구체적인 값으로 좁혀야 한다).
Hive Hook은 Kerberos 인증을 활용하도록 업데이트되어 있다. Connection extra에 ``use_beeline``, ``principal``(``_HOST``는 서버의 정규화된 도메인 이름으로 치환됨)을 설정하면 되고, ``proxy_user``를 ``login``으로 설정하면 Connection의 로그인 사용자를, ``owner``로 설정하면 Dag owner를 프록시 사용자로 사용한다. HiveOperator 초기화 시 ``run_as_owner=True``로도 Dag owner 사용을 지정할 수 있다. Kerberos 인증을 쓰려면 ``pip install 'apache-airflow[kerberos]'``로 kerberos extras 그룹을 설치해야 한다.
핵심 포인트
- Hadoop impersonation은 core-site.xml의 hadoop.proxyuser.airflow.{groups,users,hosts} 설정으로 활성화하며, 운영 환경에서는 와일드카드 대신 구체적인 값으로 좁혀야 한다
- Hive Hook Connection extra에서 use_beeline/principal/proxy_user(login 또는 owner)로 Kerberos 인증 사용자를 지정할 수 있다
- Kerberos 인증을 쓰려면 apache-airflow[kerberos] extras를 설치해야 한다