次の例では、Hadoop、YARN、HIVE リソースへのユーザーのアクセスを制御するために、Ranger および Solr コンポーネントとともに Kerberos 対応の Dataproc クラスタを作成して使用します。
メモ:
Ranger ウェブ UI には、コンポーネント ゲートウェイを介してアクセスできます。
Kerberos クラスタを備えた Ranger では、Dataproc は Kerberos ユーザーの領域とインスタンスを削除して、Kerberos ユーザーをシステム ユーザーにマッピングします。たとえば、Kerberos プリンシパル
user1/cluster-m@MY.REALM
はシステムuser1
にマッピングされており、Ranger ポリシーはuser1
に対する権限を許可または却下するように定義されています。
クラスタを作成します。
- 次の
gcloud
コマンドは、ローカル ターミナル ウィンドウまたはプロジェクトの Cloud Shell から実行できます。gcloud dataproc clusters create cluster-name \ --region=region \ --optional-components=SOLR,RANGER \ --enable-component-gateway \ --properties="dataproc:ranger.kms.key.uri=projects/project-id/locations/global/keyRings/keyring/cryptoKeys/key,dataproc:ranger.admin.password.uri=gs://bucket/admin-password.encrypted" \ --kerberos-root-principal-password-uri=gs://bucket/kerberos-root-principal-password.encrypted \ --kerberos-kms-key=projects/project-id/locations/global/keyRings/keyring/cryptoKeys/key
- 次の
クラスタの実行後、Google Cloud Console で Dataproc の [クラスタ] ページに移動し、クラスタの名前を選択して [クラスタの詳細] ページを開きます。[ウェブ インターフェース] タブをクリックすると、クラスタにインストールされているデフォルト コンポーネントとオプション コンポーネントのウェブ インターフェースへのコンポーネント ゲートウェイ リンクのリストが表示されます。Ranger リンクをクリックします。
「admin」というユーザー名と Ranger の管理者パスワードを入力して、Ranger にログインします。
Ranger の管理 UI がローカル ブラウザで開きます。
YARN アクセス ポリシー
この例では、YARN root.default キューへのユーザー アクセスを許可および拒否する Ranger ポリシーを作成します。
Ranger 管理 UI から
yarn-dataproc
を選択します。[yarn-dataproc ポリシー] ページで、[新しいポリシーを追加] をクリックします。 [Create Policy] ページで、次の項目について入力または選択します。
Policy Name
: "yarn-policy-1"Queue
: "root.default"Audit Logging
: "Yes"Allow Conditions
:Select User
: "userone"Permissions
: すべての権限を付与するには「すべて選択」します
Deny Conditions
:Select User
: "usertwo"Permissions
: すべての権限を拒否するには「すべて選択」します
[追加] をクリックしてポリシーを保存します。このポリシーは、[yarn-dataproc Policies] ページに表示されます。
マスター SSH セッション ウィンドウで Hadoop の MapReduce ジョブを userone として実行します。
userone@example-cluster-m:~$ hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduced-examples. jar pi 5 10
- Ranger UI に、
userone
がジョブの送信を許可されたことが示されます。
- Ranger UI に、
VM マスター SSH セッション ウィンドウから Hadoop の MapReduce ジョブを
usertwo
として実行します。usertwo@example-cluster-m:~$ hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduced-examples. jar pi 5 10
- Ranger UI に、
usertwo
がジョブの送信のためのアクセスが拒否されたことが示されます。
- Ranger UI に、
HDFS アクセス ポリシー
この例では、HDFS /tmp
ディレクトリへのユーザー アクセスを許可および拒否する Ranger ポリシーを作成します。
Ranger 管理 UI から
hadoop-dataproc
を選択します。[hadoop-dataproc Policies] ページで、[新しいポリシーを追加] をクリックします。 [Create Policy] ページで、次の項目について入力または選択します。
Policy Name
:「hadoop-policy-1」Resource Path
: "/tmp"Audit Logging
: "Yes"Allow Conditions
:Select User
: "userone"Permissions
: すべての権限を付与するには「すべて選択」します
Deny Conditions
:Select User
: "usertwo"Permissions
: すべての権限を拒否するには「すべて選択」します
[追加] をクリックしてポリシーを保存します。このポリシーは、[hadoop-dataproc Policies] ページに表示されます。
userone として HDFS
/tmp
ディレクトリにアクセスします。userone@example-cluster-m:~$ hadoop fs -ls /tmp
- Ranger UI に、
userone
が HDFS /tmp ディレクトリへのアクセスが許可されたことが示されます。
- Ranger UI に、
HDFS
/tmp
ディレクトリにusertwo
としてアクセスします。usertwo@example-cluster-m:~$ hadoop fs -ls /tmp
- Ranger UI に、
usertwo
が HDFS /tmp ディレクトリへのアクセスが拒否されたことが示されます。
- Ranger UI に、
Hive のアクセス ポリシー
この例では、Hive テーブルへのユーザー アクセスを許可または拒否する Ranger ポリシーを作成します。
マスター インスタンスの hive CLI を使用して、小さな
employee
テーブルを作成します。hive> CREATE TABLE IF NOT EXISTS employee (eid int, name String); INSERT INTO employee VALUES (1 , 'bob') , (2 , 'alice'), (3 , 'john');
Ranger 管理 UI から
hive-dataproc
を選択します。[hive-dataproc Policies] ページで、[新しいポリシーを追加] をクリックします。 [Create Policy] ページで、次の項目について入力または選択します。
Policy Name
: "hive-policy-1"database
: "default"table
: "employee"Hive Column
: "*"Audit Logging
: "Yes"Allow Conditions
:Select User
: "userone"Permissions
: すべての権限を付与するには「すべて選択」します
Deny Conditions
:Select User
: "usertwo"Permissions
: すべての権限を拒否するには「すべて選択」します
[追加] をクリックしてポリシーを保存します。このポリシーは、[hive-dataproc Policies] ページに表示されます。
userone として Hive の従業員テーブルに対して VM マスター SSH セッションからクエリを実行します。
userone@example-cluster-m:~$ beeline -u "jdbc:hive2://$(hostname -f):10000/default;principal=hive/$(hostname -f)@REALM" -e "select * from employee;"
- userone クエリは、次のように成功します。
Connected to: Apache Hive (version 2.3.6) Driver: Hive JDBC (version 2.3.6) Transaction isolation: TRANSACTION_REPEATABLE_READ +---------------+----------------+ | employee.eid | employee.name | +---------------+----------------+ | 1 | bob | | 2 | alice | | 3 | john | +---------------+----------------+ 3 rows selected (2.033 seconds)
- userone クエリは、次のように成功します。
usertwo として Hive の従業員テーブルに対して VM マスター SSH セッションからクエリを実行します。
usertwo@example-cluster-m:~$ beeline -u "jdbc:hive2://$(hostname -f):10000/default;principal=hive/$(hostname -f)@REALM" -e "select * from employee;"
- usertwo はテーブルへのアクセスを拒否されます。
Error: Could not open client transport with JDBC Uri: ... Permission denied: user=usertwo, access=EXECUTE, inode="/tmp/hive"
- usertwo はテーブルへのアクセスを拒否されます。
きめ細かい Hive アクセス
Ranger は、Hive のマスキングと行レベルのフィルタをサポートしています。この例では、マスク ポリシーとフィルタ ポリシーを追加して、前述の hive-policy-1
の上にビルドしています。
Ranger の管理 UI から [
hive-dataproc
] を選択し、[マスキング] タブを選択して [新しいポリシーを追加] をクリックします。[Create Policy] ページで、次の項目について入力または選択して、従業員名の列をマスクする(無効にする)ポリシーを作成します。
Policy Name
: "hive-masking policy"database
: "default"table
: "employee"Hive Column
: "name"Audit Logging
: "Yes"Mask Conditions
:Select User
: "userone"Access Types
: "select" add/edit permissionsSelect Masking Option
: "nullify"[追加] をクリックしてポリシーを保存します。
Ranger の管理 UI から
hive-dataproc
を選択し、[行レベルのフィルタ] タブを選択して [新しいポリシーを追加] をクリックします。[Create Policy] ページで、次の項目について入力または選択して、
eid
が1
ではない行をフィルタリング(返す)ポリシーを作成します。Policy Name
: "hive-filter policy"Hive Database
: "default"Hive Table
: "employee"Audit Logging
: "Yes"Mask Conditions
:Select User
: "userone"Access Types
: "select" add/edit permissionsRow Level Filter
: "eid != 1" フィルタ式[追加] をクリックしてポリシーを保存します。
userone として Hive 従業員テーブルに対して VM マスター SSH セッションから前のクエリを繰り返します。
userone@example-cluster-m:~$ beeline -u "jdbc:hive2://$(hostname -f):10000/default;principal=hive/$(hostname -f)@REALM" -e "select * from employee;"
- クエリは、名前列をマスクして返し、bob(eid=1)を結果から除外します。
Transaction isolation: TRANSACTION_REPEATABLE_READ +---------------+----------------+ | employee.eid | employee.name | +---------------+----------------+ | 2 | NULL | | 3 | NULL | +---------------+----------------+ 2 rows selected (0.47 seconds)
- クエリは、名前列をマスクして返し、bob(eid=1)を結果から除外します。