Kerberos 인증 설정과 구성
Kerberos 인증 설정과 구성 (Kerberos Authentication Setup and Configuration)
이 문서는 다양한 배포 메커니즘(Standalone, 네이티브 Kubernetes, YARN), 파일 시스템, 커넥터, 상태 백엔드의 맥락에서 Flink 보안이 어떻게 동작하는지 간략하게 설명합니다.
출처: 문서
본문
이 문서는 다양한 배포 메커니즘(Standalone, 네이티브 Kubernetes, YARN), 파일 시스템, 커넥터, 상태 백엔드의 맥락에서 Flink 보안이 어떻게 동작하는지 간략하게 설명합니다.
목표 (Objective)
Flink Kerberos 보안 인프라의 주요 목표는 다음과 같습니다:
- 커넥터(예: Kafka)를 통해 클러스터 내 작업에 보안 데이터 접근을 가능하게 한다
- ZooKeeper 에 인증한다 (SASL 을 사용하도록 구성된 경우)
- Hadoop 컴포넌트(예: HDFS, HBase)에 인증한다
프로덕션 배포 시나리오에서 스트리밍 작업은 오랜 기간(수 일/주/월) 실행되는 것으로 이해되며 작업 수명 동안 보안 데이터 소스에 인증할 수 있어야 합니다. Kerberos keytab 은 자격 증명 캐시나 Hadoop delegation token 과 달리 그 시간 범위 내에서 만료되지 않습니다.
현재 구현은 다음으로 Flink 클러스터(JobManager / TaskManager / 작업)를 실행하는 것을 지원합니다:
- Keytab 파일 (권장)
- 자격 증명 캐시 (예:
kinit로 만든 자격 증명 캐시 파일) - Hadoop delegation token (사용자가 제공한 토큰은 갱신되지 않으며 Flink 에 의해 덮어써질 수 있음)
모든 작업이 특정 클러스터에 구성된 자격 증명을 공유한다는 점을 명심하세요. 특정 작업에 다른 keytab 을 사용하려면 다른 구성으로 별도의 Flink 클러스터를 실행하면 됩니다. Kubernetes 또는 YARN 환경에서는 수많은 Flink 클러스터가 나란히 실행될 수 있습니다.
Flink 보안의 동작 방식
개념적으로 Flink 프로그램은 1차 또는 3자 커넥터(Kafka, HDFS, Cassandra, Flume, Kinesis 등)를 사용할 수 있으며, 임의의 인증 방법(Kerberos, SSL/TLS, 사용자 이름/비밀번호 등)이 필요할 수 있습니다. 모든 커넥터의 보안 요구사항을 충족시키는 것은 계속 진행 중인 작업이지만, Flink 는 Kerberos 인증에 대해서만 일급(first-class) 지원을 제공합니다. Kerberos 인증을 위해 지원되는 서비스와 커넥터는 다음과 같습니다:
- Kafka (0.9+)
- HDFS
- HBase
- ZooKeeper
각 서비스 또는 커넥터에 대해 Kerberos 사용을 독립적으로 활성화할 수 있다는 점에 유의하세요. 예를 들어 사용자는 ZooKeeper 에 Kerberos 를 사용할 필요 없이 Hadoop 보안을 활성화할 수 있으며, 그 반대도 가능합니다. 공유되는 요소는 Kerberos 자격 증명의 구성이며, 이를 각 컴포넌트가 명시적으로 사용합니다.
내부 아키텍처는 시작 시 설치되는 보안 모듈(org.apache.flink.runtime.security.modules.SecurityModule 구현)을 기반으로 합니다. 다음 섹션에서 각 보안 모듈을 설명합니다.
Hadoop 보안 모듈
이 모듈은 Hadoop 의 UserGroupInformation (UGI) 클래스를 사용해 프로세스 전반의 login user 컨텍스트를 설정합니다. login user 는 그 후 HDFS, HBase, YARN 을 포함한 Hadoop 과의 모든 상호작용에 사용됩니다.
Hadoop 보안이 활성화되면(core-site.xml 에서) login user 는 구성된 Kerberos 자격 증명을 가지게 됩니다. 그렇지 않으면 login user 는 클러스터를 시작한 OS 계정의 사용자 ID만 전달합니다. 구체적으로 로그인 과정은 다음 우선순위 순서를 갖습니다:
hadoop.security.authentication이kerberos로 설정된 경우security.kerberos.login.keytab과security.kerberos.login.principal이 구성되면 keytab 로그인이 수행됨security.kerberos.login.use-ticket-cache가 구성되면 자격 증명 캐시 로그인이 수행됨- 그 외 모든 경우 OS 계정의 사용자 ID가 사용됨
JAAS 보안 모듈
이 모듈은 클러스터에 동적 JAAS 구성을 제공해 구성된 Kerberos 자격 증명을 ZooKeeper, Kafka 및 JAAS 에 의존하는 기타 컴포넌트에서 사용 가능하게 합니다.
사용자는 Java SE 문서에 설명된 메커니즘을 사용해 정적 JAAS 구성 파일을 제공할 수도 있습니다. 정적 항목은 이 모듈이 제공하는 동적 항목을 덮어씁니다.
ZooKeeper 보안 모듈
이 모듈은 특정 프로세스 전반의 ZooKeeper 보안 관련 설정, 즉 ZooKeeper 서비스 이름(기본값: zookeeper)과 JAAS 로그인 컨텍스트 이름(기본값: Client)을 구성합니다.
배포 모드 (Deployment Modes)
각 배포 모드에 특화된 몇 가지 정보는 다음과 같습니다.
Standalone 모드
standalone/cluster 모드에서 보안 Flink 클러스터를 실행하는 단계:
- Flink 구성 파일(모든 클러스터 노드에서)에 보안 관련 구성 옵션을 추가합니다 (여기 참고).
- keytab 파일이 모든 클러스터 노드의
security.kerberos.login.keytab이 가리키는 경로에 존재하는지 확인합니다. - 평소대로 Flink 클러스터를 배포합니다.
네이티브 Kubernetes 및 YARN 모드
네이티브 Kubernetes 및 YARN 모드에서 보안 Flink 클러스터를 실행하는 단계:
- 클라이언트의 Flink 구성 파일에 보안 관련 구성 옵션을 추가합니다 (여기 참고).
- keytab 파일이 클라이언트 노드의
security.kerberos.login.keytab이 가리키는 경로에 존재하는지 확인합니다. - 평소대로 Flink 클러스터를 배포합니다.
YARN 및 네이티브 Kubernetes 모드에서는 keytab 이 클라이언트에서 Flink 컨테이너로 자동으로 복사됩니다.
Kerberos 인증을 활성화하려면 Kerberos 구성 파일도 필요합니다. 이 파일은 클러스터 환경에서 가져오거나 Flink 가 업로드할 수 있습니다. 후자의 경우 security.kerberos.krb5-conf.path 를 구성해 Kerberos 구성 파일의 경로를 지정해야 하며, Flink 는 이 파일을 컨테이너/파드에 복사합니다.
자세한 내용은 YARN security 문서를 참고하세요.
사용자 자격 증명 캐시(kinit) 사용하기
사용법에 앞서 알아야 할 중요한 사항:
- 자격 증명 캐시는 여러 형태로 표현될 수 있으며, 가장 흔한 형태는
FILE입니다. 자세한 내용은 Kerberos ccache types 를 읽어보세요. 자격 증명 캐시가 Kerberos 인증이 수행되는 모든 클러스터 노드에서 사용 가능한지 확인하세요. - 자격 증명 캐시는 주로
kinit명령을 실행해 생성할 수 있습니다. - keytab 과의 중요한 차이점: keytab 은 만료되지 않도록 생성될 수 있지만 자격 증명 캐시는 만료 날짜가 있습니다. 자격 증명 캐시를 최신 상태로 유지하는 것은 전적으로 사용자의 책임입니다.
keytab 없이 자격 증명 캐시만 사용해 보안 Flink 클러스터를 배포할 수 있습니다.
kinit 을 사용해 보안 Flink 클러스터를 실행하는 단계:
- 클라이언트의 Flink 구성 파일에 보안 관련 구성 옵션을 추가합니다 (여기 참고).
kinit명령을 사용해 로그인합니다.- 선택 사항: 자격 증명 캐시를 Kerberos 인증이 수행되는 모든 클러스터 노드에서 사용 가능하게 합니다.
- 평소대로 Flink 클러스터를 배포합니다.
추가 세부 사항 (Further Details)
TGT 갱신
Kerberos 를 사용하는 각 컴포넌트는 Kerberos 티켓 부여 티켓(TGT)을 갱신할 책임이 있습니다. 모든 컴포넌트는 keytab 이 제공되면 TGT 를 자동으로 갱신하지만, 자격 증명 캐시를 사용할 때는 사용자 책임입니다.
delegation token 사용하기
Flink 1.17 에서 delegation token 지원이 실험적 기능으로 추가되었습니다. 이는 상당히 무거운 주제이므로 일반적인 delegation token 정보 페이지 가 있습니다.
Hadoop 기반 서비스와 통신할 때 Flink 는 비로컬 프로세스가 인증할 수 있도록 delegation token 을 획득할 수 있습니다. 지원 대상:
- HDFS 및 기타 Hadoop 파일 시스템
- HBase
Hadoop 파일 시스템(예: HDFS 또는 WebHDFS)을 사용할 때 Flink 는 다음 디렉터리에 대한 관련 토큰을 획득할 수 있습니다:
- Hadoop 기본 파일 시스템
security.kerberos.access.hadoopFileSystems에 구성된 파일 시스템- YARN 스테이징 디렉터리
HBase 가 애플리케이션 클래스패스에 있고 HBase 구성에 Kerberos 인증이 켜져 있으면(hbase.security.authentication=kerberos) HBase 토큰이 획득됩니다.
Flink 는 또한 Java Services 메커니즘(java.util.ServiceLoader 참고)을 사용해 사용자 정의 delegation token 제공자를 지원합니다. org.apache.flink.runtime.security.token.DelegationTokenProvider 의 구현은 해당 이름을 jar 의 META-INF/services 디렉터리의 해당 파일에 나열함으로써 Flink 에 제공할 수 있습니다.