暗号化データのスパークSQLを走らせる方法


導入Opaque SQL , 暗号化データに対するスパークSQL問い合わせを安全に実行するためのオープンソースプラットフォームUCバークリーのトップシステムとセキュリティ研究者によって構築されhardware enclaves 信頼できない環境でのプライベートデータへの問い合わせを安全に実行するには.
不透明なSQLパーティションを分割し、信頼されて信頼できないセクションにランタイムを改善し、信頼される必要があるコードの量を減らす.プロジェクトは、可能な限りスパークAPIに少し変更を導入するように設計されました.あなたがスパークSQLに精通しているならば、あなたはすでに不透明なSQLで安全な質問を走らせる方法を知っています.

🚀 Prefer a quick, hands-on ride? Follow the Quick Start Guide with Docker and tell us about your experience.


スパークSQLとは


新しい人たちのために.Apache Spark データの大規模なバッチ処理のためのデータの科学者やエンジニアによって使用される人気の分散コンピューティングフレームワークです.モジュールの一つです.Spark SQL , ユーザーが構造化された、表形式のデータと対話することができます.これはDataSet/DataFrame ScalaまたはPythonで利用できるAPI、または標準を使用することによってSQL queries . 以下に簡単な例を示します.

// Convert a sequence of tuples into a Spark DataFrame
val data = Seq((dog, 4), (chameleon, 1), (cat, 5))
val df = data.toDF(pet, count)

/********** DataFrame API **********/

// Create a new DataFrame of rows with `count` greater than 3
val apiResult = df.filter($count > lit(3))

/******* Writing SQL queries *******/

// Register `df` as a virtual table used to evaluate SQL on
df.createOrReplaceTempView(df)
// Create a new DataFrame of rows with `count` greater than 3
val sqlStrResult = spark.sql(SELECT * FROM df WHERE count > 3)

PythonでPySpark経由で:

# Convert a list of tuples into a Spark DataFrame
data = [("dog", 4), ("chameleon", 1), ("cat", 5)]
df = spark.createDataFrame(data).toDF(["pet", "count"])

######### Dataframe API ############

# Create a new DataFrame of rows with `count` greater than 3
api_result = df.filter(df["count"] > lit(3))

######## Write SQL queries #########

# Register `df` as a virtual table used to evaluate SQL on
df.createOrReplaceTempView(pets)
# Create a new DataFrame of rows with `count` greater than 3
val sqlStrResult = spark.sql(SELECT * FROM pets WHERE count > 3)

😉 If you haven't already, now is a good time to head over and install Spark and play with the code at the prompt.


スパークコンポーネント


分散コンピューティングアーキテクチャのために、スパークはマスター労働者アーキテクチャを採用します.
ドライバはメインスパークプログラムが実行されるプロセスです.ユーザーのコードを実行者に実行するためにジョブに変換する責任があります.たとえば、SQLクエリを指定すると、ドライバはSQLプランをビルドし、最適化を実行し、実行エンジンが使用する物理演算子を解決します.その後、労働者の間で計算タスクをスケジュールし、完了までの進捗状況を追跡します.使用するデータパーティションの数や各ワーカーがどれくらいのメモリを持っているかなどのメタデータは、ドライバに設定されます.
実行者は実際の計算に責任があります.ドライバからのタスクが与えられた場合、実行者は計算を実行し、ドライバの進捗状況を調整します.彼らはすべてのスパークアプリケーションの開始時に起動され、動的に削除することができますし、必要に応じてドライバによって追加されます.

MCを用いた暗号化データの計算


MCのプロジェクトは、安全なマルチパーティのコラボレーションとcoopeetationのためのツールのコレクションです.この目標は、ハードウェアの飛び地を使用して達成されます.飛び地は強いセキュリティ保証を提供します.そして、使用中にデータをメモリに入れておきます.また、提供するremote attestation , これは、計算の責任者が命令の正しいセットを実行していることを保証します.その結果、パブリッククラウドのような信頼できない環境で、機密データを計算できるプラットフォームです.

