Подтвердить что ты не робот

Политика IAM для доступа к папке S3 на основе идентификатора Cognito

Я создал политику IAM, чтобы пользователи Cognito могли писать в мой ведро S3, но я хотел бы ограничить их папками на основе их идентификатора Cognito. Я выполнил инструкции Amazon здесь и создал политику, которая выглядит так:

{
    "Effect": "Allow",
    "Action": ["s3:PutObject","s3:GetObject"],
    "Resource": [
        "arn:aws:s3:::mybucket/myappfolder/${cognito-identity.amazonaws.com:sub}*"
    ]
}

Но когда я пытаюсь загрузить с помощью v2 SDK IOS SDK, я получаю ошибку отказа в доступе.

Если я изменю последний компонент пути ресурса, чтобы заменить ${cognito-identity.amazonaws.com:sub} на явное значение identityId, которое я получаю из SDK AWSCognitoCredentialsProvider, он работает.

{
    "Effect": "Allow",
    "Action": ["s3:PutObject","s3:GetObject"],
    "Resource": [
        "arn:aws:s3:::mybucket/myappfolder/us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx*"
    ]
}

Я понял, что они должны совпадать с одним и тем же. Я что-то упустил в своей политике или должен использовать другой путь в моем запросе на загрузку?

** Обновить **

Первоначально у меня была эта проблема в iOS, поэтому сегодня я попытался сделать то же самое в node.js, и результат будет идентичным. Вот простой код, который я использую в node:

var s3 = new AWS.S3();

AWS.config.region = 'us-east-1';

AWS.config.credentials = new AWS.CognitoIdentityCredentials(AWSParams);

AWS.config.credentials.get(function (err) {

    if (!err) {

        console.log("Cognito Identity Id: " + AWS.config.credentials.identityId);

        var bucketName = 'ch123_test_bucket';

        var keyName = AWS.config.credentials.identityId + '.txt';

        var params = {Bucket: bucketName, Key: keyName, Body: 'Hello World!'};

        s3.putObject(params, function (err, data) {
            if (err)
                console.log(err)
            else
                console.log("Successfully uploaded data to " + bucketName + "/" + keyName);
        });
}

И я получаю те же результаты, что и в iOS: если я не укажу явный идентификатор cognito в политике IAM, API ответил бы 403.

Я отключил свою политику IAM до минимального минимума. Это не работает:

{
  "Statement": [
   {
     "Effect": "Allow",
     "Action": ["s3:PutObject","s3:GetObject"],
     "Resource": [
         "arn:aws:s3:::ch123_test_bucket/${cognito-identity.amazonaws.com:sub}*"
      ]
  }
 ]
}

Это делает:

{
"Statement": [
  {
    "Effect": "Allow",
    "Action": ["s3:PutObject","s3:GetObject"],
    "Resource": [
        "arn:aws:s3:::ch123_test_bucket/us-east-1:68a5dc49-6cc7-4289-8257-d3d5636f7034*"
    ]
  }
 ]
}

Я не вижу, что мне здесь не хватает... единственная документация, которую я смог найти, всегда показывает тот же пример Ресурс, который я использовал.

4b9b3361

Ответ 1

К сожалению, в настоящее время возникает проблема с ролями, сгенерированными с помощью консоли Cognito в сочетании с политическими переменными. Обновите политику доступа к ролям, чтобы включить следующее, чтобы обеспечить корректную оценку переменных политики.

"Version": "2012-10-17"

2014-09-16 Обновление: Мы обновили консоль Amazon Cognito, чтобы исправить эту проблему для ролей new, созданных с помощью мастера создания пула удостоверений. Существующим ролям по-прежнему необходимо внести изменения, отмеченные выше.

Ответ 2

Вам не хватает последней косой черты.

{
    "Effect": "Allow",
    "Action": ["s3:PutObject","s3:GetObject"],
    "Resource": [
        "arn:aws:s3:::mybucket/cognito/myappfolder/${cognito-identity.amazonaws.com:sub}/*"
    ]
}

Также попробуйте рассмотреть статью .