Delta Sharingのセキュリティベストプラクティス

[Security Best Practices for Delta Sharing \- The Databricks Blog](https://databricks.com/blog/2022/08/01/security-best-practices-for-delta-sharing.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

# お使いのレイクハウスに対するDelta Sharingのリクエストを強化するために活用できるベストプラクティス

データ[レイクハウス](https://databricks.com/jp/glossary/data-lakehouse)は、サイロを排除することで我々のデータ管理アーキテクチャを統合し、すべてのユースケースに共通した一つのプラットフォームを活用します。一つのプラットフォーム上でデータウェアハウスとAIユースケースを統合することは、企業にとっての大きな一歩ですが、このステップを踏み出した後の次の質問は、「データの受信者`recipient`が使用しているクライアント、ツールに関係なくシンプルかつセキュアにデータを共有`share`するにはどうしたらいいのでしょうか？」というものになります。幸運なことに、[レイクハウス](https://databricks.com/jp/glossary/data-lakehouse)はこの質問に対する答えも持っています。Delta Sharingによるデータ共有です。

# Delta Sharing

[Delta Sharing](https://databricks.com/jp/product/delta-sharing)は、データが存在しているプラットフォームとは独立した、企業内外でリアルタイムにデータをセキュアに共有するための世界初の[オープンプロトコル](https://delta.io/sharing/)です。これは、[レイクハウスアーキテクチャ](https://databricks.com/jp/glossary/data-lakehouse)のオープン性のキーコンポーネントであり、データチームとこれまで不可能だった[データメッシュ](https://martinfowler.com/articles/data-mesh-principles.html)のようなアクセスパターンをまとめ上げるためのキーのイネーブラとなっています。
![](https://databricks.com/wp-content/uploads/2022/07/db-179-blog-img-1.png)

# 設計によるセキュリティ

[Delta Sharing](https://databricks.com/jp/product/delta-sharing)は最初からセキュリティを念頭に開発されており、[オープンソース版](https://delta.io/sharing/)であろうが[マネージド版](https://databricks.com/jp/product/delta-sharing)であろうが、すぐに以下の機能を活用することができます。

- クライアントからサーバー、ストレージアカウントに至る**エンドツーエンドのTLS暗号化**
- データアクセスに使用される事前サイン済みURLのような**短期間有効な認証情報**
- [Unity Catalog](https://databricks.com/jp/product/unity-catalog)による教諭データセットに対する**容易な統治、追跡、監査アクセス**

このブログの一部として共有するベストプラクティスは加算的なものであり、お客様は自身のリスクプロファイル、取扱データの機密性に対して、適切なセキュリティコントロールを割り当てることができます。

# セキュリティのベストプラクティス

機密データを[Delta Sharing](https://databricks.com/jp/product/delta-sharing)を用いて共有する際のおすすめのベストプラクティスは以下の通りとなります。

1. [皆様の要件に基づいてオープンソース版かマネージド版かを評価する](#1-皆様の要件に基づいてオープンソース版かマネージド版かを評価する)
1. [全てのメタストアにおいて適切な受信者トークンの寿命を設定する](#2-全てのメタストアにおいて適切な受信者トークンの寿命を設定する)
1. [認証情報のローテーションサイクルを確立する](#3-認証情報のローテーションサイクルを確立する)
1. [共有、受信者、パーティションに対する適切なレベルの粒度を検討する](#4-共有受信者パーティションに対する適切なレベルの粒度を検討する
)
1. [IPアクセスリストを設定する](#5-ipアクセスリストを設定する)
1. [Databricks監査ログを設定する](#6-databricks監査ログを設定する)
1. [ストレージアカウントのネットワーク制限を設定する](#7-ストレージアカウントのネットワーク制限を設定する)
1. [ストレージアカウントのログを設定する](#8-ストレージアカウントのログを設定する)

## 1. 皆様の要件に基づいて[オープンソース版](https://delta.io/sharing/)か[マネージド版](https://databricks.com/jp/product/delta-sharing)かを評価する

上で説明した通り、Delta Sharingはセキュリティを最優先に設計されています。しかし、[マネージド版](https://databricks.com/jp/product/delta-sharing)を使うことのメリットがいくつかあります。

- Databricks上で提供されるDelta Sharingは、異なるグループのユーザー間のデータアクセスに対してきめ細かいアクセス管理を一つの場所から提供する[Unity Catalog](https://databricks.com/jp/product/unity-catalog)と統合されています。オープンソース版を使用する際は、複数の共有サーバー間でさまざまなデータアクセス権限を持つデータセットを分離する必要があり、また、それらのサーバーや背後のストレージアカウントに対してアクセス制限を課す必要があるかもしれません。デプロイメントを容易にするために、オープンソース版では[dockerイメージ](https://hub.docker.com/r/deltaio/delta-sharing-server)が提供されていますが、大企業においてデプロイメントをスケールさせるためには、これらを管理するチームにおいて無視できないオーバーヘッドが生じることに注意することが重要です。
- Databricks[レイクハウスプラットフォーム](https://databricks.com/jp/product/data-lakehouse)の他の部分同様、[Unity Catalog](https://databricks.com/jp/product/unity-catalog)はマネージドサービスとして提供されます。我々がすべて面倒を見るので、可用性や、稼働時間、メンテナンスなどを心配する必要はありません。
- [Unity Catalog](https://databricks.com/jp/product/unity-catalog)を用いることで、すぐに包括的な監査ログ機能を設定することができます。
- データの所有者はSQL構文を用いて共有を管理することができます。さらに、共有を管理するためのREST APIを利用することができます。馴染みのあるSQL構文を用いることで、データ共有をシンプルなものとし、管理の負荷を削減します。
- オープンソース版を用いる際には、あなたが設定やインフラストラクチャ、データ共有の管理に責任を持つことになりますが、マネージド版ではすべての機能をすぐに利用することができます。

以上のことを踏まえ、ご自身の要件に基づいて両方のバージョンを評価し、意思決定をすることをお勧めします。セットアップの容易性、利用しやすさ、すぐに利用できるガバナンスや監査機能、そしてアウトソーシングされたサービス管理が重要なのであれば、マネージド版が適切な選択肢と言えるでしょう。

## 2. 全てのメタストアにおいて適切な受信者トークンの寿命を設定する

[Delta Sharing](https://databricks.com/jp/product/delta-sharing)を有効化すると、受信者の認証情報のトークンの寿命を設定します。トークンの寿命を0にすると、受信者のトークンは有効期限切れしなくなります。

規制、コンプライアンス、評判の観点から適切なトークン寿命の設定は非常に重要と言えます。有効期限が切れないトークンを持つことは大きなリスクとなります。このため、ベストプラクティスとしては短期間のトークンを用いることをお勧めします。寿命が不適切なトークン使用の調査よりも、有効期限が切れたトークンを持つ受信者に新規トークンを許可する方がはるかに楽です。

適切な秒数、時間、日数を経過した後に無効化されるトークンの設定方法についてはドキュメント([AWS](https://docs.databricks.com/data-sharing/delta-sharing/index.html#modify-the-recipient-token-lifetime)、[Azure](https://docs.microsoft.com/ja-jp/azure/databricks/data-sharing/delta-sharing/#modify-the-recipient-token-lifetime))を参照ください。

## 3. 認証情報のローテーションサイクルを確立する

既存トークンの有効期限切れ、認証情報が漏洩しているかもしれないという懸念、あるいは単にトークンの寿命を変更したので、新たな寿命に従う新たな認証情報を発行したいといったことから認証情報をローテーションするなど、ローテーションの理由は数多く存在します。

予測可能かつ迅速な方法でこのようなリクエストを確実に充足するためには、プロセス、そして望ましくはSLAを確立することが重要です。これは、特定のデータ所有者、データスチュワード、当該メタストアのDBAによって完了される適切なアクションを伴う、ITサービスの管理プロセスに組み込むことが可能です。

認証情報をローテーションする方法についてはドキュメント([AWS](https://docs.databricks.com/data-sharing/delta-sharing/index.html#rotate-a-recipients-credential)、[Azure](https://docs.microsoft.com/ja-jp/azure/databricks/data-sharing/delta-sharing/#--rotate-a-recipients-credential))を参照ください。特に、以下のことに注意してください。

- 即座に認証情報をローテーションする必要がある場合には、`--existing-token-expire-in-seconds`を`0`に設定することで既存のトークンを即座に無効化します。
- 認証情報が漏洩した恐れがある場合には、以下のアクションを取ることをお勧めします。
    1. 共有に対する受信者のアクセス権を剥奪します。
    1. 受信者をローテーションし、既存のトークンが即座に無効化されるように`--existing-token-expire-in-seconds`を`0`に設定します。
    1. セキュアな連絡手段を通じて、意図している受信者に新たなアクティベーションリンクを共有します。
    1. アクティベーションURLにアクセスがあった後に、共有への受信者のアクセスを再度許可します。

## 4. 共有、受信者、パーティションに対する適切なレベルの粒度を検討する

[マネージド版](https://databricks.com/jp/product/delta-sharing)では、共有には1つ以上のテーブルを格納することができ、誰がどのように複数のデータセットのアクセスできるのかを管理するために、きめ細かいコントロールを用いて1人以上の受信者に共有を紐づけることができます。これによって、[オープンソース版](https://delta.io/sharing/)単体では実現が非常に困難な方法で、複数のデータセットに対するきめ細かいアクセス権管理が可能となります。さらに、パーティションの指定を行うことで、テーブルの一部のみを共有することも可能となっています([AWS](https://docs.databricks.com/data-sharing/delta-sharing/index.html#partition-specifications)、[Azure](https://docs.microsoft.com/ja-jp/azure/databricks/data-sharing/delta-sharing/#partition-specifications)のドキュメントをご覧ください)。

最小権限の原理に従って共有や受信者を実装することで、もし受信者の認証情報が漏洩したとしても、限定的なデータセット、あるいは最小限のデータのサブセットに関連づけられることになり、これらの機能のメリットを享受することができます。

## 5. IPアクセスリストを設定する

デフォルトでは、あなたの共有にアクセするのに必要なのはDelta Sharingの認証情報ファイルですので、どこから使用できるのかを限定するネットワークレベルの制限を実装することで、認証情報の漏洩の可能性を最小化することが重要となります。

受信者がアクセスできるのを信頼されたIPアドレス、例えば、皆様の企業のVPNのパブリックIPなどに限定するためにDelta SharingのIPアクセスリスト([AWS](https://docs.databricks.com/data-sharing/delta-sharing/access_list.html)と[Azure](https://docs.microsoft.com/ja-jp/azure/databricks/data-sharing/delta-sharing/access_list)のドキュメントをご覧下さい)を設定します。

アクセストークンとIPアクセスリストを組み合わせることで、許可されないアクセスのリスクを劇的に削減することができます。誰かが許可されない方法でアクセスするには、トークンのコピーを所有することに加え、許可されたネットワークからアクセスする必要があるので、トークン自身を取得するよりもはるかに困難になります。

## 6. Databricks監査ログを設定する

監査ログは[Delta Sharing](https://databricks.com/jp/product/delta-sharing)に関連するすべてのアクティビティを含む、[Databricks Lakehouse Platform](https://databricks.com/jp/product/data-lakehouse)で起きた出来事の監査記録となります。このため、それぞれのクラウドでDatabricks監査ログを設定([AWS](https://docs.databricks.com/administration-guide/account-settings/audit-logs.html)、[Azure](https://docs.microsoft.com/ja-jp/azure/databricks/administration-guide/account-settings/azure-diagnostic-logs)のドキュメントをご覧ください)し、重要なイベントに対するモニタリング、アラートを処理する自動化パイプラインを構築することをお勧めします。

[Delta Live Tables](https://databricks.com/jp/product/delta-live-tables)パイプラインのセットアップ、[Databricks SQL](https://databricks.com/jp/product/databricks-sql)アラートの設定、以下のような重要な疑問に答えるための[SQLクエリー](https://github.com/andyweaves/databricks-audit-logs/blob/main/sql/account_queries.sql)を含む、このテーマのディープダイブを行なっている関連記事[Monitoring Your Databricks Lakehouse Platform with Audit Logs](https://databricks.com/blog/2022/05/02/monitoring-your-databricks-lakehouse-platform-with-audit-logs.html)もご覧ください。

- どのDelta Shareが最も人気があるのか？
- どの国から私のDelta Shareへのアクセスが最も多いのか？
- IPアクセスリストの制限が適用されずにDelta Sharingの受信者が作成されていないか？
- 私が信頼するIPアドレス範囲外のIPアクセスリスト制限を用いてDelta Sharingの受信者が作成されていないか？
- IPアクセスリストに許可されないDelta共有へのアクセス試行があるか？
- 繰り返し認証に失敗しているDelta共有へのアクセス試行があるか？

## 7. ストレージアカウントのネットワーク制限を設定する

共有サーバーによってDelta Sharingへのリクエストが承認されると、単寿命の認証情報の配列が生成され、クライアントに返却されます。クラウドプロバイダーから直接適切なファイルをリクエストするために、クライアントはこれらのURLを使用します。このデザインは、結果がサーバーを通過することなしに、十分な帯域を使って並列に転送が行われることを意味します。また、セキュリティ観点ではDelta Sharingの受信者自身に対して、ストレージアカウントにおいて同様のネットワーク制限を実装したいと考えるかもしれません。誰でもどこからでもアクセスできるストレージアカウントにデータがホスティングされている場合、受信者レベルで共有をガードする方法は存在しません。

### Azure

Azureでは、[Unity Catalog](https://databricks.com/jp/product/unity-catalog)の代わりに背後のストレージアカウントにアクセするために[マネージドアイデンティティ](https://docs.microsoft.com/ja-jp/azure/databricks/data-governance/unity-catalog/azure-managed-identities)(現在パブリックプレビュー)を使用することをお勧めします。そして、データにアクセスする際にDelta Sharingのクライアントが使用するであろうパブリックIP範囲や信頼されるプライベートエンドポイント、仮想ネットワークに[アクセスを制限するためにストレージファイアウォール](https://docs.microsoft.com/ja-jp/azure/databricks/data-governance/unity-catalog/azure-managed-identities#recommended-configure-trusted-access-to-azure-storage-based-on-your-managed-identity)を設定します。詳細に関してはDatabricks担当者にお問い合わせください。

:::note warn
**重要！**
繰り返しになりますが、適用するネットワークレベルの制限を決定するには、可能性のあるすべてのユースケースを検討することが重要です。例えば、Delta Sharing経由でデータにアクセすることに加え、1つ以上のDatabricksワークスペースも当該のデータにアクセスする必要がある場合には、これらのワークスペースで使用されている適切な信頼プライベートエンドポイント、仮想ネットワーク、パブリックIPレンジも許可しなくてはなりません。
:::

### AWS

AWSではS3へのアクセスを制限するために、[S3バケットポリシー](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html)を使用することをお勧めします。例えば、信頼するIPアドレスとVPCにアクセスを制限するために、以下のDeny文を使用することができます。

:::note warn
**重要！**
適用するネットワークレベルの制限を決定するには、可能性のあるすべてのユースケースを検討する必要があります。例えば、

- マネージド版を使用している場合、[Unity Catalog](https://databricks.com/jp/product/unity-catalog)によって事前サイン済みURLが生成され、[お使いのリージョンのDatabricksコントロールプレーンのNAT IP](https://docs.databricks.com/administration-guide/cloud-configurations/aws/customer-managed-vpc.html#required-ips-and-storage-buckets)からのアクセスを許可する必要があります。
- 1つ以上のDatabricksワークスペースもデータにアクセスする必要があり、同じリージョンにS3バケットがあり、S3に接続するためにVPCエンドポイントを使用している、あるいは、データプレーンのトラフィックを解決するパブリックIPアドレス(例えば、NATゲートウェイ経由)を使用している場合には、適切なVPC IDからのアクセスを許可する必要があります。
- 皆様の企業ネットワーク内からの接続できなくなることを防ぐために、例えば企業のVPNのパブリックIPなど、少なくとも既知の信頼IPアドレスからのアクセスを常に許可しておくことをお勧めします。これはDeny条件がAWSコンソール内でも適用されるためです。
:::

```json
{
    "Version": "2012-10-17",
    "Statement": [
      {
            "Sid": "DenyAccessFromUntrustedNetworks",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::",
                "arn:aws:s3:::/*"
            ],
            "Condition": {
                "NotIpAddressIfExists": {
                    "aws:SourceIp": ["", "", ""]
                },
                "StringNotEqualsIfExists": {
                    "aws:SourceVpc": ["", ""]
                }
            }
        }
   ]
}
```

ネットワークレベルの制限に加え、背後のS3バケットへのアクセスを[Unity Catalog](https://databricks.com/jp/product/unity-catalog)で使用されるIAMロールに限定することもお勧めします。この理由は、上で見てきたように[Unity Catalog](https://databricks.com/jp/product/unity-catalog)はAWSのIAM/S3で提供される粗い粒度のアクセス権では実現不可能な方法で、きめ細かいアクセス制御を提供するためです。このため、直接S3バケットにアクセスすることができる誰かは、これらのきめ細かいアクセス権管理をバイパスし、あなたが意図した以上にデータにアクセスできることになってしまいます。

:::note warn
**重要！**
上述したとおり、Deny条件はAWSコンソール内にも適用されるので、少人数の許可されたユーザーがAWSのUI/APIを使用できるように管理者ロールのアクセスを許可するようにしておくことをお勧めします。

```json
{
     "Sid": "DenyActionsFromUntrustedPrincipals",
     "Effect": "Deny",
     "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::",
                "arn:aws:s3:::/*"
            ],
            "Condition": {
                "StringNotEqualsIfExists": {
                    "aws:PrincipalArn": [
                        "",
                        ""
            ]
       }
    }
 }
```
:::

## 8. ストレージアカウントのログを設定する

背後のストレージアカウントに対するネットワークレベルの制限を課することに加えて、誰かがこれらをバイパスしようとしていないかを監視したいと考えるかもしれません。このためには以下のことをお勧めします。

- AWSで[S3サーバーアクセスロギング](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerLogs.html)をセットアップし、適切なモニタリングとアラートを行うようにします。
- Azureで[診断ロギング](https://docs.microsoft.com/ja-jp/azure/storage/blobs/monitor-blob-storage?tabs=azure-portal)をセットアップし、適切なモニタリングとアラートを行うようにします。

# まとめ

分断されたデータアーキテクチャ、アクセスパターンを必要とし、企業がデータから価値を生み出すのに要する時間を遅延させていたデータ管理の問題の多くを[レイクハウス](https://databricks.com/jp/glossary/data-lakehouse)が解決してきました。今では、データチームはこれらの問題から解放されており、[オープンかつセキュアなデータ共有](https://qiita.com/taka_yayoi/items/f93f1b70fef0f75585be)が次のフロンティアとなっています。

[Delta Sharing](https://databricks.com/jp/product/delta-sharing)は、データが存在しているプラットフォームとは独立した、企業内外でリアルタイムにデータをセキュアに共有するための世界初の[オープンプロトコル](https://delta.io/sharing/)です。[Delta Sharing](https://databricks.com/jp/product/delta-sharing)と上述のベストプラクティスを組み合わせることで、企業は容易かつ安全にユーザー、パートナー、顧客とデータを交換することができます。

既存のデータマーケットプレースは、データ提供者とデータ消費者にとってのビジネス価値を最大化することの失敗していますが、[Databricks Marketplace](https://databricks.com/blog/2022/06/28/introducing-databricks-marketplace-an-open-marketplace-for-all-data-and-ai-assets.html)を用いることで、より多くの顧客にリーチするためにDatabrikcsレイクハウスプラットフォームを活用し、コストを削減し、皆様のデータプロダクトからより多くの価値を提供することができるようになります。

もし、[データ提供者パートナー](https://databricks.com/company/partners/data-partner-program)になることに興味があるのであれば、ぜひ[お話を伺えれば](https://databricks.com/p/thank-you/databricks-technology-and-data-partner-program)と思います！

### Databricks 無料トライアル

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