【问题标题】:CosmosDB UserPermission with ResourcePartitionKey not Enforced未强制执行资源分区键的 Cosmos DB 用户权限
【发布时间】:2019-01-22 08:12:12
【问题描述】:

我正在尝试实现此CosmosDB document 中描述的行为,并在用户权限上附加 ResourcePartitionKey 限制以将资源令牌限制为仅访问属于指定分区键的文档但是我无法使其工作.

使用 SQL REST API,我在使用 resourcepartitionkey 密钥对创建 UserPermission 对象的 POST 中没有收到任何错误,并且初始返回的对象以及后续 GET 也显示在获取资源令牌时存在“resourcepartitionkey”。

对权限中指定的适当集合使用资源令牌,我可以列出集合中的所有文档。当使用“x-ms-documentdb-partitionkey”标头时,我可以定位任何我喜欢的分区键。如果没有“x-ms-documentdb-partitionkey”标头,它只会返回整个集合。

该集合是一个全新的、无限制的 1000 RU,分区键为“/rpk”。集合的创建后查询显示分区键配置如下

"partitionKey": {
    "paths": [
        "\/rpk"
    ],
    "kind": "Hash"
} 

以下是创建期间返回的用户权限,显示“resourcepartitionkey”存在

{
    "resource": "dbs/dbName/colls/collectionName/",
    "id": "read-collection",
    "resourcepartitionkey": "rpk1",
    "permissionMode": "read",
    "_rid": "lH9FACGGKwAhslfihB0pAA==",
    "_self": "dbs\/lH9FAA==\/users\/lH9FACGGKwA=\/permissions\/lH9FACGGKwAhslfihB0pAA==\/",
    "_etag": "\"0000ba07-0000-0000-0000-5b7418770000\"",
    "_ts": 1534335095,
    "_token": "type=resource&ver=1&sig=<resource token signature>"
}

以下是使用上述资源令牌的文档请求。我希望这会失败,因为针对分区集合缺少“x-ms-documentdb-partitionkey”标头,但它都成功并继续从集合中的所有分区键返回记录(我的测试数据集中只有 2 个)

GET https://accountname.documents.azure.com/dbs/dbName/colls/collectionName/docs HTTP/1.1
authorization: type%3dresource%26ver%3d1%26sig<resource token signature>
x-ms-version: 2017-02-22
x-ms-max-item-count: -1
x-ms-date: Wed, 15 Aug 2018 12:11:35 GMT
User-Agent: Mozilla/5.0 (Windows NT; Windows NT 10.0; en-AU) WindowsPowerShell/5.1.17134.165
Content-Type: application/json
Host: accountname.documents.azure.com

来自上述请求的响应正文显示来自分区键 rpk1 和 rpk2 的文档,即使用户权限配置为 rpk1。

{
    "_rid": "lH9FAKbDh4c=",
    "Documents": [
        {
            "id": "blue",
            "rpk": "rpk1",
            "_rid": "lH9FAKbDh4cCAAAAAAAAAA==",
            "_self": "dbs\/lH9FAA==\/colls\/lH9FAKbDh4c=\/docs\/lH9FAKbDh4cCAAAAAAAAAA==\/",
            "_etag": "\"ec012ca1-0000-0000-0000-5b73ab440000\"",
            "_attachments": "attachments\/",
            "_ts": 1534307140
        },
        {
            "id": "red",
            "rpk": "rpk2",
            "_rid": "lH9FAKbDh4cDAAAAAAAAAA==",
            "_self": "dbs\/lH9FAA==\/colls\/lH9FAKbDh4c=\/docs\/lH9FAKbDh4cDAAAAAAAAAA==\/",
            "_etag": "\"ec012da1-0000-0000-0000-5b73ab580000\"",
            "_attachments": "attachments\/",
            "_ts": 1534307160
        }
    ],
    "_count": 2
}

我假设我错过了一些明显的东西,或者在 UserPermission 中为“resourcepartitionkey”使用了不正确的值,但我无法确定是什么。任何想法都非常感谢。

【问题讨论】:

    标签: azure-cosmosdb azure-cosmosdb-sqlapi


    【解决方案1】:

    经过数小时的反复试验,我终于解决了我在 POST 创建用户权限期间引起的问题。

    首先,虽然创建用户权限将验证名称“resourcePartitionKey”,但它不检查是否区分大小写。由于敏感度不正确,返回的 UserPermission 对象的值存在但不提供任何安全控制(危险情况 #1)

    其次,不验证输入值是否为数组类型。它再次被接受并在用户权限对象中返回给您,但再次不提供安全控制(危险情况 #2)

    下面是一个完整的工作示例,其中权限 ID 称为“read-collection”,resourcePartitionKey 配置为“rpk1”,最终表现出要求“x-ms-documentdb-partitionkey”的预期行为,并且仅从指定的分区键返回值。

    POST https://accountname.documents.azure.com/dbs/dbName/users/userName/permissions HTTP/1.1
    authorization: type%3dmaster%26ver%3d1.0%26sig<signature>
    x-ms-version: 2017-02-22
    x-ms-date: Thu, 16 Aug 2018 04:09:44 GMT
    User-Agent: Mozilla/5.0 (Windows NT; Windows NT 10.0; en-AU) WindowsPowerShell/5.1.17134.165
    Content-Type: application/json
    Host: accountname.documents.azure.com
    Content-Length: 215
    
    {
        "resource":  "dbs/dbName/colls/collectionName/",
        "id":  "read-collection",
        "resourcePartitionKey":  [
                                     "rpk1"
                                 ],
        "permissionMode":  "read"
    } 
    

    如果有人知道在哪里记录 CosmosDB SQL Rest API 的 DCR 或错误,请告诉我,因为在创建资源权限期间没有适当的验证,资源令牌可能会分发给低信任度的客户端,这些客户端可以获得意外的完全访问权限收集数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多