Ranger と Kerberos を組み合わせて使用する

次の例では、Hadoop、YARN、HIVE リソースへのユーザーのアクセスを制御するために、Ranger および Solr コンポーネントとともに Kerberos 対応の Dataproc クラスタを作成して使用します。

メモ:

  • Ranger ウェブ UI には、コンポーネント ゲートウェイを介してアクセスできます。

  • Kerberos クラスタを備えた Ranger では、Dataproc は Kerberos ユーザーの領域とインスタンスを削除して、Kerberos ユーザーをシステム ユーザーにマッピングします。たとえば、Kerberos プリンシパル user1/cluster-m@MY.REALM はシステム user1 にマッピングされており、Ranger ポリシーは user1 に対する権限を許可または却下するように定義されています。

  1. Ranger の管理者パスワードを設定します

  2. Kerberos ルート プリンシパル パスワードを設定します

  3. クラスタを作成します。

    1. 次の 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
      
  4. クラスタの実行後、Google Cloud Console で Dataproc の [クラスタ] ページに移動し、クラスタの名前を選択して [クラスタの詳細] ページを開きます。[ウェブ インターフェース] タブをクリックすると、クラスタにインストールされているデフォルト コンポーネントとオプション コンポーネントのウェブ インターフェースへのコンポーネント ゲートウェイ リンクのリストが表示されます。Ranger リンクをクリックします。

  5. 「admin」というユーザー名と Ranger の管理者パスワードを入力して、Ranger にログインします。

  6. Ranger の管理 UI がローカル ブラウザで開きます。

YARN アクセス ポリシー

この例では、YARN root.default キューへのユーザー アクセスを許可および拒否する Ranger ポリシーを作成します。

  1. Ranger 管理 UI から yarn-dataproc を選択します。

  2. [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] ページに表示されます。

  3. マスター SSH セッション ウィンドウで Hadoop の MapReduce ジョブを userone として実行します。

    userone@example-cluster-m:~$ hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduced-examples.
    jar pi 5 10
    

    1. Ranger UI に、userone がジョブの送信を許可されたことが示されます。
  4. VM マスター SSH セッション ウィンドウから Hadoop の MapReduce ジョブを usertwo として実行します。

    usertwo@example-cluster-m:~$ hadoop jar /usr/lib/hadoop-mapreduce/hadoop-mapreduced-examples.
    jar pi 5 10

    1. Ranger UI に、usertwo がジョブの送信のためのアクセスが拒否されたことが示されます。

HDFS アクセス ポリシー

この例では、HDFS /tmp ディレクトリへのユーザー アクセスを許可および拒否する Ranger ポリシーを作成します。

  1. Ranger 管理 UI から hadoop-dataproc を選択します。

  2. [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] ページに表示されます。

  3. userone として HDFS /tmp ディレクトリにアクセスします。

    userone@example-cluster-m:~$ hadoop fs -ls /tmp
    

    1. Ranger UI に、userone が HDFS /tmp ディレクトリへのアクセスが許可されたことが示されます。
  4. HDFS /tmp ディレクトリに usertwo としてアクセスします。

    usertwo@example-cluster-m:~$ hadoop fs -ls /tmp
    

    1. Ranger UI に、usertwo が HDFS /tmp ディレクトリへのアクセスが拒否されたことが示されます。

Hive のアクセス ポリシー

この例では、Hive テーブルへのユーザー アクセスを許可または拒否する Ranger ポリシーを作成します。

  1. マスター インスタンスの hive CLI を使用して、小さな employee テーブルを作成します。

    hive> CREATE TABLE IF NOT EXISTS employee (eid int, name String); INSERT INTO employee VALUES (1 , 'bob') , (2 , 'alice'), (3 , 'john');
    

  2. Ranger 管理 UI から hive-dataproc を選択します。

  3. [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] ページに表示されます。

  4. 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;"
    

    1. 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)
      
  5. 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;"
    

    1. usertwo はテーブルへのアクセスを拒否されます。
      Error: Could not open client transport with JDBC Uri:
      ...
      Permission denied: user=usertwo, access=EXECUTE, inode="/tmp/hive"
      

きめ細かい Hive アクセス

Ranger は、Hive のマスキングと行レベルのフィルタをサポートしています。この例では、マスク ポリシーとフィルタ ポリシーを追加して、前述の hive-policy-1 の上にビルドしています。

  1. Ranger の管理 UI から [hive-dataproc] を選択し、[マスキング] タブを選択して [新しいポリシーを追加] をクリックします。

    1. [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 permissions
        • Select Masking Option: "nullify"

          [追加] をクリックしてポリシーを保存します。

  2. Ranger の管理 UI から hive-dataproc を選択し、[行レベルのフィルタ] タブを選択して [新しいポリシーを追加] をクリックします。

    1. [Create Policy] ページで、次の項目について入力または選択して、eid1 ではない行をフィルタリング(返す)ポリシーを作成します。

      • Policy Name: "hive-filter policy"
      • Hive Database: "default"
      • Hive Table: "employee"
      • Audit Logging: "Yes"
      • Mask Conditions:
        • Select User: "userone"
        • Access Types: "select" add/edit permissions
        • Row Level Filter: "eid != 1" フィルタ式

          [追加] をクリックしてポリシーを保存します。

    2. 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;"
      

      1. クエリは、名前列をマスクして返し、bob(eid=1)を結果から除外します。
        Transaction isolation: TRANSACTION_REPEATABLE_READ
        +---------------+----------------+
        | employee.eid  | employee.name  |
        +---------------+----------------+
        | 2             | NULL           |
        | 3             | NULL           |
        +---------------+----------------+
        2 rows selected (0.47 seconds)