Hive エージェントは、Apache Ranger の Hive プラグインと同じく、Hive の認可 API のオーソライザーです。HiveServer2 は各文を実行する前にエージェントに問い合わせ、エージェントは hive データサービスの署名付きポリシーに基づいて答えます。配布物では Java 8 互換の単一 JAR、agents/hive/grantforge-agent-hive-<version>.jar として提供され、依存関係は内部に再配置されています。
リポジトリの Testcontainers 統合テストは、HiveServer2 3.1.3、4.0.1、4.1.0 の中でこの JAR を実行します。これはほかのすべてのバージョンを認定するものではありません。サービスプラグインは Apache Hive を参照してください。
仕組み
- 文をチェックします。 文が読み書きする各オブジェクトについて、エージェントは Ranger と同じく操作に必要なアクセスタイプをポリシーに問い合わせます。最初の拒否で文は
Permission denied: user [alice] does not have [SELECT] privilege on [hr.salaries]として失敗します。クエリは列ごとにチェックします。 - 一覧を絞り込みます。
SHOW DATABASESとSHOW TABLESは、ユーザーが使えるもの、つまりデータベースやテーブル、またはその中の何かに何らかのアクセス権があるものだけを表示します。USEとDESCRIBE DATABASEにも同じ条件が必要です。 - クエリをマスクしフィルターします。 ユーザーにテーブルのマスク列や行フィルターがある場合、HiveServer2 がマスクと条件でクエリを書き換えるため、結合・条件・関数はユーザーが見てよいものだけを見ます。
- マスクは回避できません。 ユーザーにマスクや行フィルターがあるテーブルへの書き込み、変更、エクスポートは、Ranger の既定と同様に拒否されます。
- 権限とロールは GrantForge が管理します。 Hive の
GRANT、REVOKE、SHOW GRANT、CREATE ROLE、SET ROLEなどのロール文は拒否され、SHOW CURRENT ROLESは GrantForge がユーザーに与えたロールを表示します。 - 安全でない文を拒否します。 HiveServer2 自身の権限でファイルシステムにアクセスすることになる
dfsコマンドは拒否されます。HiveServer2 のセッションではTRANSFORMスクリプトが禁止され、ユーザーは Hive の SQL 標準認可が許可する設定だけをSETできます。 - すべての決定を報告します。 ユーザー、クライアントアドレス、リソース、アクセスタイプ、結果、操作、文を GrantForge に送ります。
| 操作 | アクセスタイプ |
|---|---|
クエリ、SHOW CREATE TABLE、SHOW PARTITIONS、SHOW TBLPROPERTIES、DESCRIBE、SHOW COLUMNS、ANALYZE |
select |
INSERT、UPDATE、DELETE、MERGE、TRUNCATE、LOAD(対象) |
update |
CREATE DATABASE、CREATE TABLE、CREATE VIEW、CREATE FUNCTION |
作成するものに create、読み取るものに select |
ALTER …、MSCK |
alter |
DROP … |
drop |
LOCK、UNLOCK |
lock |
SHOW DATABASES、SHOW TABLES、USE、DESCRIBE DATABASE |
オブジェクトまたはその中の何かへの任意のアクセス |
REPL DUMP、REPL LOAD、REPL STATUS |
repladmin |
KILL QUERY、リソースプラン、LLAP 管理 |
hiveservice に対する serviceadmin |
一時関数、ADD JAR、COMPILE |
global に対する tempudfadmin |
| 文が読み書きする場所 | url に対する read または write |
配置
-
hiveデータサービスを追加してポリシーを設定します。HiveServer2 が自身の処理を行うユーザー(hiveなど)に必要なすべてを許可するポリシーも含めてください。データ権限 → エージェントを開き、サービスを選択してエージェントトークンを発行します。トークンは一度だけ表示されるので、HiveServer2 のアカウントだけが読めるファイルに保存してください。 -
すべての HiveServer2 の
lib(例:/opt/hive/lib)に JAR をコピーします。 -
各 HiveServer2 の
hiveserver2-site.xmlまたはhive-site.xmlに次の設定を追加し、例のアドレス、パス、インスタンス名を置き換えます。<property><name>hive.security.authorization.enabled</name><value>true</value></property> <property><name>hive.security.authorization.manager</name> <value>org.devlive.grantforge.hive.agent.GrantForgeHiveAuthorizerFactory</value></property> <property><name>hive.security.authenticator.manager</name> <value>org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator</value></property> <property><name>hive.server2.enable.doAs</name><value>false</value></property> <property><name>grantforge.server.url</name><value>https://grantforge.example.com</value></property> <property><name>grantforge.token.file</name><value>/etc/hive/grantforge.token</value></property> <property><name>grantforge.instance</name><value>hs2-1</value></property> <property><name>grantforge.cache.dir</name><value>/var/lib/hive/grantforge-cache</value></property>キャッシュディレクトリは HiveServer2 のアカウントが書き込める必要があります。Ranger と同様に、
hive.server2.enable.doAs=falseにすると HiveServer2 は自身のアカウントでデータを読み書きし、誰が何を見られるかはポリシーが決めます。 -
HiveServer2 を再起動します。エージェントは最初のセッションとともに起動し、サーバーとともに停止して、未送信のイベントを送信またはキューに保存します。
-
HiveServer2 を迂回する経路を閉じてください。 エージェントがチェックするのは HiveServer2 で実行される文だけです。Hive CLI、Spark、HDFS クライアントなど、メタストアやウェアハウスのファイルに直接アクセスするクライアントはチェックされません。メタストアと HDFS 自身の権限、または HDFS エージェントで保護してください。
| 設定 | 用途 |
|---|---|
grantforge.server.url、grantforge.token.file、grantforge.instance、grantforge.cache.dir |
必須:GrantForge サーバー、エージェントトークンのファイル、この HiveServer2 の名前、署名付きスナップショットとキューのイベント用の書き込み可能なディレクトリ |
grantforge.signing.key.file |
スナップショットの署名鍵を固定する任意のファイル。エージェントページから Base64 エンコードされた X.509 Ed25519 公開鍵をコピーします。省略すると初回接続時にサーバーから鍵を取得します |
grantforge.connect.timeout.ms、grantforge.read.timeout.ms |
GrantForge への接続・読み取りタイムアウト。既定 5000 / 8000 ミリ秒 |
grantforge.refresh.interval.ms |
エージェントが新しいポリシーを問い合わせる間隔。既定 30000、最小 1000 ミリ秒 |
grantforge.audit.batch.size、grantforge.audit.queue.capacity、grantforge.audit.flush.interval.ms、grantforge.audit.spool.limit.bytes |
アクセスイベント:バッチサイズ(既定 500)、キューサイズ(既定 10000)、送信間隔(既定 5000 ミリ秒)、ディスクキューの上限(既定 64 MiB) |
エージェントは HiveServer2 の設定ファイルとシステムプロパティ(-Dgrantforge.…、こちらが優先)から設定を読み、クライアントが決められるセッションの設定からは決して読みません。
ユーザー、グループ、ロール
ポリシーが指すのは、HiveServer2 がセッションに与えるユーザーです。クライアントがサインインしたユーザー名、または Kerberos プリンシパルの短縮名(alice@EXAMPLE.COM なら alice)です。グループは HiveServer2 で Hadoop のグループマッピングがユーザーに与えるグループと、GrantForge でユーザーが属するグループで、ロールは GrantForge がユーザーに与えるロールです。
決定と制限
- 使えるスナップショットがない場合、またはポリシーを読めない場合は、すべての文が拒否されます。使用されていないサービスは、オーソライザーがない場合と同じく HiveServer2 をチェックしません。
- タイプが
hiveでないサービスに結び付いたトークンは、すべてを拒否します。 - 文が読み書きする場所は
urlポリシーが決めます。Ranger と異なり、エージェントはファイルシステム自身の権限にフォールバックしません。 - Hive がオブジェクトを示さない文は、すべてのデータベースについてチェックされます。オブジェクトのない
REPL文にはrepladmin、オブジェクトのないテーブルやデータベースの所有者変更にはalterが、データベース*に対して必要です。 EXPLAIN、DESCRIBE FUNCTION、SHOW FUNCTIONS、SETなど、Ranger がチェックしないほかの文もチェックしません。getTablesなどの JDBC クライアントのメタデータ呼び出しは絞り込まれません。- エージェントは HiveServer2 で動作します。メタストア内部の認可は対象外です。
