基于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接口访问,降低协作门槛。
架构设计概览
- 数据存储层:使用Azure Data Lake Storage Gen2 (ADLS Gen2) 存储Delta Lake表。
- 数据处理层:Azure Databricks用于数据加工、脱敏和Delta Sharing配置。
- 安全层:
- Azure RBAC 控制存储访问。
- Databricks权限管理共享和Token。
- 动态数据脱敏(视图或UDF)。
- 共享层:Delta Sharing协议生成只读链接(Bearer Token),第三方通过Databricks或兼容客户端直接访问。
详细实现步骤
1. 数据准备与脱敏
a. 创建ADLS Gen2存储账户
- 启用Hierarchical Namespace(Delta Lake要求)。
- 创建容器(如
delta-lake
)用于存储原始数据。
b. 在Databricks中挂载ADLS Gen2
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表
# 示例:销售数据
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. 创建脱敏视图
# 使用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集群中安装库:
com.databricks:delta-sharing-spark_2.12:0.6.0
b. 创建Share并添加表
# 创建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
# 创建第三方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. 接收方加载共享数据
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直接查询
# 配置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()
关键注意事项
- 数据实时性:Delta Lake自动更新,接收方始终获取最新版本。
- 网络连通性:确保ADLS Gen2允许接收方网络访问(IP白名单或Private Link)。
- 成本控制:接收方直接从ADLS Gen2读取数据,流量费用由提供方承担(需提前规划)。