Пропуск пользователя CosmosDB с ResourcePartitionKey не применяется
Я пытаюсь реализовать поведение, описанное в этом документе CosmosDB, с помощью дополнительных ограничений ResourcePartitionKey на разрешения пользователя, чтобы ограничить токен ресурса только доступом к документам, принадлежащим указанному ключу раздела, однако я не могу заставить его работать.
С помощью API REST SQL я не получаю ошибок с POST для создания объекта User Permission с парой ключей resourcepartitionkey, и как исходный возвращаемый объект, так и последующие GET также показывают "resourcepartitionkey", присутствующий при получении токена ресурса.
Используя маркер ресурса для соответствующей коллекции, указанной в разрешении, я могу перечислить все документы в коллекции. При использовании заголовка "x-ms-documentdb-partitionkey" я могу указать любой ключ parition, который мне нравится. Без заголовка "x-ms-documentdb-partitionkey" он просто возвращает всю коллекцию.
Коллекция является совершенно новой, неограниченной, 1000 RU с ключом раздела '/rpk'. Запрос на создание коллекции для коллекции показывает ключ раздела, настроенный следующим образом
"partitionKey": {
"paths": [
"\/rpk"
],
"kind": "Hash"
}
Ниже приведено разрешение пользователя, возвращаемое во время создания, с указанием "ключа_ресурса"
{
"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
}
Я предполагаю, что пропустил что-то очевидное, или использовал неверное значение для "resourcepartitionkey" в User Permission, но не могу определить, что именно. Любые мысли с благодарностью.
1 ответ
После многих часов проб и ошибок я наконец решил свою проблему, которая возникает во время создания разрешения пользователя POST.
Во-первых, хотя создание разрешения пользователя будет проверять имя "resourcePartitionKey", оно не проверяет чувствительность к регистру. При неправильной чувствительности возвращенный объект UserPermission имеет текущее значение, но не предоставляет никаких мер безопасности (опасная ситуация #1)
Во-вторых, входное значение не проверяется на наличие типа массив. Он снова принят и возвращен вам в объекте разрешения пользователя, но снова не обеспечивает контроль безопасности (опасная ситуация № 2)
Ниже приведен полный рабочий пример, где идентификатор разрешения называется "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"
}
Если кто-то знает, где регистрировать DCR или ошибку для API-интерфейса SQL Rest CosmosDB, пожалуйста, дайте мне знать, так как без надлежащей проверки при создании разрешения ресурса токены ресурса могут распространяться среди клиентов с низким уровнем доверия, которые могут получить неожиданный полный доступ к данным сбора.