是否可以从AWS IAM用户、.NET API获取规范用户id

本文关键字:用户 获取 范用户 id API NET AWS IAM 是否 | 更新日期: 2023-09-27 18:30:01

我已经成功创建了一个用户、凭据和一个bucket
现在我需要向这个用户授予bucket访问权限。

有什么方法可以从代码中获得这个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]" 
        }
    );
}

是否可以从AWS IAM用户、.NET API获取规范用户id

您可以使用ListAllMyBuckets API调用[1]轻松获取CanonicalUser ID(s3:ListAllMyBarets权限是必需的):

$ 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/AmazonS3/latest/API/RESTServiceGET.html
  2. https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/MS3ListBuckets.html
  3. https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html#getS3AccountOwner--

不,不可能从代码中获取规范用户id-由于管理S3资源访问权限的方式不同,您遇到了一个有点奇怪且可能是遗留问题,请参阅AWS团队对如何查找IAM用户的规范id的回应:

您不能将IAM用户作为受让人添加到ACL。我将更新文档以澄清ACL不支持IAM用户。有一些解决方案,你可以使用授予此用户访问您的亚马逊S3内容:〔…〕

您可能确实需要重新考虑使用更通用的S3存储桶策略(见下文)-但是,如果您可以访问帐户的根凭据,您可能会找到与您的AWS帐户关联的规范用户ID,如在策略中指定主体所述(请注意,这不适用于IAM用户凭据):

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

我要再次强调,AWS强烈建议现在只使用IAM用户,例如,请参阅根帐户凭据与IAM用户凭据:

因为您无法控制根帐户的权限凭据,您应该将它们存储在安全的地方,而不是使用AWS用于日常工作的身份和访问管理(IAM)用户凭据与AWS的交互。

S3的规范用户id要求是一个罕见的例外,正如我所说,由于S3的ACL层早于IAM,因此可能被视为遗留工件,因此最好尽可能避免。