Multi-tenant secure data sharing with envelope encryption (AES-256-GCM) on MinIO, inspired by Snowflake Data Sharing.
-
TenantProvider (租户提供方)
- 每个租户有独立的主密钥 (TMK)
- 负责文件加密上传到 MinIO
- 创建和管理跨租户共享
-
MultiTenantCloudServices (云服务层)
- 中央权限控制中心
- 验证共享权限
- 代理解密文件密钥
-
TenantConsumer (租户消费方)
- 通过云服务层访问共享文件
- 临时获取解密密钥,用后即焚
-
MinIOStorage (存储层)
- 分离存储加密数据和元数据
- 支持租户隔离的存储结构
- 信封加密: 文件用随机密钥加密,密钥用租户主密钥包装
- 租户隔离: 每个租户有独立的存储空间和密钥
- 权限控制: 细粒度的文件级共享权限
- 密钥管理: 消费方永远无法获得提供方的主密钥
pip install -r requirements.txt使用 Docker 启动本地 MinIO:
docker run -p 9000:9000 -p 9001:9001 \
-e "MINIO_ROOT_USER=minioadmin" \
-e "MINIO_ROOT_PASSWORD=minioadmin" \
minio/minio server /data --console-address ":9001"python minio_multitenant_share.pytenant-data: 存储加密文件tenant-metadata: 存储文件元数据和共享权限
tenant-data/
├── company_a/
│ └── files/
│ ├── uuid1.enc
│ └── uuid2.enc
└── company_b/
└── files/
└── uuid3.enc
tenant-metadata/
├── company_a/
│ └── metadata/
│ ├── uuid1.json
│ └── uuid2.json
├── company_b/
│ └── metadata/
│ └── uuid3.json
└── shares/
├── share_id_1/
│ └── grants.json
└── share_id_2/
└── grants.json
storage = MinIOStorage()
provider = TenantProvider("company_a", storage)
# 上传文件
file_id = provider.upload_file("report.txt", b"Confidential data")share_id = provider.create_share(
share_name="financial_data",
file_ids=[file_id],
consumer_tenants=["company_b", "company_c"]
)consumer = TenantConsumer("company_b")
consumer.access_shared_file(share_id, file_id, cloud_services)provider.revoke_share(share_id)运行脚本将展示以下场景:
- 多个租户上传加密文件到 MinIO
- 创建跨租户文件共享
- 授权租户访问共享文件
- 未授权访问被拒绝
- 共享撤销后访问失败
storage = MinIOStorage(
endpoint="localhost:9000",
access_key="minioadmin",
secret_key="minioadmin"
)- 使用 HTTPS 连接 (
secure=True) - 配置适当的访问凭证
- 设置存储桶策略和生命周期规则
- 启用服务端加密 (SSE)
- 文件版本管理
- 共享过期时间
- 审计日志
- 批量文件操作
- 文件预览和搜索