通常メタストアにMySQLを使用してHiveを構築した場合、クリアテキストで設定ファイルへパスワードを記述します。この場合、以下のリスクが考えられます。
- 権限の無いアクセスでもHiveメタデータを破壊または変更できる。この為、ワークフローが崩壊する可能性や悪意のあるユーザがHiveの権限を変更するまたはメタデータを破壊する可能性がある。
- このパスワードは、hiveserver2 – thrift – MySQL間の通信を許可する。
このリスクを避けるためにJavaキーストアファイルをパスワードの代わりに使う必要があります。
最低限必要な作業:
- chown mapr:mapr hive-site.xml
- chmod 400 hive-site.xml
上記の作業を行うことで、mapr以外のユーザはhive-site.xmlを読み込む事が出来なくなります。この為ローカルでのジョブ実行を制限することが出来ます。
パスワードを格納/参照処理を行うためにCredential Providerを設定します。その設定で暗号化したキーストアファイルを使用を指定することで、Hive設定のHive metastoreパスワードをクリアテキストで保存する必要がなくなります。
ステップ1:HadoopコマンドでCredentialProviderの作成
パスワードを暗号化し、Javaキーストアファイルとして保存するためにCredentialProviderを作成します。
[root@ip-10-0-10-219 ~]# hadoop credential create javax.jdo.option.ConnectionPassword -provider jceks://maprfs/user/mapr/hive.jceks Enter password: Enter password again: javax.jdo.option.ConnectionPassword has been successfully created. org.apache.hadoop.security.alias.JavaKeyStoreProvider has been updated.
パスワードのプロンプトが表示されたら、Hiveメタデータベース認証を入力する必要があります。
注意:MapR Distributionでは、HDFSパスのmaprfsを入力する必要があります。jceks://user/mapr/filename.jceks」
の様なダイレクトパスは機能しません。maprfsを入力してください。例)jceks://maprfs/user/mapr/filename.jceks
ステップ2:パスワードエイリアス確認
パスワードエイリアスがJCEKS providerファイルとしてリスト出力されることで、適切に設定されていることを確認します。次のコマンドを実行します。
For Listing details of alias [root@ip-10-0-10-219 ~]# hadoop credential list -provider jceks://maprfs/user/mapr/hive.jceks Listing aliases for CredentialProvider: jceks://maprfs/user/mapr/hive.jceks javax.jdo.option.connectionpassword
providerファイルからjavax.jdo.option.connection (エイリアス) のリストが出力されます。
ステップ3:Hive metastoreパスワードエントリーの削除
Hiveメタデータベースへ接続するために、Hive設定ファイルはCredentialProviderロケーションで更新する必要があります。
hive-site.xmlを編集し、以下の変更を行ってください。
- Hive設定からHive metastoreパスワードエントリー (jdo.option.ConnectionPassword) を削除する。エントリーを削除することでCredenditalProviderが代わりに利用されます。
- CredentialProvider用にhive-siteに以下のエントリーを作成します。
<!-- <Configure credential store for passwords> --> <property> <name>hadoop.security.credential.provider.path</name> <value>jceks://maprfs/user/mapr/hive.jceks</value> </property>
ステップ4:Hive Metastore Server及びHiveServer2を再起動
Hive Metastore Server/HiveServer2を再起動し設定を有効化します。
maprcli node services -name hivemeta -action stop -nodes hivemetastorehostname maprcli node services -name hs2 -action stop -nodes hiveserver2hostname maprcli node services -name hivemeta -action start -nodes hivemetastorehostname maprcli node services -name hs2 -action start -nodes hiveserver2hostname
ログを検証しHiveサーバーがエラーなく正常に起動したことを確認します。
ステップ5:Hiveの動作確認
Hiveにログオンし、データベースとテーブルへアクセス出来ることを確認するためにリストを出力します。
注意:Hiveシェルの利用には読み取り権限が必要です。この為、すべてのHiveユーザ向けにJavaキーストアファイルへ読み取り権限 (644) を要求されます。
読み取り権限をユーザーグループに与えることは、安全性を損なうことになります。読み取り権限がある人は、キーストアファイルを使いDBアクセスを行うことができます。読み取り権限は、エンドユーザのHiveシェルアクセスの全てに必要ではないので、アクセスできるエンドユーザー数を制限するためにHiveユーザをグループで分割し、必要に応じてキーストアファイルへのアクセス (640) を禁止して下さい。
詳しい説明は、Hadoop Commands Guideを読んで下さい。
以上で、暗号化したキーストアファイルを使用することで、Hive設定ファイルへクリアテキストでのmetastoreパスワードを保存しない方法をご紹介しました。
著者情報
アルン・ナルサミー
(MapR Technologies データエンジニア)