Databricksクラスターにおけるテーブルアクセスコントロールの有効化

[Enable table access control for a cluster \| Databricks on AWS](https://docs.databricks.com/security/access-control/table-acls/table-acl.html)　[2021/6/15時点]の翻訳です。

> **注意**
本文書には、もはやDatabricksでは使用しない*ホワイトリスト*という用語への参照を含んでいます。ソフトウェアからこの用語が削除された際には、本文書からも用語を削除します。

この文書では、クラスターにおけるテーブルアクセスコントロールを有効化する方法を説明します。

クラスターでテーブルアクセスコントロールが有効化された際に、どのようにデータオブジェクトにアクセス権を設定するのかに関しては、[Databricksにおけるデータオブジェクトのアクセス権管理](https://qiita.com/taka_yayoi/items/225c4db5dffa51cbbbae)を参照してください。

# クラスターにおけるテーブルアクセスコントロールの有効化

テーブルアクセスコントロールは二つのバージョンで利用できます：

- [SQLのみのテーブルアクセスコントロール](#sqlのみのテーブルアクセスコントロール): クラスターのユーザーに対して、SQLコマンドのみの実行を許可します。Apache Spark SQL APIのみを利用できます。このため、Python、Scala、R、RDD API、そして、DBUtilsのようにクラウドストレージから直接データを読み込むクライアントを使用することはできません。
- [PythonとSQLのテーブルアクセスコントロール](#pythonとsqlのテーブルアクセスコントロール): クラスターのユーザーに対して、SQL、Python、PySparkコマンドの実行を許可します。Spark SQL API、DataFrame APIを利用することができます。このため、Scala、R、RDD API、そして、DBUtilsのようにクラウドストレージから直接データを読み込むクライアントを使用することはできません。

## SQLのみのテーブルアクセスコントロール

このバージョンのテーブルアクセスコントロールでは、ユーザーはクラスターでSQLコマンドのみを使用できます。

クラスターでSQLのみのテーブルアクセスコントロールを有効化し、クラスターでSQLコマンドのみを使用できるようにするには、クラスターの[Spark conf](https://docs.databricks.com/clusters/configure.html#spark-config)で、以下のフラグを設定します。

```ini:ini
spark.databricks.acl.sqlOnly true
```

> **注意**
SQLのみのテーブルアクセスコントロールへのアクセスは、admin consoleの[Enable Table Access Control](https://docs.databricks.com/administration-guide/access-control/table-acl.html)に影響を受けません。この設定は、ワークスペース全体でのPythonとSQLのテーブルアクセスコントロールの有効化に関するものです。

## PythonとSQLのテーブルアクセスコントロール

このバージョンのテーブルアクセスコントロールでは、ユーザーはSQLに加えて、データフレームAPIを使用するPythonコマンドを実行できます。このテーブルアクセスコントロールがクラスターで有効化された場合には、このクラスター、プールを使用するユーザーは：

- Spark SQL APIあるいはDataframe APIのみを用いてSparkにアクセスできます。両方の場合で、テーブル、ビューへのアクセスはDatabricksの[データガバナンスモデル](https://qiita.com/taka_yayoi/items/225c4db5dffa51cbbbae#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%AC%E3%83%90%E3%83%8A%E3%83%B3%E3%82%B9%E3%83%A2%E3%83%87%E3%83%AB)に則り、管理者によって制限されます。
- ファイルシステム上の機密情報へのアクセスや、ポート80、443以外のネットワーク接続が禁止された低権限のユーザーとしてクラスターノードでコマンドを実行する必要があります。
    - ビルトインのSpark関数だけがポート80、443以外のネットワーク接続を確立できます。
    - 管理者ユーザーあるいは[ANY FILE](https://docs.databricks.com/security/access-control/table-acls/object-privileges.html#data-governance-model)権限を持つユーザーのみが、[PySpark JDBC connector](https://docs.databricks.com/data/data-sources/sql-databases.html#python-jdbc-example)を通じて外部データベースからデータを読み込むことができます。
    - Pythonプロセスが、追加のアウトバウンドのポートにアクセスできるようにするには、[Spark config](https://docs.databricks.com/clusters/configure.html#spark-config)の`spark.databricks.pyspark.iptable.outbound.whitelisted.ports`にアクセスしたいポートを指定します。設定する値は、例えば、`21,22,9000:9999`というように`[port[:port][,port[:port]]...]`のフォーマットである必要があります。ポートは適切な範囲、すなわち`0-65535`にある必要があります。

これらの制限を回避しようとする試みは、例外とともに失敗します。ユーザーがクラスターを通じて許可されていないデータにできないように、これらの制限は施行されます。

### 要件

PythonとSQLのテーブルアクセスコントロールを設定する前に、管理者は:

- Databricksワークスペースでテーブルアクセスコントロールを有効化する必要があります。
- テーブルアクセスコントロールが有効化されていないクラスターへのアクセスを拒否する必要があります。実際には、これは多くのユーザーのクラスター作成権限を許可しないことを意味し、テーブルアクセスコントロールが有効化されていないクラスターへの**Can Attach To**権限を許可しないことを意味します。

これらの要件の詳細については、[Enable table access control for your workspace](https://docs.databricks.com/administration-guide/access-control/table-acl.html#enable-table-acl)を参照ください。

### テーブルアクセスコントロールが有効化されたクラスターの作成

クラスターを作成する際、**Enable table access control and only allow Python and SQL commands**オプションにチェックしてください。このオプションは[High Concurrency](https://docs.databricks.com/clusters/configure.html#high-concurrency)クラスターでのみ有効です。
![](https://docs.databricks.com/_images/table-acl-enable-cluster-aws.png)

REST APIを用いてクラスターを作成する際には、[Create cluster enabled for table access control example](https://docs.databricks.com/dev-tools/api/latest/examples.html#cluster-table-acl-example)を参照ください。

# データオブジェクトへのアクセス権の設定

[Databricksにおけるデータオブジェクトのアクセス権管理](https://qiita.com/taka_yayoi/items/225c4db5dffa51cbbbae)を参照ください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)