未实施带有ResourcePartitionKey的CosmosDB UserPermission

时间:2018-08-15 12:39:53

标签: azure-cosmosdb azure-cosmosdb-sqlapi

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

使用SQL REST API,通过POST创建带有resourcepartitionkey密钥对的UserPermission对象的过程中,我没有收到任何错误,并且在获取资源令牌时,初始返回的对象以及随后的GET都显示了“ resourcepartitionkey”。 / p>

使用针对权限中指定的适当集合的资源令牌,我可以列出集合中的所有文档。使用“ x-ms-documentdb-partitionkey”标头时,我可以定位任何我喜欢的paritionkey。没有“ 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'使用了错误的值,但是我无法确定是什么。任何想法都非常感谢。

1 个答案:

答案 0 :(得分:1)

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

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

第二,输入值未验证为数组类型。再次被用户许可对象接受并返回给您,但再次没有提供安全控制(危险情况2)

下面是一个完整的工作示例,其中许可ID被称为“读取-收集”,并且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或bug,请告知我,因为在资源许可创建过程中未进行适当的验证,资源令牌可能会分发给低信任度客户端,这些客户端可能会意外地完全访问收集数据。