Универсальная политика AWS IoT и политики пользователя Cognito

Мне было интересно, знает ли кто-нибудь о лучших практиках AWS IoT в отношении обработки политик, например, у нас могут быть два разных случая:

Случай 1. Вызов лямбда-выражения (идентификатор-идентификатор в качестве параметра), который создает политику на лету, а затем присоединяет политику к идентификатору идентификатора. Политика будет содержать жестко запрограммированные имена вещей, например:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:Connect",
      "Resource": "arn:aws:iot:us-west-2:XXXX:client/hardcodedClient1"
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish",
        "iot:Subscribe",
        "iot:Receive"
      ],
      "Resource": [
        "arn:aws:iot:us-west-2:XXXX:topic/$aws/things/THINGNAME1/*",
        "arn:aws:iot:us-west-2:XXXX:topicfilter/$aws/things/THINGNAME1/*"
      ]
    }
  ]
}

Случай 2: используя переменные политики, такие как ${iot:ClientId}, ${iot:ThingName}, мы можем прикрепить одну единственную политику ко всем пользователям congito-identity;

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:Connect",
      "Resource": "arn:aws:iot:us-west-2:XXXX:client/${iot:ClientId}"
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish",
        "iot:Subscribe",
        "iot:Receive"
      ],
      "Resource": [
        "arn:aws:iot:us-west-2:XXXX:topic/$aws/things/${iot:Connection.Thing.ThingName}/*",
        "arn:aws:iot:us-west-2:XXXX:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/*"
      ]
    }
  ]
}

Итак, вопрос такой. Какой из этих методов является наилучшим, но оба они безопасны в отношении того, что пользователь Cognito может взаимодействовать только со своими собственными устройствами?


person jamesjara    schedule 18.09.2017    source источник
comment
Вы, может быть, ответили на некоторые из своих вопросов?   -  person Daniel Birowsky Popeski    schedule 25.11.2017


Ответы (2)


Вариант 2 с использованием переменных политики - рекомендуемый путь.

Это сокращает количество политик, с которыми нужно работать, и сохраняет их значимость и возможность многократного использования. С другой стороны, это сэкономит дополнительные деньги и время, поскольку не будет использовать лямбду и каждый раз создавать политику!

Что касается безопасности, это не имеет ничего общего с переменными политики в политике, это в конечном итоге то, что политика действий разрешает или запрещает, поскольку переменные политики разрешаются на лету, в зависимости от того, кто пытается выполнить операцию, и что после этого в качестве жестко запрограммированной политики.

person gitesh.tyagi    schedule 22.09.2017
comment
Но # case2 позволит любому пользователю подключиться к любой вещи в iot-реестре, верно? - person jamesjara; 07.06.2018
comment
Да, и вы можете контролировать это, используя условие типа bool, позволяющее принципалу действовать только как те вещи, к которым он прикреплен. И вы можете прикрепить принципала и вещь, используя API присоединения предмета-принципала - person gitesh.tyagi; 07.06.2018

Случай 2 лучше. Вы также можете реализовать механизм аутентификации с помощью Cognito Federated Pool с соответствующей политикой IAM и использовать переменную ${cognito-identity.amazonaws.com:sub} в своей политике IoT с соответствующими разрешениями (просто не забудьте прикрепить эту политику к вашему Cognito identityId).

Если ваши клиенты подключаются из браузера, лучше не использовать iot:ClientId, поскольку clientId должен быть уникальным, чтобы пользователь не мог открывать несколько вкладок браузера.

person Maciej Dzikowicki    schedule 07.12.2018