Как я могу использовать политики IAM для получения детального контроля доступа к DynamoDB?

#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