#amazon-web-services #amazon-dynamodb #amazon-iam
#amazon-web-services #amazon-dynamodb #amazon-iam
Вопрос:
В настоящее время я экспериментирую с Amazon DynamoDB, чтобы создать полноценное приложение JavaScript непосредственно в браузере, используя AWS SDK для JavaScript в браузере. Но я не могу обеспечить безопасный доступ к DynamoDB.
В IAM
я создал группу с именем Users
с этой политикой :
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"dynamodb:BatchGetItem",
"dynamodb:BatchWriteItem",
"dynamodb:DeleteItem",
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:Query",
"dynamodb:UpdateItem"
],
"Resource": ["arn:aws:dynamodb:eu-west-1:1234567891234:table/*"],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": ["${aws:username}"]}
}
}]
}
У меня есть имя пользователя Bahaika
, который принадлежит к Users
группе.
В DynamoDB я создал два элемента :
-------------------------
| Dog ID | User Id |
-------------------------
| Dog1 | Bahaika |
-------------------------
| Dog2 | NotBahaika |
-------------------------
Я хотел бы иметь возможность получать только Dog1, но не Dog2, когда я регистрируюсь с Access Key ID
помощью and Secret Access Key
из Bahaika.
Я также хочу автоматически добавлять User ID
атрибуты при добавлении элемента в таблицу. И, наконец, я хочу иметь возможность перечислять все элементы таблиц, где User ID
равно зарегистрированному.
Как мне это сделать?
Я уже читал Детальный контроль доступа для DynamoDB, но, кажется, я что-то пропустил.
Комментарии:
1. Что конкретно не работает, вы видите оба или нет dog при входе в систему как Bahaika (звучит как первое, но для уточнения)?
2. У меня есть
AccessDenied
для обеих собак. Когда я отключаю политику, я могу получить доступ ко всем dogs.
Ответ №1:
В вашем условии IAM dynamodb:LeadingKeys
используется обычная переменная политики IAM ${aws:username}
, которая отсутствует при использовании федерации веб-удостоверений, см. Таблицу в разделе Информация о запросе, которую можно использовать для переменных политики. Вместо этого вам нужно будет использовать ${www.amazon.com:user_id}
, как указано в разделе Мелкозернистый контроль доступа для DynamoDB, а также различные примеры политик для мелкозернистого контроля доступа.
Комментарии:
1. Использую ли я федерацию веб-удостоверений при жестком кодировании идентификатора ключа доступа и секретного ключа доступа? Я не совсем понимаю роль
dynamodb:LeadingKeys
. И как я могу узнать, какой идентификатор пользователя у пользователя в консоли IAM?2. Ах, нет, я упустил из виду этот аспект и просто пришел к выводу, что это единственный безопасный подход к использованию AWS SDK для JavaScript в браузере для любых операций чтения, извините. Вы уверены, что хотите получить доступ к таблице только для чтения и, следовательно, можете подвергнуть риску жестко запрограммированные учетные данные AWS в вашем приложении JavaScript?
3. Возможно, я что-то пропустил в отношении безопасности: вот как я представлял себе систему: сначала пользователь заходит на мой сайт, мой сайт возвращает ему AKID и SAK (для его учетной записи), и он использует их для безопасного подключения к dynamodb (с операциями чтения / записи). Является ли этот подход неправильным?
4. Это небезопасно из-за того, что приложения на JavaScript в браузере подвержены всевозможным атакам — объяснение этого здесь выходит за рамки, но см. Раздел Загрузка учетных данных в браузере клиента в разделе Настройка SDK в браузере для получения авторизационного заявления от AWS, подтверждающего, что жесткое кодирование безопасно, только если вы ограничиваетеваше приложение для учетных данных только для чтения. И даже тогда эти учетные данные могут быть захвачены другими пользователями для чтения информации, к которой у них не должно быть доступа.
5. Итак, независимо от того, какой подход я использую, JavaScript на стороне клиента небезопасен? Должен ли я отказаться от подхода «веб-сервиса» для обеспечения безопасности? «Вход в систему с помощью Amazon» заставит моих пользователей иметь учетную запись Amazon? Или это будут только учетные записи в моей консоли IAM? Потому что я хочу обрабатывать учетные записи для платежей и т. Д…
Ответ №2:
Если вы можете аутентифицировать своего пользователя, используя его учетные данные Amazon, Facebook или Google, тогда вы можете использовать федерацию веб-идентификации, которая (проще говоря) обменяет токен от одного из этих 3 поставщиков на временные учетные данные AWS security, которые ваше приложение может использовать для доступа к DynamoDB. В документации AWS есть несколько статей, которые стоит прочитать по этой теме.
http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/browser-configuring-wif.html
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WIF.html