基于Azure Delta Lake和Databricks的安全数据共享(Delta Sharing)

设计Azure云架构方案实现Azure Delta Lake和Azure Databricks的安全数据共享(Delta Sharing),实现安全分发数据,生成只读共享链接(Bearer Token),第三方可直接查询 Azure 数据(无需复制),以及跨公司数据协作(如供应商获取脱敏后的销售数据),以及具体实现的详细步骤和关键PySpark代码。

此方案通过Delta Sharing实现安全、实时的跨组织数据共享,结合Azure RBAC、动态脱敏和Bearer Token控制,确保数据无需复制即可安全分发。接收方通过标准PySpark接口访问,降低协作门槛。

架构设计概览
  1. 数据存储层:使用Azure Data Lake Storage Gen2 (ADLS Gen2) 存储Delta Lake表。
  2. 数据处理层:Azure Databricks用于数据加工、脱敏和Delta Sharing配置。
  3. 安全层
    • Azure RBAC 控制存储访问。
    • Databricks权限管理共享和Token。
    • 动态数据脱敏(视图或UDF)。
  4. 共享层:Delta Sharing协议生成只读链接(Bearer Token),第三方通过Databricks或兼容客户端直接访问。

详细实现步骤

1. 数据准备与脱敏

a. 创建ADLS Gen2存储账户

  • 启用Hierarchical Namespace(Delta Lake要求)。
  • 创建容器(如delta-lake)用于存储原始数据。

b. 在Databricks中挂载ADLS Gen2

python 复制代码
configs = {
  "fs.azure.account.auth.type": "OAuth",
  "fs.azure.account.oauth.provider.type": "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
  "fs.azure.account.oauth2.client.id": "<client-id>",
  "fs.azure.account.oauth2.client.secret": "<client-secret>",
  "fs.azure.account.oauth2.client.endpoint": "https://login.microsoftonline.com/<tenant-id>/oauth2/token"
}

dbutils.fs.mount(
  source = "abfss://delta-lake@<storage-account>.dfs.core.windows.net/",
  mount_point = "/mnt/delta",
  extra_configs = configs
)

c. 写入原始Delta表

python 复制代码
# 示例:销售数据
sales_data = [
  ("order1", "customer1@example.com", 100.0, "2023-10-01"),
  ("order2", "customer2@example.com", 200.0, "2023-10-02")
]
df = spark.createDataFrame(sales_data, ["order_id", "customer_email", "sales_amount", "date"])
df.write.format("delta").save("/mnt/delta/sales")

d. 创建脱敏视图

python 复制代码
# 使用MD5哈希邮箱,隐藏敏感信息
spark.sql("""
CREATE OR REPLACE VIEW sales_masked AS
SELECT 
  order_id, 
  MD5(customer_email) AS customer_email_hash,
  sales_amount,
  date
FROM delta.`/mnt/delta/sales`
""")

2. 配置Delta Sharing

a. 安装Delta Sharing库

在Databricks集群中安装库:

ini 复制代码
com.databricks:delta-sharing-spark_2.12:0.6.0

b. 创建Share并添加表

python 复制代码
# 创建Share
spark.sql("CREATE SHARE IF NOT EXISTS sales_share")

# 将脱敏视图加入Share
spark.sql("ALTER SHARE sales_share ADD TABLE sales_masked")

# 可选:添加分区表或特定版本
# spark.sql("ALTER SHARE sales_share ADD TABLE sales_masked VERSION AS OF 0")

c. 创建Recipient并生成Token

python 复制代码
# 创建第三方Recipient(公司或用户)
spark.sql("CREATE RECIPIENT IF NOT EXISTS supplier_company")

# 生成Bearer Token(长期有效,生产环境建议设置过期时间)
spark.sql("""
ALTER RECIPIENT supplier_company 
SET OPTIONS (
  bearerToken = 'eyJhbGciOiJSUzI1NiIsImtpZ...'
)
""")

d. 生成共享元数据文件

  • 通过Databricks UI导航到 Delta Sharing → Shares → Export Metadata File ,获取共享链接(如s3://<bucket>/share/profile.share)。

3. 安全加固

a. 存储访问控制

  • 在ADLS Gen2中设置RBAC,仅允许Databricks的Managed Identity读取数据。
  • 启用存储防火墙,限制仅允许Databricks工作区IP访问。

b. Databricks权限

  • 使用Databricks的 Table ACLs 限制对底层表的直接访问。
  • 为Delta Share配置只读权限。

c. Token管理

  • 使用Azure Key Vault存储Bearer Token,避免硬编码。
  • 定期轮换Token(需通过Databricks SQL更新Recipient配置)。

4. 第三方访问数据(接收方)

a. 接收方加载共享数据

python 复制代码
from delta_sharing import DeltaSharingClient

# 加载元数据文件(从安全位置获取)
client = DeltaSharingClient(profile="<path-to-profile.json>")

# 列出可用表
client.list_all_tables()

# 读取数据
df = client.load_table("share_name.sales_masked")
df.show()

b. PySpark直接查询

python 复制代码
# 配置Delta Sharing Reader
shared_df = (spark.read
  .format("deltaSharing")
  .option("shareCredentialsFile", "/dbfs/mnt/secure/supplier_credentials.json")
  .load("<profile-url>#sales_share.default.sales_masked")
)

# 执行分析查询
shared_df.filter("sales_amount > 150").show()

关键注意事项

  1. 数据实时性:Delta Lake自动更新,接收方始终获取最新版本。
  2. 网络连通性:确保ADLS Gen2允许接收方网络访问(IP白名单或Private Link)。
  3. 成本控制:接收方直接从ADLS Gen2读取数据,流量费用由提供方承担(需提前规划)。
相关推荐
WJSKad12358 分钟前
果园树干识别与定位_faster-rcnn_x101-32x4d_fpn_1x_coco改进实践
python
深蓝电商API8 分钟前
Scrapy中间件实战:自定义请求头和代理池实现
python·scrapy·中间件
hui函数14 分钟前
Python系列Bug修复|如何解决 pip install 安装报错 invalid command ‘bdist_wheel’(缺少 wheel)问题
python·bug·pip
hui函数16 分钟前
Python系列Bug修复|如何解决 pip install -r requirements.txt 私有索引未设为 trusted-host 导致拒绝 问题
python·bug·pip
子午18 分钟前
【2026原创】动物识别系统~Python+深度学习+人工智能+模型训练+图像识别
人工智能·python·深度学习
o_insist23 分钟前
LangChain1.0 实现 PDF 文档向量检索全流程
人工智能·python·langchain
脑洞AI食验员28 分钟前
智能体来了:用异常与文件处理守住代码底线
人工智能·python
边际效应35 分钟前
第十三章:Native层安全深度剖析
安全
曲幽41 分钟前
FastAPI登录验证:用OAuth2与JWT构筑你的API安全防线
python·fastapi·web·jwt·token·oauth2
边际效应41 分钟前
第四章:Unidbg原理与环境搭建
安全