基于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读取数据,流量费用由提供方承担(需提前规划)。
相关推荐
大草原的小灰灰14 分钟前
Python基础语法
开发语言·python
小葱炖豆腐1 小时前
python绘制excel折线图
python·excel·numpy·pandas·matplotlib
Ticnix2 小时前
MCP 实战:把工具层从 Agent 里彻底解耦
python·mcp
是隼人3 小时前
buuctf-pwn picoctf_2018_shellcode(ret2shellcode)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
XZ-0700013 小时前
week4-1-figure画布
python
小马同学-3 小时前
OpenStack 使用实战:Web 界面与 CLI 命令行实验
运维·云计算·openstack
hasty4 小时前
_proto__ 不是普通键:从 JSON 反序列化看原型污染
安全·json
步行cgn4 小时前
Spring 注入 Map 集合详解
数据库·python·spring
今儿敲了吗4 小时前
03停用词过滤
笔记·python
Wang's Blog4 小时前
Java框架快速入门: Spring Security+OAuth2之方法级安全注解
java·安全·spring