未强制执行具有资源分区键的 Cosmos DB 用户权限

CosmosDB UserPermission with ResourcePartitionKey not Enforced

我正在尝试通过对用户权限的附加 ResourcePartitionKey 限制来实现此 CosmosDB document 中描述的行为,以将资源令牌限制为仅访问属于指定分区键的文档,但是我不能'让它工作。

使用 SQL REST API,我没有收到 POST 使用 resourcepartitionkey 密钥对和初始 [=53] 创建 UserPermission object 的错误=]ed object 以及后续的 GET 也会在获取资源令牌时显示 "resourcepartitionkey"。

根据权限中指定的适当 collection 使用资源令牌,我可以列出 collection 中的所有文档。当使用 "x-ms-documentdb-partitionkey" header 时,我可以定位任何我喜欢的 paritionkey。没有 "x-ms-documentdb-partitionkey" header,它只是 return 整个 collection。

collection 是一个全新的 Unlimited 1000 RU,分区键为“/rpk”。 Post collection 的创建查询显示分区键配置如下

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

下面是在创建过程中 returned 的用户权限,显示 "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" header 针对分区 collection 但它都成功并从 [=39] 中的所有分区键继续 return 记录=](我的测试数据集中只有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

来自上述请求的响应 Body 显示来自分区键 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' 使用了不正确的值,但我无法确定是什么。非常感谢任何想法。

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

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

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

下面是一个完整的工作示例,其中权限 ID 被称为 "read-collection" 并且 resourcePartitionKey 配置为 'rpk1' 最终表现出请求需要 "x-ms-documentdb-partitionkey" 的预期行为并且仅returns 来自指定分区键的值。

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 的 DCR 或错误 SQL 休息 API,请告诉我,因为在创建资源权限期间没有进行适当的验证,资源令牌可能会分发给可以意外获得对集合数据的完全访问权限的低信任客户端。