0%

Apache Ranger 설치 in Docker (1)

하둡 에코시스템 중 하나인 Apache Ranger 설치 방법을 정리합니다.

Apache Ranger

레인저(ranger)는 하둡 에코시스템에서 종합적인 데이터 보안을 활성화하고 관리할 수 있는 도구이다. 특정 그룹과 사용자에 따라 데이터 접근 권한을 관리하고 감사 로그를 관리할 수 있다. Ldap 프로토콜로 Directory 서비스에서 그룹/사용자 정보를 가져올 수 있으며, 정책 또한 Tag 기반 관리가 가능하다.

아래 사진은 레인저 아키텍처이다.

ranger

Ranger admin

ranger-admin은 엑세스 정책을 생성 및 관리하는 UI 인터페이스이다. 아래 사진처럼 다양한 플랫폼에 플러그인을 설치하여 어드민 웹페이지에서 관리할 수 있다.

rangeradmin

또한 audit 페이지에서는 로그인 이력이나 엑세스 로그 뿐만 아니라 ranger-usersync에서 전달해주는 사용자 목록도 확인할 수 있다.

adminaudit

Ranger usersync

ranger-usersync는 유저정보를 생성 및 관리하여 ranger-admin에게 전달하는 프로세스이다. 기본 설정에서는 ranger-usersync서버에 있는 Unix 계정을 사용자로 전달하며, AD와 연동하여 그룹/사용자 정보를 가져오도록 변경할 수도 있다.

설치 가이드

이번 설치 가이드에서는 현재 최신버전인 Ranger 2.4.0 버전을 설치하고자 한다. 해당 버전의 경우 dockerhub에 도커 이미지가 없어서 소스 코드를 다운로드 받아 직접 이미지를 빌드하고 실행할 것이다. 또한 Ranger를 사용하기 위해서는 시스템 매트릭을 저장하는 RDB와 audit을 저장 및 관리하는 검색엔진이 필요하다. 따라서 이번 설치 가이드에서는 아래 조건을 바탕으로 진행된다.

  • Ranger 올릴 서버(AWS EC2)
    • OS: Linux 기반
    • Docker 설치
    • Git 설치 (선택)
  • RDB: Mysql(AWS RDS)
  • AUDIT: Elasticsearch(AWS OpenSearch)
  • LDAP: AD(AWS simple AD)

위 목록을 바탕으로 구성된 아키텍처는 다음과 같다.

architecture

Ranger 소스코드 다운로드

먼저 소스 코드를 다운로드 받는다. 소스코드를 다운받는 방법은 크게 3가지가 있다.

  1. git clone으로 다운로드 받기
    가장 간단한 방법은 깃허브에 레파지토리를 clone해오는 것이다.
1
$ git clone --depth 1 --branch release-ranger-2.4.0 https://github.com/apache/ranger.git
  1. wget 명령어로 다운로드 받기
    두 번째 방법으로는 apache 페이지에서 wget으로 다운로드 파일을 가져오는 것이다.
1
$ wget https://downloads.apache.org/ranger/2.4.0/apache-ranger-2.4.0.tar.gz

이렇게 다운받은 경우 tar.gz로 묶여있기 때문에 압축을 해제해야 한다.

1
2
## 압축 해제 후 폴더 이름 변경
$ tar xzvf apache-ranger-2.4.0.tar.gz && mv apache-ranger-2.4.0 ranger
  1. apache 페이지에서 직접 다운로드 받기
    폐쇄망처럼 wget으로 바로 다운받기 힘든 경우 apache 페이지에서 버전에 맞게 소스코드를 다운받을 수 있다.

소스코드를 다운로드 받는 이유

보통은 로컬에 코드를 다운로드 하지 않고 dockerfile에서 다운 받아 바로 빌드할 수 있도록 한다. 하지만 레인저의 경우 소스코드 내에 수많은 플러그인이 존재하는데 이 모든 것을 빌드할 필요도 없으며, 유지보수가 안되는 플러그인은 종종 빌드 에러의 원인이 된다.

