Учетные данные поставщика учетных данных AWS IoT не работают для S3 - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь использовать поставщик учетных данных для доступа к корзине aws S3 с моего устройства IoT.Я реализовал все шаги в этом посте: https://aws.amazon.com/blogs/security/how-to-eliminate-the-need-for-hardcoded-aws-credentials-in-devices-by-using-the-aws-iot-credentials-provider/;однако, когда я использую учетные данные, предоставленные службой для доступа к S3, я получаю «AmazonS3Exception: предоставленный вами идентификатор ключа доступа AWS не существует в наших записях».(Java SDK) Моя роль имеет следующую политику доступа:

{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Effect": "Allow",
           "Action": [
              "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::*/*"
       }
   ]
}

и это отношение ржавчины:

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": {
            "Service": "credentials.iot.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
      }
   ]
}

Здесь я использовал конечную точку поставщика учетных данных:

aws iot describe-endpoint --endpoint-type iot:CredentialProvider

Сертификат устройства и ключи работают нормально для доступа к брокеру сообщений MQTT.

edit системное время и время сервера различаются в течение 1 часа, поэтому токен выглядит так, как если бы он истеккогда я получу его (поле «срок действия» в токене совпадает с текущим системным временем).Это не должно иметь никакого значения, не так ли?Есть ли способ напрямую использовать роль вместо псевдонима для проверки этого предположения?

Вот так я получаю доступ к s3 в java:

    final AmazonS3 s3 = AmazonS3ClientBuilder.standard()
            .withCredentials(
                    new AWSStaticCredentialsProvider(
                            new BasicAWSCredentials(
                                    securityToken.getCredentials().getAccessKeyId(),
                                    securityToken.getCredentials().getSecretAccessKey()
                            )
                    )
            ).withRegion(Regions.US_EAST_1)
            .build();

    final ObjectMetadata object = s3.getObject(new GetObjectRequest(
            "iot-raspberry-test", "updateKioskJob.json"
    ), new File("/downloads/downloaded.json"));

Это политика, прикрепленная ксертификат моей вещи:

{
  "Version": "2012-10-17",
  "Statement": {
     "Effect": "Allow",
     "Action": "iot:AssumeRoleWithCertificate",
     "Resource": "arn:aws:iot:us-east-1:myaccountid:rolealias/s3-access-role-alias"
  }
}

Чего мне не хватать?Заранее спасибо!

1 Ответ

0 голосов
/ 19 марта 2019

Первая политика не завершена:

{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Effect": "Allow",
           "Action": [
              "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::*/*"
       }
   ]
}

Загрузите его в симулятор, и вы увидите, что он не будет работать. S3 нужен доступ к списку (не GetObject).

См. Следующий пример:

{
   "Version": "2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListBucket"
         ],
         "Resource":"arn:aws:s3:::bucket-name"
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetObject"
         ],
         "Resource":"arn:aws:s3:::bucket-name/*"
      }
   ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...