我正在尝试使用凭据提供程序从我的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"
}
}
我可能会缺少什么? 预先感谢!
答案 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/*"
}
]
}