버전 2.4.0의 경우에도 소스코드를 바로 빌드했더니 아래와 같은 에러가 발생했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for ranger 2.4.0:
[INFO]
[INFO] ranger ............................................. SUCCESS [ 14.037 s]
[INFO] Jdbc SQL Connector ................................. SUCCESS [ 9.003 s]
[INFO] Credential Support ................................. SUCCESS [04:17 min]
[INFO] Audit Component .................................... SUCCESS [03:43 min]
[INFO] ranger-plugin-classloader .......................... SUCCESS [ 3.238 s]
.
.
.
[INFO] Ranger Examples - SampleApp ........................ SUCCESS [ 2.758 s]
[INFO] Ranger Examples - Ranger Plugin for SampleApp ...... SUCCESS [ 4.129 s]
[INFO] sample-client ...................................... SUCCESS [ 4.387 s]
[INFO] Apache Ranger Examples Distribution ................ SUCCESS [ 3.275 s]
[INFO] Ranger Tools ....................................... SUCCESS [ 18.098 s]
[INFO] Kylin Security Plugin .............................. FAILURE [07:55 min]
[INFO] Kylin Security Plugin Shim ......................... SKIPPED
[INFO] Elasticsearch Security Plugin Shim ................. SKIPPED
[INFO] Elasticsearch Security Plugin ...................... SKIPPED
[INFO] Apache Ranger Distribution ......................... SKIPPED
[INFO] Unix Native Authenticator .......................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:08 h
[INFO] Finished at: 2023-04-06T06:03:07Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project ranger-kylin-plugin: Could not resolve dependencies for project org.apache.ranger:ranger-kylin-plugin:jar:2.4.0: Failed to collect dependencies at org.apache.kylin:kylin-server-base:jar:3.1.3 -> org.apache.kylin:kylin-query:jar:3.1.3 -> org.apache.kylin:kylin-datasource-sdk:jar:3.1.3 -> org.apache.calcite:calcite-linq4j:jar:1.16.0-kylin-r5: Failed to read artifact descriptor for org.apache.calcite:calcite-linq4j:jar:1.16.0-kylin-r5: Could not transfer artifact org.apache.calcite:calcite-linq4j:pom:1.16.0-kylin-r5 from/to spring-snapshots (https://repo.spring.io/libs-snapshot): Authentication failed for https://repo.spring.io/libs-snapshot/org/apache/calcite/calcite-linq4j/1.16.0-kylin-r5/calcite-linq4j-1.16.0-kylin-r5.pom 401 Unauthorized -> [Help 1]

Kylin이란 플랫폼 플러그인에서 발생하는 에러였고 나는 해당 플러그인이 필요하지 않았다. 그래서 pom.xml에서 해당 플러그인을 삭제하였다.

ranger-base docker images 빌드

이제 하나씩 빌드해보자. 먼저 내려받은 ranger 소스코드를 maven으로 빌드하려고 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
FROM centos:centos7 as base

RUN yum update -y \
&& yum -y install vim wget rpm-build which tar git gcc java-1.8.0-openjdk-devel \
&& yum clean all -y \
&& yum install python3 -y

ENV JAVA_HOME /usr/lib/jvm/java-openjdk
ENV RANGER_HOME /opt/ranger
ENV MAVEN_HOME /opt/maven
ENV RANGER_VERSION 2.4.0
ENV MAVEN_VERSION 3.6.3

ENV MAVEN_OPTS "-Xmx2048m -XX:MaxMetaspaceSize=512m"

RUN mkdir $MAVEN_HOME \
&& export http_proxy=$http_proxy \
&& wget -P $MAVEN_HOME https://dlcdn.apache.org/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz \
&& tar -xzvf $MAVEN_HOME/apache-maven-$MAVEN_VERSION-bin.tar.gz -C $MAVEN_HOME \
&& rm -f $MAVEN_HOME/apache-maven-$MAVEN_VERSION-bin.tar.gz

COPY ranger /opt/ranger

# Or you can use the binary from the official site: https://ranger.apache.org/download.html (currently no pre-built available)
RUN cd /opt/ranger \
&& $MAVEN_HOME/apache-maven-$MAVEN_VERSION/bin/mvn -Pall -DskipTests=true clean compile package install \
&& rm -rf ~/.m2 \
&& ls | grep -v target | xargs rm -rf \
&& rm -rf target/*.zip

FROM base

ENV MYSQL_CONNECTOR_JAVA_VERSION 5.1.41

RUN yum update -y \
&& yum -y install mysql \
&& yum clean all -y

RUN wget -P /opt https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-$MYSQL_CONNECTOR_JAVA_VERSION.tar.gz \
&& tar -zxvf /opt/mysql-connector-java-$MYSQL_CONNECTOR_JAVA_VERSION.tar.gz -C /opt \
&& rm -f /opt/mysql-connector-java-$MYSQL_CONNECTOR_JAVA_VERSION.tar.gz \
&& ln -s /opt/mysql-connector-java-$MYSQL_CONNECTOR_JAVA_VERSION/mysql-connector-java-$MYSQL_CONNECTOR_JAVA_VERSION-bin.jar /opt/mysql-connector-java.jar

위 도커파일을 그대로 레인저 서버에 옮긴 후 도커 이미지로 빌드한다.

1
$ docker build  . -t ranger-base:2.4.0

빌드는 대략 2-3시간 정도 소요된다. 그렇기에 가능하면 백그라운드로 실행하는 것을 추천한다.

1
$ nohup docker build . -t ranger-base:2.4.0 >> build.log &

ranger-admin docker images 빌드

다음으로는 아래 도커파일로 ranger-admin 이미지를 빌드한다.

1
2
3
4
5
6
7
8
9
FROM ranger-base:2.4.0

ENV RANGER_ADMIN_HOME /opt/ranger_admin

RUN tar -zxvf $RANGER_HOME/target/ranger-$RANGER_VERSION-admin.tar.gz -C /opt \
&& ln -s /opt/ranger-$RANGER_VERSION-admin $RANGER_ADMIN_HOME \
&& rm -rf $RANGER_HOME

WORKDIR $RANGER_ADMIN_HOME

이건 금방 빌드되기 떄문에 바로 실행해도 괜찮다.

1
$ docker build  . -t ranger-admin:2.4.0

ranger-usersync docker images 빌드

마지막으로 AD와의 연동을 위한 anger-usersync 이미지를 빌드한다.

1
2
3
4
5
6
7
8
9
FROM ranger-base:2.4.0

ENV RANGER_USERSYNC_HOME /opt/ranger_usersync

RUN tar -zxvf $RANGER_HOME/target/ranger-$RANGER_VERSION-usersync.tar.gz -C /opt \
&& ln -s /opt/ranger-$RANGER_VERSION-usersync $RANGER_USERSYNC_HOME \
&& rm -rf $RANGER_HOME

WORKDIR $RANGER_USERSYNC_HOME

도커파일 저장을 완료했다면 아래 명령어로 빌드하자.

1
$ docker build  . -t ranger-usersync:2.4.0

이제 기본적인 작업은 끝났다. 다음 글에서는 ranger-admin 구성하고 올리는 방법에 대해 알아볼 것이다.