2017-07-06 13 views
1

すべてのオブジェクトACLをバケット内でループして、それらのすべてから「Everyone」権限を削除します。ここでのアイデアは、現在のすべての権限を保持することです。aws s3オブジェクトACLから.NET APIを使用して「Everyone」を削除

私の問題は、PutACL呼び出しが機能しないことです。以下の例では、新しいAccessControlListが作成され、「everyone」エントリは省略されています。 PutACL呼び出しは正常に戻りますが、オブジェクトのACLは変更されません。

おそらく、特定の補助金を特定して削除する簡単な方法があります。

AmazonS3Client s3 = new AmazonS3Client(); 
GetACLRequest aclRequest = new GetACLRequest() { BucketName = "my-bucket", Key = "/dir/protect_me.txt" }; 
var aclResponse = s3.GetACL(aclRequest); 

bool foundEveryonePriv = false; //if found at least one. 

S3AccessControlList newAcl = new S3AccessControlList(); 
foreach (var grant in aclResponse.AccessControlList.Grants) 
{ 
    bool grantToEveryone = string.Compare(grant.Grantee.URI, "http://acs.amazonaws.com/groups/global/AllUsers") == 0; 
    Logger.log.InfoFormat("{0},{1},{2},{3}", aclRequest.BucketName, o.Key, grant.Permission, (everyoneHasThisPriv ? "EVERYONE" : string.Empty)); 

    if (grantToEveryone) 
    { 
     foundEveryonePriv = true; 
     newAcl.AddGrant(grant.Grantee, grant.Permission); 
    } 
} 

//modify the items if necessary and requested. 
if (foundEveryonePriv) 
{ 
    newAcl.Owner = aclResponse.AccessControlList.Owner; 
    var response = s3.PutACL(new PutACLRequest() { AccessControlList = newAcl, BucketName = aclRequest.BucketName, Key = o.Key }); 
} 

答えて

0

パブリックグラントを削除するために、既存のACLをGETから変更してみてください。その後、変更されたACLをPUT要求に戻します。ここで私がやったことは元の助成金を保持し、与えられたオブジェクトから公共の助成金を取り除くためにうまくいきます。

private void RemovePublicAcl(AmazonS3Client client, string bucket, string key) 
    { 
     var aclRequest = new GetACLRequest { BucketName = bucket, Key = key }; 
     var aclResponse = client.GetACL(aclRequest); 
     var acl = aclResponse.AccessControlList; 

     const string PUBLIC_GRANTEE = "http://acs.amazonaws.com/groups/global/AllUsers"; 

     if (acl.Grants.Any(x => 
      !string.IsNullOrWhiteSpace(x.Grantee.URI) && 
      x.Grantee.URI.Equals(PUBLIC_GRANTEE))) 
     { 
      var publicGrant = new S3Grantee(); 
      publicGrant.URI = PUBLIC_GRANTEE; 
      acl.Grants.RemoveAll(x => 
       !string.IsNullOrWhiteSpace(x.Grantee.URI) && 
       x.Grantee.URI.Equals(PUBLIC_GRANTEE)); 

      var aclUpdate = new PutACLRequest(); 
      aclUpdate.BucketName = bucket; 
      aclUpdate.Key = key; 
      aclUpdate.AccessControlList = acl; 

      var response = client.PutACL(aclUpdate); 
     } 
関連する問題