пользовательские атрибуты aws, не распознанные в политике назначения ролей

#amazon-web-services #amazon-s3 #amazon-cognito #amazon-iam

#amazon-web-services #amazon-s3 #amazon-cognito #amazon-iam

Вопрос:

Цель: назначить с помощью пользовательского пула cognito identitypool пользователю с пользовательским атрибутом: TenantId доступ к его собственной папке корзины в S3: s3://[TenantId]/*

Я настроил:

  • пользовательский пул с атрибутом клиента TenantId и предоставил приложению права на чтение этого атрибута
  • подключен пул удостоверений
  • создал роль и присоединил ее к пулу удостоверений для пользователей, прошедших проверку подлинности

На странице входа в систему я получил действительный idToken и, учитывая этот idToken, я выполняю следующий код (упрощенный пример без обработки ошибок и т. Д.):

 const REGION            = '...';
const USERPOOLID        = '...';
const IDENTITYPOOLID    = '...';
const BUCKET            = '...';
const KEY               = '...';
const TEST_JWT_ID_TOKEN = 'xxx.yyy.zzz';

AWS               = require('aws-sdk');
AWS.config.region = REGION;

const cognitoIdentityObj = {
    IdentityPoolId: IDENTITYPOOLID,
    Logins        : {
        [`cognito-idp.${REGION}.amazonaws.com/${USERPOOLID}`]: TEST_JWT_ID_TOKEN
    },
};
AWS.config.credentials   = new AWS.CognitoIdentityCredentials(cognitoIdentityObj);
AWS.config.credentials.get(function (err) {
    if (!err) {
        const accessKeyId     = AWS.config.credentials.accessKeyId;
        const secretAccessKey = AWS.config.credentials.secretAccessKey;
        const sessionToken    = AWS.config.credentials.sessionToken;
        if (accessKeyId amp;amp; secretAccessKey amp;amp; sessionToken) {
            const AWS_S3 = new AWS.S3({accessKeyId, secretAccessKey, sessionToken});
            const params = {
                Bucket: BUCKET,
                Key   : KEY
            };
            AWS_S3.getObject(params, function (err, data) {
                if (err) {
                    // err is an Access Denied
                    console.error(err);
                } else {
                    console.log(data);
                }
            })
        }
    }
})
 

TEST_JWT_ID_TOKEN содержит действительный токен ID, и через пул удостоверений при входе в систему пользователь привязывается к роли. У этой роли есть политика с этим определением:

 {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::<BUCKET>/${cognito-identity.amazonaws.com:custom:tenantId}/*"
            ]
        }
    ]
}
 

Однако, когда я пытаюсь прочитать из этой корзины, я получаю отказ в доступе, добавляя строку ресурса в политику, как в:

 arn:aws:s3:::<BUCKET>/* 
 

делает трюк, поэтому я уверен, что вся настройка с пулом пользователей, пулом удостоверений, ролью и политикой работает. Однако атрибут: $ {cognito-identity.amazonaws.com:custom:TenantId}, похоже, не распознается / не оценивается или …

Комментарии:

1. Кажется, вы хотите сделать s3 защищенным идентификатором cognito identity id? И что такое переменная «КЛЮЧ»?

2. Правильно, защитите s3 с помощью cognito, переменный КЛЮЧ — это ключ S3, в котором хранится содержимое (путь file /[TenantId]/папка / file.png)

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

4. @GivenNyauyanga Я этого не делал, пользовательские атрибуты нельзя использовать в таком смысле.

5. @Given NICE! на самом деле все изменилось к лучшему, в январе 2021 года это было невозможно, здорово, что вы меня не послушали, я думаю, вам следует создать ответ, который, имхо, должен быть принятым ответом.

Ответ №1:

Что ж, вам нужно добавить условие политики в политику ролей, прошедших проверку подлинности IAM, и ограничить основной доступ в политике s3. Проверьте это для доступных действий, ресурсов и ключей условий для Amazon S3. В этом случае я использую префиксный ключ, в другом случае я буду использовать ExistingObjectTag .

Я никогда не сталкивался с термином «cognito-identity.amazonaws.com: custom: TenantId». В моих проектах я использую «cognito-identity.amazonaws.com: sub» для ссылки на идентификатор роли идентификации и «cognito-identity.amazonaws.com: aud» для групповой роли.

Для политики IAM Authenticated Role я сформулировал утверждение следующим образом :

 "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket"
        ],
        "Condition": {
            "StringLike": {
                "s3:prefix": ["${cognito-identity.amazonaws.com:sub}"]
            }
        },
        "Resource": "arn:aws:s3:::<BUCKET_NAME>"
    },
    {
        "Effect": "Allow",
        "Action": [
            "s3:GetObject"
        ],
        "Resource": ["arn:aws:s3:::<BUCKET_NAME>/${cognito-identity.amazonaws.com:sub}/*"]
    }
]
 

И в политике s3 я буду ограничивать основной доступ только для аутентифицированной роли :

 "Statement": [
    {
        "Effect": "Allow",
        "Principal": {
            "AWS": <IAM_AUTH_ROLE_ARN>
        },
        "Action": "s3:ListBucket",
        "Resource": "arn:aws:s3:::<BUCKET_NAME>"
    },
    {
        "Effect": "Allow",
        "Principal": {
            "AWS": <IAM_AUTH_ROLE_ARN>
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::<BUCKET_NAME>/*"
    }
]
 

Официальная документация Amazon S3: позволяет пользователям Amazon Cognito получать доступ к объектам в своей корзине