2014-09-29 2 views
5

내가 원하는 것을 얻기 위해 버킷 정책을 설정하는 법을 배울 수 없습니다. 어떤 도움을 많이 주시면 감사하겠습니다! 내 계정객체 acl이 public 일 때 S3 버킷 정책을 (대부분) 비공개로 설정하는 방법은 무엇입니까?

  • 사용자가 사용자 정책을 통해 액세스 할 수 있으므로 제외하고 액세스 할 수 있어야하지 않는다 특히 그들
  • 익명 사용자 (또는 내 AWS 계정 외부 사람)에 부여 된 액세스를 필요가 없습니다 : 내 원하는 규칙은 :
  • 하나의 폴더/temp_public에 공용 GetObject가 있어야합니다 (예 : 파일을 얻을 수있는 URL을 알고있는 경우)
  • 이러한 정책은 객체 ACL이 설정되기 때문에 버킷에있는 파일의 객체 ACL을 무시해야합니다. 공개 읽기.

버킷 정책을 만드는 이유는 버킷에있는 객체의 대부분이 공공는 ACL을 읽고 그 (실수로 파일이 업로드되었을 때 설정,하지만 난 개체의 ACL을 재정의 할 수 있도록 미래에 일어날 수있다 버킷 ACL 포함). temp_public 폴더를 무시

은, 난 그냥이 할 수있는 희망 :

{ 
    "Version": "2008-10-17", 
    "Id": "Policy123456789", 
    "Statement": [ 
     { 
      "Sid": "Stmt1", 
      "Effect": "Deny", 
      "NotPrincipal": { 
       "AWS": "arn:aws:iam::123456789012:root" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::my-bucket-name/*" 
     } 
    ] 
} 

(123456789012 내 AWS 계정 번호),하지만 난 그 버킷 정책에 모든 사용자에 대해 거부 액세스 할 수 있습니다. 이 경우 NotPrincipal이 작동하지 않는 것 같군요?

의견을 보내 주셔서 감사합니다.

로리

UPDATE : 크로스 게시 AWS 포럼에 here을하고 대답! 제가 확인했습니다 this answer에 대한 AWS 포럼에서 IP에

답변

9

많은 감사, 나를 위해 노력하고 있습니다 :

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::BucketName/temp_public/*" 
     } 
    ] 
} 

이 문은 사람이 temp_public 폴더 내의 개체, 해당 파일에 관계없이 ACL을 읽기 액세스를 제공 할 것입니다. 다른 모든 파일의 공용 액세스를 무시하려면 + Deny + -type 문을 제공해야합니다. 명시 적 거부는 허용 액세스를 무시하므로 이미 주어진 사용 권한을 제외해야합니다. 그래서 제외 마스크로 (FINAL하지 않음 아직, 아래를 참조) NotResource를 사용

{ 
    "Effect": "Deny", 
    "Principal": "*", 
    "Action": "s3:GetObject", 
    "NotResource": "arn:aws:s3:::BucketName/temp_public/*" 
} 

그러나,이 너무 귀하의 계정을 포함하여 모든 사용자에 대한 액세스를 거부합니다, 교장이 "*"로 설정되어 있기 때문이다. 이 (STILL 최종 NOT) 거부에서 따라서, 당신은 당신의 계정을 제외해야합니다 :

{ 
    "Effect": "Deny", 
    "NotPrincipal": { "AWS": "arn:aws:iam::XXXXYYYYZZZZ:root" }, 
    "Action": "s3:GetObject", 
    "NotResource": "arn:aws:s3:::BucketName/temp_public/*" 
} 

여전히 문제가있다 (XXXXYYYYZZZZ는 12 자리 AWS 계정 ID입니다) : 문은 위의 모든 액세스를 거부는 IAM 사용자 (루트 계정 제외). 모든 IAM 사용자를 제외하고 싶지만 이는 까다 롭습니다. 몇 가지 이유로 Amazon S3는 버킷 정책에서 IAM 사용자를 지정하기위한 와일드 카드를 지원하지 않습니다. 교장으로 "arn:aws:iam::XXXXYYYYZZZZ:user/*"을 쓸 수 없습니다 ("Policy in Invalid principal"오류가 발생합니다).로리에서

{ 
    "Effect": "Deny", 
    "NotPrincipal": { 
     "AWS": [ 
          "arn:aws:iam::XXXXYYYYZZZZ:root", 
          "arn:aws:iam::XXXXYYYYZZZZ:user/user1", 
          "arn:aws:iam::XXXXYYYYZZZZ:user/user2", 
          "arn:aws:iam::XXXXYYYYZZZZ:user/user3", 
          "arn:aws:iam::XXXXYYYYZZZZ:user/user4" ] 
    } 
    "Action": "s3:GetObject", 
    "NotResource": "arn:aws:s3:::BucketName/temp_public/*" 
} 

NB : 당신은 정확한 사용자 이름을 지정해야하는 S3의 문서가 당신이 계정에있는 모든 사용자를 충당하기 위해 arn:aws:iam::XXXXYYYYZZZZ:root을 사용할 수 있습니다 제안,하지만 그건 그냥 작동하지 않는 것

최종 정책은 다음과 같습니다.

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::BucketName/temp_public/*" 
     }, 
     { 
      "Effect": "Deny", 
      "NotPrincipal": { 
       "AWS": [ 
            "arn:aws:iam::XXXXYYYYZZZZ:root", 
            "arn:aws:iam::XXXXYYYYZZZZ:user/user1", 
            "arn:aws:iam::XXXXYYYYZZZZ:user/user2", 
            "arn:aws:iam::XXXXYYYYZZZZ:user/user3", 
            "arn:aws:iam::XXXXYYYYZZZZ:user/user4" ] 
      } 
      "Action": "s3:GetObject", 
      "NotResource": "arn:aws:s3:::BucketName/temp_public/*" 
     } 
    ] 
} 
관련 문제