AWS IoT凭证提供程序凭证不适用于S3

时间:2019-03-18 21:04:28

标签: amazon-web-services amazon-s3

我正在尝试使用凭据提供程序从我的IoT设备访问aws S3存储桶。我实现了此博客文章中的所有步骤: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 Access Key ID在我们的记录中不存在”。 (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小时,因此令牌在我获得时看起来好像已过期(令牌中的“ expiration”字段与当前系统在同一时间)时间)。这应该没有任何区别吗?有没有一种方法可以直接使用角色而不是别名来测试此假设?

这是我在Java中访问s3的方式:

    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 :(得分:0)

第一个政策不完整:

{
   "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/*"
      }
   ]
}