2021.10.06

自前HadoopクラスタとApache Rangerを連携してみる

こんにちは,次世代システム研究室のS.T.です。最近はFPGAネタを書くことが多かったのですが,今回はHadoopネタです。Apache Rangerを自前のHadoopクラスタに導入し,ユーザごとに権限管理できることを確認します。例によって,ビルドなどにハマリつつ右往左往した結果をまとめた構築手順のような内容です。あっさり書いてありますが,ゼロから調べて動かすとなると骨が折れるので,同じ箇所でハマっている方の助けになればと思います。

1.Apache Rangerとは

Apache Rangerは,Hadoopクラスタの権限管理やauditロギングを行うためのソフトウェアです。HDFSのディレクトリやHiveのテーブルなどに対して,ユーザやグループごとに権限を設定して管理することができます。HDFSに大規模データを蓄えてHiveやSparkで処理や分析を行う,というのが一般的なユースケースですが,データの種類やデータ使う人(組織)が増えてくると,閲覧や編集の権限を制御したり,監査ログを残したりしたいという需要が出てきます。Apache RangerはHadoopコンポーネントをはじめとする様々なアプリケーションにプラグインを提供しており,RangerのWeb UI上から権限の設定やログの閲覧を行うことができます。Active Directoryと連携してユーザやグループの管理を行うこともできるため,Hadoopをコアとした大規模データ処理基盤に認可・監査ログの仕組みを導入する場合の最有力候補となるソリューションです。

今回の記事では,そんなRangerを過去の記事でM.K.さんが作成したクラスタ(こちらの記事を参照)のHDFSに認可を導入してみます。Rangerはドキュメントに書かれている情報も少なく,Web上で公開されているノウハウもなかなか見つかりません。予想ですが,Rangerを導入する規模のHadoopクラスタを使用する場合,ベンダを通すケースが多い上に,データ処理のコア技術ではないため外部向けに発表する内容でもなく,出てくる情報が少ないのではないかと考えています。

2.環境

過去記事のクラスタをそのまま使用します。Rangerは執筆時点で最新の2.1.0を使用し,m01ノードにインストールして,Web UIはSSHポートフォワーディングで閲覧します。

3.ビルド~構築

基本的には,tarに含まれるREADMEと以下の2つのドキュメントを参考にビルド・構築をすすめることができます。後者のドキュメントのほうが詳細にかかれていますが,この情報にたどり着くのが難しく,若干苦労しました。ただし,メンテナンスされていないため,将来的には参考にできなくなるかもしれません。現段階では,大きな乖離はないようです。
また,Rangerをビルド・実行するm01ノードにはJava(OpenJDK 1.8.0_282)とMaven 3.8.1を導入済みです。

MySQLの導入

Rangerが使用するRDBとしてMySQLを導入しました。今回は8.0.21を導入しました。rootユーザのパスワードを設定してログインできるようにしておきます。この手順は一般的なため,割愛します。

Rangerのビルド

ビルド自体はREADMEにかかれている通りのコマンドで実行可能です。事前に,python3系とgitのインストールを行い,「python」で呼び出せるように設定しておく必要があります。admin,ユーザを同期するusersync,各種コンポーネントのプラグインがすべてビルドされます。
$ git clone https://github.com/apache/ranger.git
$ cd ranger
$ git checkout refs/tags/release-ranger-2.1.0
$ mvn package -DskipTests
しかし,おそらくmavenの依存パッケージ取得でコケます。実行した時期やバージョンによって差があると思いますが,今回は以下のような対応が必要でした。ただし,今回は使用しないプラグインなので,ビルドしないという方法で回避することも可能かと思います。中にはあまりお行儀が良い方法ではないものもあるため,うまく解決する方法を色々と考えたのですが,おそらく次のバージョンでは解消されているだろうと考えて,妥協しました。

apache-ranger-2.1.0/pom.xmlのrepositoriesに以下を追加(参考)。
<repository>
    <id>maven-restlet</id>
    <name>Public online Restlet repository</name>
    <url>https://maven.restlet.talend.com</url>
</repository>
ローカルの.m2以下のpomを修正(参考)。~/.m2/repository/org/apache/kylin/kylin/2.6.4/kylin-2.6.4.pomを以下のように修正します。
Before
<calcite.version>1.16.0-kylin-r2</calcite.version>

After
<calcite.version>1.16.0</calcite.version>
ビルドが完了すると,target/以下にadmin,usersync,*-pluginの.tar.gzファイルが生成されています。

Ranger adminのインストール

