IAM 정책을 사용하여 특정 폴더에 대한 사용자별 액세스 권한을 부여하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 8월 20일

IAM 사용자 정책을 사용하여 Amazon S3 버킷 내 특정 폴더에 대한 액세스를 제한하려고 합니다.

간략한 설명

AWS Identity and Access Management(IAM) 사용자 정책을 사용하여 Amazon Simple Storage Service(Amazon S3) 버킷의 특정 폴더에 대한 액세스 권한을 가진 사용자를 제어할 수 있습니다.

해결 방법

단일 사용자 정책 - 이 예제 정책을 사용하면 특정 IAM 사용자가 버킷의 첫 번째 수준에서 특정 폴더를 확인한 다음, 원하는 폴더 및 하위 폴더의 객체에 대해 작업을 수행할 수 있습니다. 이 예제에서는 David라는 IAM 사용자와 다음의 구조를 지닌 my-company라는 버킷을 사용합니다.

/home/Adele/ /home/Bob/ /home/David/ /restricted/ /root-file.txt

{
 "Version":"2012-10-17",
 "Statement": [
   {
     "Sid": "AllowUserToSeeBucketListInTheConsole",
     "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::*"]
   },
  {
     "Sid": "AllowRootAndHomeListingOfCompanyBucket",
     "Action": ["s3:ListBucket"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::my-company"],
     "Condition":{"StringEquals":{"s3:prefix":["","home/"],"s3:delimiter":["/"]}}
    },
   {
     "Sid": "AllowListingOfUserFolder",
     "Action": ["s3:ListBucket"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::my-company"],
     "Condition":{"StringLike":{"s3:prefix":["home/David/*"]}}
   },
   {
     "Sid": "AllowAllS3ActionsInUserFolder",
     "Effect": "Allow",
     "Action": ["s3:*"],
     "Resource": ["arn:aws:s3:::my-company/home/David/*"]
   }
 ]
}

Amazon S3 콘솔은 특수 문자로 슬래시(/)를 사용하여 폴더의 객체를 나타냅니다. 접두사(s3:prefix)와 구분 기호 (s3:delimiter)는 폴더의 객체를 구성하고 찾아볼 때 유용합니다.

다중 사용자 정책 - 일부 경우, 정책을 작성할 때 리소스의 정확한 이름을 알지 못할 수도 있습니다. 예를 들어, 이전 예제처럼 모든 사용자가 Amazon S3 버킷에 자체 객체를 가지도록 할 수 있습니다. 그러나 각 사용자에 대해 리소스의 일부로 사용자 이름을 지정하는 별도의 정책을 만드는 대신, 해당 그룹의 모든 사용자에 대해 작동하는 단일 그룹 정책을 만들 수 있습니다.

정책 변수를 사용하여 이 작업을 수행하면, 정책에서 자리 표시자를 지정할 수 있습니다. 정책이 평가될 때 정책 변수는 요청 자체에서 발생하는 값으로 대체됩니다.

이 예제는 정책 변수 ${aws:username}을 사용하는 Amazon S3 버킷에 대한 정책을 보여줍니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowUserToSeeBucketListInTheConsole",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Sid": "AllowRootAndHomeListingOfCompanyBucket",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::my-company"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:prefix": [
                        "",
                        "home/"
                    ],
                    "s3:delimiter": [
                        "/"
                    ]
                }
            }
        },
        {
            "Sid": "AllowListingOfUserFolder",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::my-company"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "home/${aws:username}/*"
                    ]
                }
            }
        },
        {
            "Sid": "AllowAllS3ActionsInUserFolder",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::my-company/home/${aws:username}/*"
            ]
        }
    ]
}

참고: StringLike만 별표(*)를 와일드카드로 인식합니다. StringEquals는 해당되지 않습니다. 자세한 내용은 문자열 조건 연산자를 참조하십시오.  


이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?