ACL용 정책 예제

ACL용 정책 예제

버킷 정책에서 조건 키(condition key)를 사용해 Amazon S3에 대한 접근을 제어할 수 있어요.

출처: 문서

본문

Topics (주제)

  • 버킷 소유자가 전체 제어 권한을 얻어야 한다는 조건으로 s3:PutObject 권한 부여
  • x-amz-acl 헤더 조건으로 s3:PutObject 권한 부여

버킷 소유자가 전체 제어 권한을 얻어야 한다는 조건으로 s3:PutObject 권한 부여

PUT Object 작업은 ACL 기반 권한을 부여하는 데 사용할 수 있는 ACL 관련 헤더를 허용해요. 이 키들을 사용하면 버킷 소유자가 사용자가 객체를 업로드할 때 특정 접근 권한을 요구하는 조건을 설정할 수 있어요.

Account A가 버킷을 소유하고 있고, 계정 관리자가 Account B의 사용자인 Dave에게 객체 업로드 권한을 부여하려 한다고 가정해 보세요. 기본적으로 Dave가 업로드한 객체는 Account B가 소유하며 Account A는 이 객체들에 대한 권한이 없어요. 버킷 소유자가 비용을 지불하므로 Dave가 업로드한 객체에 대한 전체 권한을 원해요. Account A 관리자는 조건을 사용해 Dave에게 s3:PutObject 권한을 부여하면 되는데, 그 조건은 요청에 전체 권한을 명시적으로 부여하거나 canned ACL을 사용하는 ACL 관련 헤더를 포함해야 한다는 것이에요. 자세한 내용은 PUT Object를 참고하세요.

x-amz-full-control 헤더 요구하기

버킷 소유자에게 전체 제어 권한을 주는 x-amz-full-control 헤더를 요청에 포함하도록 요구할 수 있어요. 다음 버킷 정책은 s3:x-amz-grant-full-control 조건 키를 사용하는 조건으로 사용자 Dave에게 s3:PutObject 권한을 부여하는데, 이 조건은 요청에 x-amz-full-control 헤더가 포함되어야 한다는 걸 요구해요.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "statement1",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/Dave"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::awsexamplebucket1/*",
      "Condition": {
        "StringEquals": {
          "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID"
        }
      }
    }
  ]
}

참고

이 예제는 크로스 계정 권한에 관한 것이에요. 하지만 권한을 받는 Dave가 버킷을 소유한 AWS 계정에 속한다면 이 조건부 권한은 필요하지 않아요. Dave가 속한 상위 계정이 사용자가 업로드한 객체를 소유하기 때문이에요.

명시적 거부 추가

앞의 버킷 정책은 Account B의 사용자 Dave에게 조건부 권한을 부여해요. 이 정책이 적용되는 동안 Dave는 다른 정책을 통해 어떤 조건 없이도 같은 권한을 얻을 수 있어요. 예를 들어 Dave가 그룹에 속해 있고, 그 그룹에 조건 없이 s3:PutObject 권한을 부여했다면요. 이런 권한 허점을 피하려면 명시적 거부를 추가해 더 엄격한 접근 정책을 작성할 수 있어요. 이 예제에서는 Dave가 버킷 소유자에게 전체 권한을 부여하는 필수 헤더를 요청에 포함하지 않으면 업로드 권한을 명시적으로 거부해요. 명시적 거부는 항상 부여된 다른 권한보다 우선해요. 다음은 명시적 거부를 추가한 수정된 접근 정책 예제예요.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "statement1",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/AccountBadmin"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::awsexamplebucket1/*",
      "Condition": {
        "StringEquals": {
          "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID"
        }
      }
    },
    {
      "Sid": "statement2",
      "Effect": "Deny",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/AccountBadmin"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::awsexamplebucket1/*",
      "Condition": {
        "StringNotEquals": {
          "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID"
        }
      }
    }
  ]
}

AWS CLI로 정책 테스트하기

두 개의 AWS 계정이 있다면 AWS Command Line Interface(AWS CLI)를 사용해 정책을 테스트할 수 있어요. 정책을 연결하고 Dave의 자격 증명으로 다음 AWS CLI put-object 명령을 사용해 권한을 테스트해요. --profile 매개 변수를 추가해 Dave의 자격 증명을 제공하고, --grant-full-control 매개 변수를 추가해 버킷 소유자에게 전체 제어 권한을 부여해요. AWS CLI 설치 및 사용에 대한 자세한 내용은 Amazon S3 API Reference의 AWS CLI로 Amazon S3 개발을 참고하세요.

aws s3api put-object --bucket examplebucket --key HappyFace.jpg --body c:\HappyFace.jpg --grant-full-control id="AccountA-CanonicalUserID" --profile AccountBUserProfile

x-amz-acl 헤더 요구하기

버킷 소유자에게 전체 제어 권한을 부여하는 canned ACL과 함께 x-amz-acl 헤더를 요구할 수 있어요. 요청에 x-amz-acl 헤더를 요구하려면 다음 예제에서처럼 Condition 블록의 키-값 쌍을 바꾸고 s3:x-amz-acl 조건 키를 지정하면 돼요.

"Condition": {
  "StringEquals": {
    "s3:x-amz-acl": "bucket-owner-full-control"
  }
}

AWS CLI로 권한을 테스트하려면 --acl 매개 변수를 지정하면 돼요. 그러면 AWS CLI가 요청을 보낼 때 x-amz-acl 헤더를 추가해요.

aws s3api put-object --bucket examplebucket --key HappyFace.jpg --body c:\HappyFace.jpg --acl "bucket-owner-full-control" --profile AccountBadmin

x-amz-acl 헤더 조건으로 s3:PutObject 권한 부여

다음 버킷 정책은 요청에 x-amz-acl 헤더가 포함되어 객체를 공개적으로 읽을 수 있게 만들면 두 AWS 계정에 s3:PutObject 권한을 부여해요. Condition 블록은 StringEquals 조건을 사용하고, 평가를 위해 "s3:x-amz-acl":["public-read"] 키-값 쌍을 제공해요. 이 키-값 쌍에서 s3:x-amz-acl은 s3: 접두사로 표시된 Amazon S3 전용 키예요.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AddCannedAcl",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:root",
          "arn:aws:iam::111122223333:root"
        ]
      },
      "Action": "s3:PutObject",
      "Resource": [
        "arn:aws:s3:::awsexamplebucket1/*"
      ],
      "Condition": {
        "StringEquals": {
          "s3:x-amz-acl": [
            "public-read"
          ]
        }
      }
    }
  ]
}

중요

모든 조건이 모든 작업에 의미가 있는 것은 아니에요. 예를 들어 s3:CreateBucket Amazon S3 권한을 부여하는 정책에 s3:LocationConstraint 조건을 포함하는 것은 의미가 있지만, s3:GetObject 권한을 부여하는 정책에 이 조건을 포함하는 것은 의미가 없어요. Amazon S3는 Amazon S3 전용 조건과 관련된 이 유형의 의미론적 오류를 테스트할 수 있어요. 하지만 IAM 사용자나 역할에 대한 정책을 만들 때 의미론적으로 유효하지 않은 Amazon S3 조건을 포함하면 오류가 보고되지 않아요. IAM은 Amazon S3 조건을 검증할 수 없기 때문이에요.

더 알아보기 (Learn more)