今回はRangerをm01ノードのローカルユーザと同期して使用します。実際はActive Directoryのアカウントなどと連携させるのが一般的かと思います。target/ranger-2.1.0-admin.tar.gzを/usr/local/rangerに移動して展開します。
# tar xvfz ranger-2.1.0-admin.tar.gz
# cd  ranger-2.1.0-admin
install.propertiesを環境に合わせて編集します。今回変更したのは以下のプロパティです。また,事前にMySQL Connector Javaをダウンロードし,usr/share/javaに配置しておく必要があります。
DB_FLAVOR=MYSQL
SQL_CONNECTOR_JAR=/usr/share/java/mysql-connector-java.jar

db_root_user=root
db_root_password=#######
db_host=localhost

db_name=ranger
db_user=rangeradmin
db_password=#######

# rangeradminユーザのパスワード
rangerAdmin_password=#######
# rangerusersyncユーザのパスワード(usersyncで使います)
rangerUsersync_password=#######

unix_user=ranger
unix_user_pwd=#######
unix_group=ranger

authentication_method=UNIX
設定が完了したら,セットアップスクリプトを実行します。
# ./setup.sh
# ./set_globals.sh
これでranger-adminのセットアップは完了です。ranger-admin start コマンドで起動して,ブラウザで6080ポートにアクセスしてWeb UIが見えれば動いています(今回の環境ではポートフォワーディングしています)。デフォルトのアカウントはadmin/adminです。/var/log/ranger/admin以下にログが出力されるので,うまく動かないときは参照してください。

Ranger usersyncのインストール

Ranger usersyncはUNIXユーザやActive DirectoryのアカウントとRangerのアカウントを連携させるためのコンポーネントです。今回はm01ノードのユーザを同期します。target/ranger-2.1.0-usersync.tar.gzを/usr/local/rangerに移動して展開します。
# tar xvfz ranger-2.1.0-usersync.tar.gz
# cd  ranger-2.1.0-usersync
install.propertiesを環境に合わせて編集します。今回変更したのは以下のプロパティです。
POLICY_MGR_URL=http://m01ノード:6080
SYNC_SOURCE=unix
rangerUsersync_password=rangerの設定で決めたパスワード
設定が完了したら,セットアップスクリプトを実行します。
# ./setup.sh
# ./set_globals.sh
セットアップが完了したら,以下のコマンドで起動します。
# ./start.sh
これでローカルのユーザがRangerに同期されるようになりました。試しに以下のようにテストユーザを作ってログインできるか試してみましょう。
# adduser testuser
# passwd testuser
...
5分待ってRanger Web UIからtestuserでログイン
うまくログインできれば成功です。同期の間隔はデフォルトで5分です。ログは/var/log/ranger/usersync以下に書き出されます。正常に動作していれば,以下のようなメッセージが連続して出力されているはずです。
Begin: update user/group from source==>sink
End: update user/group from source==>sink
RangerのSettingsをみると,testuserが増えているはずです。

Ranger HDFS Pluginのインストール

ここまでの設定で,Rangerでユーザを管理することができるようになりました。次に,HDFSにPluginを導入し,ポリシーを作成してユーザ・グループごとの認可制御ができるようにします。

target/ranger-2.1.0-hdfs-plugin.tar.gzを/usr/local/rangerにコピーして展開します。
# tar xvfz ranger-2.1.0-hdfs-plugin.tar.gz
# cd  ranger-2.1.0-hdfs-plugin
install.propertiesを環境に合わせて編集します。今回変更したのは以下のプロパティです。
POLICY_MGR_URL=http://m01ノード:6080
REPOSITORY_NAME=hadoopdev
設定が完了したら,インストールスクリプトを実行します。
# ./enable-hdfs-plugin.sh
さらにranger-2.1.0-hdfs-plugin/lib/以下のファイルを/usr/lib/hadoop/current/share/hadoop/hdfs/lib/以下にコピーします。
# cp -r lib/* /usr/lib/hadoop/current/share/hadoop/hdfs/lib/
インストールガイドではpseudo distributed modeを仮定しているのでこれで良いのですが,今回の環境はHA構成をとっているため,m02ノードにもHDFS NameNodeがいます。m02ノードのHDFSにもRangerの設定とライブラリの追加を行う必要があります。インストールスクリプトで追加されたHDFSの設定は以下のとおりです。これをm02ノードの/etc/hadoo/hdfs-site.xmlに追記します。
<property>
    <name>dfs.permissions</name>
    <value>true</value>
</property>
<property>
    <name>dfs.namenode.inode.attributes.provider.class</name>
    <value>org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizer</value>
