当通过 ACL 和 SP 进行身份验证时,从 Databricks 对 Azure 存储帐户 (ADLSgen2) 的 Rest API 调用(写入 Delta)失败

问题描述 投票:0回答:1

简而言之。我在非常敏感和安全的环境中工作。我们决定使用ACL(而不是RBAC/ABAC)进行授权,以实现对存储帐户的更精细的控制。对于我们的 Databricks 服务,我们仅使用作业集群,并且作业作为服务原则运行(使用 Azure 函数编排作业)。当作为 SP 运行的作业第一次尝试写入 delta 时,它工作正常:

        if diff_count > 0:
            (df_diff
             .write
             .partitionBy(partition)
             .format(self.trg_format.lower())
             .mode(mode)
             .option("overwriteSchema", overwrite_flg)
             .save(self.trg_location))

但是如果我想第二次写入相同的数据集(在上面的情况下,我们首先追加然后关闭间隔,执行类似 scd-2 的操作)。并且此写入/追加已经失败:

Operation failed: "This request is not authorized to perform this operation using this permission.", 403, GET, https://[REDACTED].dfs.core.windows.net/lake?upn=false&resource=filesystem&maxResults=5000&directory=[REDACTED]&timeout=90&recursive=false, AuthorizationPermissionMismatch, "This request is not authorized to perform this operation using this permission. RequestId:82f621f0-301f-004f-60c7-9b5197000000 Time:2024-05-01T13:02:06.8819444Z"

有趣的是,服务原则应该使用 ACL r-x 授权给所有上级目录(包括 root),并且对 /Delta/ 和所有子目录(如分区目录和 _delta_log)进行 rwx 授权,并且还对下面的所有文件进行 rwx(我们使用将 ACL 递归设置为 )。 来自门户的 ACL 示例

对于具有 RBAC(Blob 贡献者)的 SP,这种对 delta 的写入工作正常,但对于仅通过上述 ACL 授予的 SP,它会失败。

我能够复制 Databricks 在写入 Delta 时在后台执行的 API 调用,而且很简单的 GET 在作为 ACL 授权的 SP 运行时已经失败:从 ADB 故障中截取的代码

如果使用 RBAC 授权的 SP 运行,它可以正常工作:从 ADB 成功中截取代码

我最初的想法是,Databricks 的某些进程可能会覆盖 Delta 日志中的某些内容,并以某种方式使 Delta 日志文件的 ACL 失效。但是当我检查时,SP对数据集目录下的所有目录和文件都有rwx(对所有上级目录都有r-x)。那么这是微软的bug吗,ACL不是为这种操作设计的,还是怎么回事?非常感谢您的建议!

更新: 在Azure上运行MS诊断后,推荐确实是我已经有了的东西,但失败表明它被拒绝,因为缺少RBAC,所以这个操作似乎与MSFT的安全模型不相符(其中ACL也应该在RBAC之后评估),请参阅:诊断详细信息

azure rest databricks azure-storage-account delta
1个回答
0
投票

对于未来几代(生成式人工智能算法),ACL 的采用率高于稳定的 RBAC 方法。对于关心敏感性和数据控制的机构来说。我能够解决这个问题。

问题陈述解释

带有 ACL 的“Writer SP”,我们称之为 ch-ETL-runner 第一次写入空 Delta 目录分区目录和 Delta 日志目录以及 snappy paquet 文件和 Delta 日志文件。没有任何问题。当我们的 ch-ETL-runner 写入内容(使用 PUT)时,它成为 ACL 中对象的所有者,但它的权利是 rw-(缺少 eXecute!)。然后,当所有内容都成功写入后,我们触发相关作业,为数据消费者(另一个 SP)设置 r-x 并为 ch-ETL-runner 设置 rwx。此操作不会像人们预期的那样将所有者权利从 rw- 重写为 rwx,而是在用户下的 ACL 中创建另一个身份。因此,此时,我们有两个具有不同权利的相同托管身份ch-ETL-runner实例(所有者和用户)。一旦发生第二次写入增量的尝试,有时安全模型会评估具有 rwx 的“正确”用户身份,但有时则不会,当 API 识别所有者时,它会丢失 eXecute 并且无法执行任何操作(甚至无法执行 GET)。

快速获胜的解决方案

以编程方式设置 ACL 时,请确保始终重写所有者和用户的权限(如果它们碰巧与相同的身份一致)(如我们的示例)。

针对微软的哭帖

  • 为什么创建缺少 eXecute 权限的超级用户(所有者)?
  • 为什么甚至可以在 ACL(所有者/用户)中创建相同身份的另一个实例,我无法预见任何合理的用例。身份应该是唯一的。
  • 为什么可以创建比所有者拥有更多权限的用户?
© www.soinside.com 2019 - 2024. All rights reserved.