#amazon-web-services #amazon-s3
Вопрос:
Я пытаюсь разрешить нескольким пользователям доступ к одному ведру S3. Однако они должны иметь доступ только к определенному каталогу в этом сегменте.
Представьте себе следующее
my-bucket
- client-1
- important-doc.txt
- client-2
- somefile.jpg
- my-own-file.js
Имея это в виду (позволяя, скажем, клиенту 1 получить доступ только к этому каталогу) У меня есть следующая политика:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::my-bucket"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": "arn:aws:s3:::my-bucket/client-1/*"
}
]
}
Это работает так, как вы и ожидали, client-1
может подключиться к ведру, перейти в их конкретный каталог и загрузить. Однако, похоже, у них есть возможность перечислить каталог всей корзины, я полагаю, из-за разрешенного s3:ListBucket
разрешения. Но если я ограничу это только папкой, мое приложение для передачи уведомит меня, что в разрешении отказано.
Может ли кто-нибудь посоветовать мне, как правильно написать это разрешение?
Комментарии:
1. Как идентифицируются ваши «клиенты»? Есть ли у них настоящие учетные данные AWS или они проходят аутентификацию в приложении? Как правило, пользователи IAM должны создаваться только для ваших собственных сотрудников или надежных компаний. Если это сотрудники, то вы можете использовать: Элементы политики IAM: Переменные и теги — Управление идентификацией и доступом AWS
2. Поэтому прямо сейчас клиентам необходим программный доступ, так как они будут подключаться непосредственно к этой конкретной корзине S3
3. Да, но кто/что такое «клиенты»? Они что, сотрудники? Если нет, то, вероятно, лучше аутентифицировать их и предоставить доступ. Сколько здесь «клиентов»? У вас с ними прямые отношения или они просто используют веб-приложение? Вы должны быть осторожны, прежде чем предоставлять учетные данные пользователя IAM нештатным сотрудникам.
4. Итак, это компании, с которыми мы сотрудничаем — мы создали программный доступ с помощью политики для пользователей IAM и конкретной политики — есть ли более предпочтительный способ достичь того, что я пытаюсь здесь сделать?
Ответ №1:
Первый выбор-это способ отслеживания и аутентификации пользователей.
Вариант 1: Пользователи IAM
Обычно учетные данные пользователя IAM предоставляются сотрудникам и приложениям. Политики могут применяться непосредственно к пользователям IAM, чтобы предоставить им доступ к ресурсам.
В случае предоставления пользователям IAM доступа к определенным папкам в корзине Amazon S3 самым простым способом было бы поместить этих пользователей в группу IAM, а затем создать политику, использующую переменные политики IAM, которые могут автоматически вставлять имя пользователя IAM в политику:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::mybucket"],
"Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}}
},
{
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::mybucket/${aws:username}/*"]
}
]
}
В аккаунте AWS существует ограничение в 5000 пользователей IAM.
Вариант 2: Временные учетные данные
Вместо того чтобы предоставлять пользователям IAM «постоянные» учетные данные, Служба токенов безопасности AWS (STS) может выдавать временные учетные данные с назначенной политикой разрешений.
Поток, как правило, будет:
- Пользователи аутентифицируются в вашем приложении (например, используя вашу собственную базу данных пользователей, или федеративный доступ из Active Directory, или даже службу OpenID).
- Затем ваше серверное приложение генерирует временные учетные данные с соответствующими разрешениями (например, политика, указанная в ответе @jellcsc).
- Приложение предоставляет эти учетные данные пользователям (или их приложению).
- Пользователи используют эти учетные данные для доступа к разрешенным сервисам AWS
Срок действия учетных данных истекает через определенный промежуток времени, и пользователи должны повторно подключиться к вашему приложению, чтобы получить новый набор временных учетных данных.
Это более безопасно, поскольку приложение отвечает за обеспечение аутентификации и предоставление разрешений. Существует меньший риск случайного предоставления разрешений нескольким пользователям.
Вариант 3: Предварительно подписанные URL-адреса
Когда веб-приложение желает разрешить доступ к частным объектам в Amazon S3, оно может генерировать URL-адреса с предварительной подписью Amazon S3, которые являются URL-адресом с ограниченным временем, предоставляющим временный доступ к частному объекту. Это работает так:
- Пользователи проходят аутентификацию в веб-приложении
- Когда серверная часть отображает HTML-страницу и хочет включить ссылку на частный объект (например
<img src='...'>
, он генерирует предварительно подписанный URL-адрес, который предоставляет временный доступ к частному объекту - Когда браузер пользователя отправляет URL-адрес в S3, подпись проверяется и проверяется время истечения срока действия. Если это допустимо, то S3 возвращает объект.
Это часто встречается в таких приложениях, как системы обмена фотографиями, где пользователи могут захотеть поделиться фотографиями с другими пользователями, так что безопасность сложнее, чем просто просмотр каталога, в котором хранится изображение.
Нижняя линия
Если вы используете пользователей IAM, используйте вариант 1 и воспользуйтесь переменными политики IAM, чтобы написать одну политику, которая предоставит соответствующий доступ каждому пользователю. Однако внимательно подумайте, допустимо ли предоставление доступа пользователя IAM внешним пользователям в рамках вашей системы безопасности.
Комментарии:
1. спасибо, Джон, это было действительно полезно! В идеале я бы с удовольствием выбрал вариант 2, но у нас действительно нет возможностей создать что-то подобное прямо сейчас, я думаю, что вариант 1 кажется лучшим вариантом для доллара прямо сейчас
Ответ №2:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::my-bucket",
"Condition": {
"StringEquals": {
"s3:prefix": [
"client-1"
],
"s3:delimiter": [
"/"
]
}
}
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::my-bucket",
"Condition": {
"StringLike": {
"s3:prefix": [
"client-1/*"
]
}
}
},
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": "arn:aws:s3:::my-bucket/client-1/*"
}
]
}
Комментарии:
1. Спасибо — Я попробовал это с помощью приложения transmit, однако мне отказано в доступе, так как я не могу указать явный каталог в строке подключения — извините, я знаю, что это не строго связано с вопросом, но есть ли способ сделать это?