#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 получать доступ к объектам в своей корзине