</property>
<property>
    <name>dfs.permissions.ContentSummary.subAccess</name>
    <value>true</value>
</property>
ranger-2.1.0-hdfs-plugin/lib/以下のファイルは,SCPなどで適当に転送し,m02ノードの/usr/lib/hadoop/current/share/hadoop/hdfs/lib/以下に配置してください。この状態でHDFSを再起動すれば,Rangerとの接続が完了します。
# stop-dfs.sh
# start-dfs.sh
RangerのWeb UIでAudit->PluginStatusを確認し,図1のようにHDFSプラグインが存在することが確認できれば,うまくいっています。
図1:HDFS Pluginのstatus確認</figcaption

4.権限の設定

ここまでの設定により,Rangerでユーザの権限を管理し,HDFSにポリシーを適用できるようになりました。次に,Web UI上から権限を設定していきます。

今回は先程作成したtestuserを用いて,権限がなく/users以下にディレクトリが作成できないことを確認,その後権限を付与して作成できるようになったことを確認します。

testuserは一度Rangerにログイン済みなので,すでにUser一覧に追加されています。Settings->Usersを確認すると,図2のようにtestuserが増えているのを確認できます。
図2:Ranger上でのUserの確認</figcaption

この状態では,まだtestuserにはHDFSへの書き込み権限はありません。以下のようにtestuserにスイッチして書き込みを行うと,エラーになります。
# su - testuser
$ export PATH=$PATH:/usr/lib/hadoop/current/bin
$ hdfs dfs -mkdir /user/testuser
mkdir: Permission denied: user=testuser, access=WRITE, inode="/user":hdfs:hadoop:drwxrwxr-x
では,Ranger Web UI上からtestuserに権限を付与してみましょう。トップページ(Service Manager)でHDFSの「+」を押して,サービスを追加します。設定例を図3に示します。Repository NameはHDFSプラグインの設定と合わせる必要があります。今回はhadoopdevです。HA構成をとっているため,NameNodeのエンドポイントはカンマ区切りで複数指定します。アカウントはadminを使いました。
図3:HDFS Serviceの追加</figcaption

作成したサービスを開くと,図4のようにポリシー一覧が見られます。ここでEditを押すと,ポリシーを編集することができます。今回は全パスの書き込みを指定できるall-pathポリシーを編集し,testuserを追加します。
図4:ポリシーの一覧</figcaption

編集画面は図5のようになっています。赤枠の部分にtestuserを追加することで,右に書かれている権限READ,WRITE,EXECUTEが付与されます。編集が完了したら一番下のSaveボタンを押します。
図5:ポリシーの編集</figcaption

編集したポリシーが同期されると,auditログが残ります。Audit->Pluginを見ると,今回の編集が履歴に追加されています。
図6:ポリシー編集のauditログ</figcaption

ここまでの操作で,testuserに書き込み権限が付与されました。再度mkdirを実行してみます。
$ export PATH=$PATH:/usr/lib/hadoop/current/bin
$ hdfs dfs -mkdir /user/testuser
$ hdfs dfs -ls /user
Found 5 items
drwx------   - hdfs     hadoop          0 2021-04-03 09:12 /user/hdfs
drwxr-xr-x   - root     hadoop          0 2021-07-02 22:55 /user/root
drwxr-xr-x   - spark    hadoop          0 2021-07-02 12:12 /user/spark
drwxr-xr-x   - testuser hadoop          0 2021-10-04 22:45 /user/testuser
drwxr-xr-x   - yarn     hadoop          0 2021-03-29 09:19 /user/yarn
これで権限の設定は完了です。今回はUserを対象に権限を付与しましたが,Groupを対象に権限をつけることもでき,柔軟な管理が可能です。

5.まとめ

無事にApache Rangerを自前クラスタに導入し,権限管理を行うことができました。ビルドは少し手間取りましたが,基本設定が終わればWeb UI上で権限設定が完結します。自前クラスタへのRanger導入が容易であるとなると,HDFSをはじめとする自分たちが必要とするコンポーネントだけで独自にクラスタを構築するというのも現実味を帯びています。実際の環境ではADアカウントと連携したりHiveなど別のコンポーネントのプラグインを導入したりする必要はあるかと思いますが,今回HDFSで試した雰囲気では問題なく使えるのではないかという印象です。

最後に

次世代システム研究室では,データサイエンティスト/機械学習エンジニアを募集しています。ビッグデータの解析業務など次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら,ぜひ募集職種一覧からご応募をお願いします。皆さんのご応募をお待ちしています。

※記事中で参照しているWeb上の文献は記事公開日時点の情報です。

Pocket

関連記事