【发布时间】:2016-08-22 17:24:38
【问题描述】:
我正在尝试使我们的应用程序能够将文件上传到特定的 S3 存储桶。这个想法是锁定它,这样如果该应用程序的访问权限和密钥被泄露,恶意用户除了上传新文件之外无法做任何事情。
为了做到这一点,我创建了一个新的 IAM 策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::app-dev-raw-uploads"
]
}
]
}
接下来我保存了策略并进入策略模拟器,并针对arn:aws:s3:::app-dev-raw-uploads s3 存储桶测试了 S3 PutObject 操作,模拟器给了我一个允许/成功的结果。
然后我创建了一个新的 IAM 用户并将该策略附加到该用户并保存。然后,我为该用户生成了一个访问密钥和秘密密钥,并将其插入我的应用程序。然后我的应用程序尝试使用以下代码进行上传:
private static async Task PerformUpload(IIngestControllerSettings settings, string destinationPath, string sourcePath, CancellationToken cancellationToken)
{
var credentials = new BasicAWSCredentials(settings.AwsAccessKey, settings.AwsSecretKey);
var region = RegionEndpoint.GetBySystemName(settings.AwsRegionName);
var client = new AmazonS3Client(credentials, region);
var fileTransferUtility = new TransferUtility(client);
await fileTransferUtility.UploadAsync(sourcePath, settings.ArchivalStorageServiceContainerName, destinationPath, cancellationToken);
}
当我使用我的(临时)个人 AWS 密钥时,此代码运行良好,但在此用户的访问/秘密密钥下我得到:
Amazon.S3.AmazonS3Exception: Access Denied ---> Amazon.Runtime.Internal.HttpErrorResponseException: 远程服务器返回错误:(403) Forbidden。 ---> System.Net.WebException:远程服务器返回错误:(403) Forbidden。
知道我做错了什么吗?
编辑: 由于我能够使用这些密钥凭证通过 AWS CLI 上传文件,因此 AWS SDK TransferUtility 类似乎需要比 PutObject 更多的权限才能上传文件,但我找不到任何关于这些文件的参考。
【问题讨论】:
-
您是否尝试使用新的用户凭证并从 AWS CLI 而不是 SDK 执行将对象放入 s3 存储桶并检查用户是否能够将新对象添加到 s3 存储桶?
-
使用 AWS CLI 工具,我可以通过
aws cp c:\temp\test.ts s3://app-dev-raw-uploads/成功上传带有此密钥的文件
标签: c# amazon-web-services amazon-s3