Apache Ranger 보안

Apache Ranger 보안

druid-ranger-security 확장은 Apache Ranger를 백엔드로 사용하는 Authorizer를 추가해 Druid에 대한 접근 제어(access control)를 구현해요. 이 글에서는 확장을 설정하고, Ranger 연결을 구성하며, Ranger에 Druid 서비스 정의를 등록하는 방법을 다룰게요.

출처: 문서

본문

이 Apache Druid 확장은 Apache Ranger를 백엔드로 사용해 Druid에 대한 접근 제어를 구현하는 Authorizer를 추가해요. 이 확장이 제공하는 기본 기능에 대한 자세한 내용은 Authentication and Authorization 문서를 참고해 주세요.

extensions load list에 druid-ranger-security를 반드시 포함해 주세요.

druid-ranger-security

Configuration

Apache Ranger 인가(Authorization) 지원은 세 가지 요소로 구성돼요.

  1. Apache Druid에서 확장을 설정하기
  2. Apache Ranger로의 연결을 구성하기
  3. Druid용 서비스 정의를 Apache Ranger에 제공하기

Enabling the extension

common.runtime.properties에 유효한 authenticator chain과 escalator가 설정되어 있는지 확인해 주세요. authorizer를 사용하려는 각 authenticator에 대해 druid.auth.authenticator.<authenticatorName>.authorizerName을 authorizer에 줄 이름(예: ranger)으로 설정해요.

그다음 아래를 추가하고 필요에 따라 수정해 주세요 (여러 authorizer를 사용해야 한다면요):

druid.auth.authorizers=["ranger"]
druid.auth.authorizer.ranger.type=ranger

다음은 인증(authentication)에 druid-basic-security를, 인가(authorization)에 druid-ranger-security를 사용하는 예시예요.

druid.auth.authenticatorChain=["basic"]
druid.auth.authenticator.basic.type=basic
druid.auth.authenticator.basic.initialAdminPassword=password1
druid.auth.authenticator.basic.initialInternalClientPassword=password2
druid.auth.authenticator.basic.credentialsValidator.type=metadata
druid.auth.authenticator.basic.skipOnFailure=false
druid.auth.authenticator.basic.enableCacheNotifications=true
druid.auth.authenticator.basic.authorizerName=ranger

druid.auth.authorizers=["ranger"]
druid.auth.authorizer.ranger.type=ranger

# Escalator
druid.escalator.type=basic
druid.escalator.internalClientUsername=druid_system
druid.escalator.internalClientPassword=password2
druid.escalator.authorizerName=ranger

info — druid-basic-auth 문서와는 달리, Ranger는 높은 권한의 시스템 유저를 자동으로 프로비저닝하지 않아요. 직접 만들어야 해요. druid-basic-auth의 경우 이 시스템 유저는 druid_system이라고 불러요. escalator의 경우 위에서처럼 설정 가능해요. 이 유저 이름들을 잘 기억하고, Ranger 정책에서 state:STATE와 config:security에 대한 READ 접근을 구성해 주세요. 그렇지 않으면 시스템 서비스가 제대로 동작하지 않아요.

Properties to configure the extension in Apache Druid

속성 설명 기본값 필수
druid.auth.ranger.keytab Apache Ranger에 인증하여 정책을 얻고 감사(auditing)를 제공할 때 사용할 keytab을 정의해요. null No
druid.auth.ranger.principal Apache Ranger에 인증하여 정책을 얻고 감사를 제공할 때 사용할 principal을 정의해요. null No
druid.auth.ranger.use_ugi 인증된 사용자가 속한 그룹을 Hadoop의 UserGroupInformation에서 가져올지 여부를 결정해요. null No

Configuring the connection to Apache Ranger

Apache Ranger 인가 확장은 몇 가지 설정 파일을 읽어요. 이 파일들의 내용을 다루는 것은 이 문서의 범위를 벗어나요. 필요에 따라 직접 만들어야 해요. 최소한 classpath(예: _common)에 넣어야 하는 ranger-druid-security.xml 파일이 필요해요. 감사(auditing)를 위한 구성은 ranger-druid-audit.xml에 있어요.

Adding the service definition for Apache Druid to Apache Ranger

이 문서를 작성하는 시점에 Apache Ranger(2.0)는 Druid용 서비스와 서비스 정의를 기본 제공하지 않아요. 다음 명령을 실행해 서비스 정의를 Apache Ranger에 추가할 수 있어요.

curl -u <user>:<password> -d "@ranger-servicedef-druid.json" -X POST -H "Accept: application/json" -H "Content-Type: application/json" http://localhost:6080/service/public/v2/api/servicedef/

방금 추가한 서비스 정의를 기술하는 json을 돌려받을 거예요. 이제 Apache Ranger 웹 인터페이스에 "Druid" 위젯이 생길 거예요. 더하기 기호를 클릭해 새 서비스를 만들어 주세요. 서비스 이름이 ranger-druid-security.xml에 설정한 값과 같은지 확인해요.

Configuring Apache Ranger policies

Apache Ranger에서 새 Druid 서비스를 처음 설치할 때, Ranger는 관리 사용자가 모든 속성과 데이터 소스에 read/write 접근할 수 있는 정책을 프로비저닝해요. 이를 제한하고 싶을 수 있어요. druid_system 유저와 escalator의 internalClientUserName에 대한 올바른 정책도 추가하는 걸 잊지 마세요.

info — 새 데이터 소스를 로드하려면 로딩 자체 이전에 datasource에 대한 write 접근이 필요해요. wikipedia라는 데이터 소스를 만들고 싶다면, 스펙을 로드하기 전에 Apache Ranger 안에 allow 정책이 있어야 해요.

Usage

HTTP methods

특정 요청 엔드포인트에서 지원되는 HTTP 메서드에 대한 정보는 API documentation을 참고해 주세요. GET은 READ 권한을, POST와 DELETE는 WRITE 권한을 요구해요.

SQL Permissions

Druid 데이터 소스에 대한 질의는 해당 데이터 소스에 대한 DATASOURCE READ 권한을 요구해요.

INFORMATION_SCHEMA 테이블에 대한 질의는 호출자가 DATASOURCE READ 접근 권한을 가진 데이터 소스에 대한 정보만 반환해요. 다른 데이터 소스는 생략돼요.

system schema 테이블에 대한 질의는 다음 권한을 요구해요.

  • segments: DATASOURCE READ 권한에 따라 세그먼트가 필터링돼요.
  • servers: 사용자에게 STATE READ 권한이 필요해요.
  • server_segments: 사용자에게 STATE READ 권한이 필요하고, DATASOURCE READ 권한에 따라 세그먼트가 필터링돼요.
  • tasks: DATASOURCE READ 권한에 따라 태스크가 필터링돼요.

Debugging

특정 요소에 대한 접근이 거부되는 이유를 파악하는 데 어려움이 있고, Apache Ranger의 audit 섹션이 아무 정보도 주지 않는다면, org.apache.druid.security.ranger에 대한 디버그 로깅을 활성화할 수 있어요. log4j2.xml에 다음을 추가해 주세요.

<!-- Set level="debug" to see access requests to Apache Ranger -->
<Logger name="org.apache.druid.security" level="debug" additivity="false">
  <AppenderRef ref="Console"/>
</Logger>

더 알아보기 (Learn more)