不正なSQL



不透明SQLクエリの解決スタック.MCのコンポーネントは青です.
高いレベルでは、不透明なSQLは、スパークリングアーキテクチャを信頼できない信頼できるコンポーネントに分割するハードウェアエンクラベスを使用するスパークパッケージです.もともと開発されたUC Berkeley’s RISELab の実装としてNSDI 2017 paper .

信頼できないドライバ


スパークドライバがまだ計画を実行する必要があるので、クエリとテーブルスキーマは隠されませんが、ドライバは完全に暗号化されたデータにアクセスすることができます.ビルドされた物理計画は、バニラスパーク演算子の代わりに完全に暗号化された演算子を含みます.(しかし、ドライバーが計画を構築しているので、クライアントは計画が作成されたことを確認する必要があります.サポートは現在進行中であり、次のリリースの一部となります)

実行者マシンの飛び地


実行中に、Executorプログラムは、ハードウェアの範囲内にロードされた不透明なSQLのネイティブライブラリに呼び出します.ネイティブライブラリは暗号化されたSQL演算子を提供します.SSNS、銀行口座番号、またはなどの任意の個人的な列データPHI メモリに暗号化されたままで、飛び地によって保護されています.

MCのクライアント:エントリポイント


The MC² Client スパークドライバと通信し、リモート認証とクエリの提出を行う責任があります.これは、ユーザーのマシンにある信頼できるコンポーネントです.

遠隔認証


どのような?単にそれを置くために、リモート証明はちょうどユーザーが飛び地が正しく正しいコードで実行される初期化されたことを確かめる方法である.クライアントはドライバーに話しかけます.そして、それは実行者に実行している飛び地への認証情報を転送します.いいえ飛び地は、認証が完了し、結果がユーザーによって検証されるまで任意のデータを復号することができます.それはあなたのための方法として、データの所有者は、サインアップし、あなたに代わってコードを実行を開始するには、飛び地を信頼する.

クエリ提出


Attestationが正常に完了した後にクエリー提出が発生し、スパークコードが評価のためにドライバにリモートで送信されるステップです.どんな中間の値も、実行ステージの生涯を通して暗号化されたままです.

MCクライアントが不透明SQLと通信する方法

用途


不透明なSQLのためのキーデザインは、可能な限りSQLをスパークするようにAPIを持つことです.暗号化されたデータフレームは特別な形式で読み込まれます:

// Unencrypted
val df = spark.read.format(com.databricks.spark.csv)
// Encrypted
val dfEncrypted = spark.read.format(edu.berkeley.cs.rise.opaque.EncryptedSource)

ローディング後、スパーク変換はバニラスパークと全く同じように適用されます.

val result = dfEncrypted.filter($count > lit(3))
result.explain
// == Physical Plan ==
// EncryptedFilter (count#5 > 3)
// +- EncryptedLocalTableScan [word#4, count#5], [[foo,4], [bar,1], [baz,5]]

クエリを作成した後に結果を保存するには、読み込みと同じ書式を使用します.

result.write \
  .format(edu.berkeley.cs.rise.opaque.EncryptedSource) \
  .save(path/to/result)

💡 Now is the time to check our complete API docs to continue your learning journey.


ラッピング


不透明なSQLは、バニラスパークにほとんどオーバーヘッドで、暗号化されたデータグラムの上で解析処理を可能にします.順番に、この拡張モジュールは、クラウドで使用中のデータだけでなく、残りの部分を保護します.クエリは、リモートのMCのクライアントは、簡単に使用できるインターフェイスのMCのスタック上のすべての計算サービスと通信するためのインターフェイスを使用して送信されます.
チェックアウトmore blog posts MC社プロジェクトでデータを安全に処理する方法私たちはあなたの貢献を愛する✋ サポート⭐! してくださいGithub repo どのように貢献できるかを確認します.少しの貢献も少なすぎる.
編集
もともと投稿here そば
.