基于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", "[email protected]", 100.0, "2023-10-01"),
  ("order2", "[email protected]", 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读取数据,流量费用由提供方承担(需提前规划)。
相关推荐
C++业余爱好者1 小时前
ModuleNotFoundError: No module named ‘flask‘ 错误
后端·python·flask
钢铁男儿4 小时前
Python 用户账户(让用户拥有自己的数据)
数据库·python·sqlite
FreakStudio5 小时前
一文速通Python并行计算:02 Python多线程编程-threading模块、线程的创建和查询与守护线程
python·嵌入式·多线程·并行计算·电子diy
冷琴19965 小时前
基于python+django的酒店预定网站-酒店管理系统源码+运行步骤+课程学习
python·django·旅游
蹦蹦跳跳真可爱5895 小时前
Python---数据分析(Pandas十一:二维数组DataFrame统计计算二)
python·数据分析·pandas
ice_junjun5 小时前
OpenCV Video 模块使用指南(Python 版)
人工智能·python·opencv
geekmice6 小时前
通过Typora + PicGo + 阿里云对象存储(OSS)实现图床
阿里云·云计算
IYU_6 小时前
常见中间件漏洞攻略-Weblogic篇
安全·web安全·网络安全
一问三不知_7 小时前
pyqt5报错:qt.qpa.plugin: Could not find the Qt platform plugin “xcb“(已解决)
开发语言·python·qt·ubuntu·conda·bug
赛卡7 小时前
自动驾驶背后的数学:ReLU,Sigmoid, Leaky ReLU, PReLU,Swish等激活函数解析
人工智能·pytorch·python·神经网络·机器学习·数学建模·自动驾驶