从.NET API获取AWS IAM用户的规范用户ID是否可行?

6

我已成功创建了一个用户、凭证和一个存储桶。
现在我需要授予此用户对存储桶的访问权限。

有没有办法从代码中获取这个CanonicalUser的值?
IAM用户对象只提供ARN、Path、UserId和UserName的值,但这些值都不能用于授权。

using (var s3 = new Amazon.S3.AmazonS3Client("[user_key]", "[secret_user_key]", RegionEndpoint.GetBySystemName("eu-west-1")))
{
    var response = s3.GetACL("[bucket_id]");
    var acl = response.AccessControlList;
    acl.AddGrant(
        new S3Grantee() { 
            CanonicalUser = **???** 
        }, 
        new S3Permission(S3Permission.FULL_CONTROL)
    );
    s3.PutACL(
        new PutACLRequest() { 
            AccessControlList = acl, 
            BucketName = "[bucket_id]" 
        }
    );
}

我最终将策略放在了IAM用户上。 该策略文件指定了用户对存储桶的访问权限。 (http://docs.aws.amazon.com/IAM/latest/UserGuide/PolicyVariables.html) - KTW
2个回答

5
您可以使用ListAllMyBuckets API调用[1](需要s3:ListAllMyBuckets权限)轻松获取CanonicalUser ID:
$ aws s3api list-buckets --query Owner
{
    "DisplayName": "lord-vader",
    "ID": "f420064cb076f772e10584fc40ab777c09f6b7d154342cf358f1bd1e573c9cf7"
}

在AWS SDK for .NET中,可以使用以下类似的代码[2]:
AmazonS3Client client = new AmazonS3Client();
ListBucketsResponse response = client.ListBuckets();
Console.WriteLine("Canonical user ID - {0}", response.Owner.Id);

在AWSJavaSDK中,您可以使用AmazonS3.getS3AccountOwner包装器方法[3]。

  1. https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/RESTServiceGET.html
  2. https://docs.aws.amazon.com/zh_cn/sdk-for-net/v3/apidocs/items/S3/MS3ListBuckets.html
  3. https://docs.aws.amazon.com/zh_cn/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html#getS3AccountOwner--

4
不,无法从代码中获取规范用户ID - 由于不同的方式来管理S3资源的访问权限,您已经遇到了一个有点奇怪且可能是遗留的方面,请参见AWS团队对如何查找IAM用户的规范ID?的回复:

您无法将IAM用户添加为ACL的受让方。我将更新文档以澄清不支持在ACL中使用IAM用户。您可以使用一些解决方案来授予此用户访问Amazon S3内容的权限:[...]

您确实可能想要重新考虑使用更为灵活的S3存储桶策略(见下文) - 然而,如果您可以访问该帐户的根凭据,您可以按照在策略中指定主体中所述的步骤查找与您的AWS帐户关联的规范用户ID(请注意,这不适用于IAM用户凭据):

  1. 转到http://aws.amazon.com,从我的账户/控制台下拉菜单中选择安全凭据
  2. 使用适当的帐户凭据登录。
  3. 单击帐户标识符

我再次强调,AWS目前强烈建议仅使用IAM用户,例如请参阅根帐户凭据 vs. IAM用户凭据

由于您无法控制根帐户凭据的特权,因此应将其存储在安全的位置,并改用AWS身份验证和访问管理(IAM)用户凭据来与AWS进行日常交互。
对于S3的这个规范用户ID要求是一个罕见的例外情况,正如我所说,由于S3的ACL层先于IAM而存在,因此最好避免使用,如果可能的话。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接