Amazon Simple Storage Service
개발자 안내서 (API 버전 2006-03-01)

연습: 사용자 정책을 사용하여 버킷에 대한 액세스 제어

본 연습에서는 Amazon S3에서 사용자 권한이 어떻게 사용되는지를 설명합니다. 이 예제에서는 폴더가 있는 버킷을 만듭니다. 그런 다음 AWS 계정에서 AWS Identity and Access Management(IAM) 사용자를 만들고 이 사용자에게 Amazon S3 버킷과 이 버킷 안에 있는 폴더에 대한 증분 권한을 부여합니다.

버킷 및 폴더 기본 사항

Amazon S3 데이터 모델은 플랫 구조입니다. 버킷을 만들면 이 버킷에 객체가 저장됩니다. 하위 버킷 또는 하위 폴더의 계층 구조는 없지만, 폴더 계층 구조를 에뮬레이션할 수 있습니다. Amazon S3 콘솔과 같은 도구는 다음 이미지와 같이 버킷의 이러한 논리적 폴더 및 하위 폴더의 보기를 제공할 수 있습니다.


                버킷, 폴더 및 객체의 계층 구조를 보여 주는 콘솔 스크린샷.

콘솔에는 companybucket이라는 버킷에 세 개의 폴더 Private, DevelopmentFinance와 하나의 객체 s3-dg.pdf가 있다는 것이 표시됩니다. 콘솔에서는 객체 이름(키)을 사용하여 폴더 및 하위 폴더로 이루어진 논리적 계층 구조를 만듭니다. 다음 예제를 고려하십시오.

  • Development 폴더를 만들면 콘솔에서 Development/라는 키를 사용하여 객체가 생성됩니다. 후행 슬래시(/ 구분 기호에 주의합니다.

  • Projects1.xls라는 객체를 Development 폴더에 업로드하면 콘솔에서 객체가 업로드되고 객체에 키 Development/Projects1.xls가 제공됩니다.

    이 키에서 Development는 접두사이고 /는 구분 기호입니다. Amazon S3 API 작업에서는 접두사와 구분 기호가 지원됩니다. 예를 들어, 특정 접두사와 구분 기호를 사용하여 버킷에서 모든 객체의 목록을 가져올 수 있습니다. 콘솔에서 Development 폴더를 열면 콘솔에 해당 폴더 안에 있는 객체가 나열됩니다. 다음 예제에서는 Development 폴더에 객체 하나가 포함되어 있습니다.

     

    
                        버킷, 폴더 및 객체의 계층 구조를 보여 주는 콘솔 스크린샷.

     

    콘솔에 companybucket 버킷의 Development 폴더가 나열되면 Amazon S3로 요청이 전송되고 여기에서 요청에 Development라는 접두사와 / 구분 기호가 지정됩니다. 콘솔의 응답은 컴퓨터 파일 시스템의 폴더 목록과 같습니다. 이전 예제에서는 companybucket 버킷에 Development/Projects1.xls 키가 지정된 객체가 하나 있음을 보여 줍니다.

콘솔에서는 논리적 계층 구조를 유추하기 위해 객체 키가 사용됩니다. Amazon S3에는 물리적 계층 구조가 없으며 플랫 파일 구조로 객체가 포함된 버킷만 있습니다. Amazon S3 API를 사용하여 객체를 만들면 논리적 계층 구조를 암시하는 객체 키를 사용할 수 있습니다. 객체의 논리적 계층 구조를 만들면 이 안내에서 시연되는 것과 같이 개별 폴더에 대한 액세스를 관리할 수 있습니다.

시작하기 전에 루트 수준 버킷 콘텐츠의 개념에 익숙해야 합니다. companybucket 버킷에 다음과 같은 객체가 있다고 가정합니다.

  • Private/privDoc1.txt

  • Private/privDoc2.zip

  • Development/project1.xls

  • Development/project2.xls

  • Finance/Tax2011/document1.pdf

  • Finance/Tax2011/document2.pdf

  • s3-dg.pdf

이러한 객체 키를 통해 Private, Development 및 루트 수준 폴더인 Finance와 루트 수준 객체인 s3-dg.pdf가 포함된 논리적 계층 구조가 생성됩니다. Amazon S3 콘솔에서 버킷 이름을 선택하면 다음 이미지와 같이 루트 수준 항목이 나타납니다. 콘솔에는 최상위 수준 접두사(Private/, Development/Finance/)가 루트 수준 폴더로 표시됩니다. 객체 키 s3-dg.pdf에는 접두사가 없으므로 이 키는 루트 수준 항목으로 나타납니다.


                목록에 s3-dg.pdf 객체가 있는 객체 탭의 콘솔 스크린샷.

연습 요약

이 연습에서는 안에 세 개의 폴더(Private, DevelopmentFinance)가 있는 버킷을 생성합니다.

Alice와 Bob이라는 사용자 두 명이 있습니다. Alice는 Development 폴더에만 액세스하도록 하고, Bob은 Finance 폴더에만 액세스하도록 하려고 합니다. Private 폴더 콘텐츠는 프라이빗으로 유지하려고 합니다. 이 연습에서는 IAM 사용자(이 예제에서는 Alice와 Bob이라는 사용자 이름을 사용)를 만들고 이 사용자에게 필요한 권한을 부여하여 액세스를 관리합니다.

IAM에서는 사용자 그룹을 만들어 이 그룹의 모든 사용자에게 적용되는 그룹 수준 권한을 부여할 수도 있습니다. 이렇게 하면 권한을 보다 효과적으로 관리할 수 있습니다. 이 연습에서는 Alice와 Bob 모두에게 몇 가지 공통적인 권한이 필요합니다. 따라서 Consultants라는 그룹도 만든 다음 Alice와 Bob을 모두 이 그룹에 추가합니다. 먼저 그룹 정책을 그룹에 연결하여 권한을 부여합니다. 그런 다음 정책을 특정 사용자에게 연결하여 사용자별 권한을 추가합니다.

참고

이 연습에서는 companybucket을 버킷 이름으로 사용하고, Alice와 Bob을 IAM 사용자로 사용하며, Consultants를 그룹 이름으로 사용합니다. Amazon S3에서는 버킷 이름이 글로벌로 고유해야 하기 때문에 버킷 이름을 새로 만드는 이름으로 바꿔야 합니다.

연습 준비

이 예제에서는 AWS 계정 자격 증명을 사용하여 IAM 사용자를 만듭니다. 처음에는 이러한 사용자에게 권한이 없습니다. 이러한 사용자에게 특정 Amazon S3 작업을 수행할 수 있는 권한을 증분 방식으로 부여합니다. 또한 이러한 권한을 테스트하기 위해 각 사용자의 자격 증명을 사용하여 콘솔에 로그인합니다. AWS 계정 소유자로 권한을 증분 방식으로 부여하고 IAM 사용자로 권한을 테스트하면서 로그인과 로그아웃을 반복해야 하는데 매번 다른 자격 증명을 사용해야 합니다. 하나의 브라우저에서 이 테스트를 수행할 수 있지만, 두 개의 브라우저를 사용할 수 있는 경우 프로세스가 더 빠르게 진행됩니다. 한 브라우저를 사용하여 AWS 계정 자격 증명으로 AWS Management 콘솔에 연결하고 다른 브라우저를 사용하여 IAM 사용자 자격 증명과 연결합니다.

AWS 계정 자격 증명으로 AWS Management 콘솔에 로그인하려면 https://console.aws.amazon.com/로 이동합니다. IAM 사용자는 동일한 링크를 사용하여 로그인할 수 없습니다. IAM 사용자는 IAM 지원 로그인 페이지를 사용해야 합니다. 계정 소유자는 사용자에게 이 링크를 제공할 수 있습니다.

IAM에 대한 자세한 내용은 IAM 사용 설명서AWS Management 콘솔 로그인 페이지를 참조하십시오.

IAM 사용자를 위한 로그인 링크를 제공하려면

  1. AWS Management 콘솔에 로그인한 다음 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 탐색 창에서 IAM 대시보드를 선택합니다.

  3. IAM 사용자 로그인 링크: 아래의 URL을 기록합니다. 자신의 IAM 사용자 이름 및 암호로 콘솔에 로그인할 수 있도록 IAM 사용자에게 이 링크를 제공하게 됩니다.

1단계: 버킷 만들기

이 단계에서는 AWS 계정 자격 증명을 사용하여 Amazon S3 콘솔에 로그인하고, 버킷을 만든 다음, 폴더(Development, FinancePrivate)를 버킷에 추가하고, 한 개 또는 두 개의 샘플 문서를 각 폴더에 업로드합니다.

  1. AWS Management 콘솔에 로그인하고 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 버킷을 만듭니다.

    단계별 지침은 Amazon Simple Storage Service 콘솔 사용 설명서S3 버킷을 생성하려면 어떻게 해야 합니까? 단원을 참조하십시오.

  3. 버킷에 문서를 하나 업로드합니다.

    이 연습에서는 이 버킷의 루트 수준에 s3-dg.pdf 문서가 있다고 가정합니다. 다른 문서를 업로드하는 경우 s3-dg.pdf를 해당 파일 이름으로 대체합니다.

  4. Private, FinanceDevelopment라는 세 개의 폴더를 버킷에 추가합니다.

    폴더를 만들기 위한 단계별 지침은 Amazon Simple Storage Service 콘솔 사용 설명서폴더 생성을 참조하십시오.

  5. 각 폴더에 문서를 한두 개 업로드합니다.

    이 연습에서는 문서 몇 개를 각 폴더에 업로드했으며 결과적으로 버킷에 다음 키를 사용하는 객체가 있다고 가정합니다.

    • Private/privDoc1.txt

    • Private/privDoc2.zip

    • Development/project1.xls

    • Development/project2.xls

    • Finance/Tax2011/document1.pdf

    • Finance/Tax2011/document2.pdf

    • s3-dg.pdf

    단계별 지침은 Amazon Simple Storage Service 콘솔 사용 설명서S3 버킷에 파일 및 폴더를 업로드하려면 어떻게 해야 합니까? 단원을 참조하십시오.

2단계: IAM 사용자 및 그룹 만들기

이제 IAM 콘솔을 사용하여 Alice와 Bob이라는 두 IAM 사용자를 AWS 계정에 추가합니다. 또한 Consultants라는 관리자 그룹을 만든 다음, 두 사용자를 모두 이 그룹에 추가합니다.

주의

사용자와 그룹을 추가할 때 이러한 사용자에게 권한을 부여하는 정책을 연결하지 마십시오. 처음에는 이러한 사용자가 어떠한 권한도 가지고 있지 않습니다. 다음 단원에서는 증분 방식으로 권한을 부여합니다. 먼저 이러한 IAM 사용자에게 암호를 할당했는지 확인해야 합니다. 이러한 사용자 자격 증명을 사용하여 Amazon S3 작업을 테스트하고 권한이 예상대로 작동하는지 확인합니다.

새 IAM 사용자 만들기에 대한 단계별 지침은 IAM 사용 설명서AWS 계정에서 IAM 사용자 생성을 참조하십시오. 이 연습에서 사용자를 만들 때는 AWS Management Console 액세스를 선택하고 프로그래밍 방식 액세스의 선택을 취소합니다.

관리자 그룹 만들기에 대한 단계별 지침은 IAM 사용 설명서IAM 사용자와 관리자 그룹 처음 만들기를 참조하십시오.

3단계: IAM 사용자가 권한을 가지고 있지 않는지 확인

두 개의 브라우저를 사용하는 경우 이제 두 번째 브라우저를 사용하여 IAM 사용자 자격 증명 중 하나로 콘솔에 로그인할 수 있습니다.

  1. IAM 사용자 로그인 링크(IAM 사용자를 위한 로그인 링크를 제공하려면 참조)를 사용하여 IAM 사용자 자격 증명 중 하나로 AWS Management 콘솔에 로그인합니다.

  2. https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

    액세스가 거부되었다는 다음 콘솔 메시지를 확인합니다.

    
                        액세스 거부 오류 메시지를 보여 주는 콘솔 스크린샷.

이제 사용자에게 증분 권한을 부여하는 작업을 시작할 수 있습니다. 먼저, 두 사용자가 모두 가지고 있어야 하는 권한을 부여하는 그룹 정책을 연결합니다.

4단계: 그룹 수준 권한 부여

사용자가 다음을 수행할 수 있게 만들려고 합니다.

  • 상위 계정이 소유한 모든 버킷 나열 이렇게 하려면 Bob과 Alice에게 s3:ListAllMyBuckets 작업을 위한 권한이 있어야 합니다.

  • companybucket 버킷의 루트 수준 항목, 폴더 및 객체를 나열합니다. 이렇게 하려면 Bob과 Alice에게 s3:ListBucket 버킷에 companybucket 작업을 수행하기 위한 권한이 있어야 합니다.

먼저, 이러한 권한을 부여하는 정책을 만든 다음 이 정책을 Consultants 그룹에 연결합니다.

4.1단계: 모든 버킷을 나열하는 권한 부여

이 단계에서는 사용자가 상위 계정이 소유한 모든 버킷을 나열할 수 있도록 사용자에게 최소한의 권한을 부여하는 관리형 정책을 만듭니다. 그런 다음 정책을 Consultants 그룹에 연결합니다. 관리형 정책을 사용자 또는 그룹에 연결하면 상위 AWS 계정이 소유한 버킷의 목록을 가져올 수 있는 사용자 또는 그룹 권한을 부여하는 것입니다.

  1. AWS Management 콘솔에 로그인한 다음 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

    참고

    사용자 권한을 부여하고 있으므로 IAM 사용자로 로그인하지 않고 AWS 계정 자격 증명을 사용하여 로그인합니다.

  2. 관리형 정책을 만듭니다.

    1. 왼쪽 탐색 창에서 정책을 선택한 다음 정책 생성을 선택합니다.

    2. JSON 탭을 선택합니다.

    3. 다음 액세스 정책을 복사하여 정책 텍스트 필드에 붙여 넣습니다.

      { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListInTheConsole", "Action": ["s3:ListAllMyBuckets"], "Effect": "Allow", "Resource": ["arn:aws:s3:::*"] } ] }

      정책은 JSON 문서입니다. 문서에서 Statement는 객체 배열로, 각 객체는 이름-값 페어 모음을 사용하여 권한을 설명합니다. 이전 정책은 하나의 특정 권한을 설명합니다. Action은 액세스 유형을 지정합니다. 정책에서 s3:ListAllMyBuckets는 사전 정의된 Amazon S3 작업입니다. 이 작업은 인증된 발신자가 소유한 모든 버킷의 목록을 반환하는 Amazon S3 GET Service 작업을 포함합니다. Effect 요소 값은 특정 권한이 허용되는지 또는 거부되는지를 결정합니다.

    4. Review policy(정책 검토)를 선택합니다. 다음 페이지에서 Name(이름) 필드에 AllowGroupToSeeBucketListInTheConsole을 입력하고 Create policy(정책 생성)를 선택합니다.

      참고

      요약 항목에 이 정책이 어떠한 권한도 부여하지 않는다고 알리는 메시지가 표시됩니다. 이 연습의 경우 이 메시지를 무시해도 됩니다.

  3. 만든 AllowGroupToSeeBucketListInTheConsole 관리형 정책을 Consultants 그룹에 연결합니다.

    관리형 정책 연결에 대한 단계별 지침은 IAM 사용 설명서IAM 정책 추가 및 제거를 참조하십시오.

    IAM 콘솔의 IAM 사용자 및 그룹에 정책 문서를 연결합니다. 두 사용자가 모두 버킷을 나열할 수 있게 만들려고 하기 때문에 정책을 그룹에 연결합니다.

  4. 권한을 테스트합니다.

    1. IAM 사용자 로그인 링크(IAM 사용자를 위한 로그인 링크를 제공하려면 참조)를 사용하여 IAM 사용자 자격 증명 중 하나로 콘솔에 로그인합니다.

    2. https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

      이제 콘솔에 모든 버킷이 나열되지만 버킷의 객체는 아닙니다.

      
                                    버킷 목록을 보여주는 콘솔 스크린샷.

4.2단계: 사용자가 버킷의 루트 수준 콘텐츠를 나열할 수 있도록 허용

다음에는 Consultants 그룹의 모든 사용자가 루트 수준 companybucket 버킷 항목을 나열하도록 허용합니다. 사용자가 Amazon S3 콘솔에서 회사 버킷을 선택하면 이 사용자는 버킷에 있는 루트 수준 항목을 볼 수 있습니다.


                    companybucket의 콘텐츠를 보여 주는 콘솔 스크린샷.

참고

이 예제에서는 예시를 위해 companybucket을 사용합니다. 각자 자신이 만든 버킷의 이름을 사용해야 합니다.

버킷 이름을 선택할 때 콘솔에서 Amazon S3로 보내는 요청, Amazon S3에서 반환하는 응답 및 콘솔에서 응답을 해석하는 방식을 이해하려면 약간 더 자세하게 살펴보아야 합니다.

버킷 이름을 선택하면 콘솔에서 GET Bucket (List Objects) 요청을 Amazon S3로 전송합니다. 이 요청에는 다음 파라미터가 포함되어 있습니다.

  • 빈 문자열이 값으로 포함된 prefix 파라미터입니다.

  • /가 값으로 포함된 delimiter 파라미터입니다.

다음은 예제 요청입니다.

GET ?prefix=&delimiter=/ HTTP/1.1 Host: companybucket.s3.amazonaws.com Date: Wed, 01 Aug 2012 12:00:00 GMT Authorization: AWS AKIAIOSFODNN7EXAMPLE:xQE0diMbLRepdf3YB+FIEXAMPLE=

Amazon S3에서 다음 <ListBucketResult/> 요소가 포함된 응답을 반환합니다.

<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Name>companybucket</Name> <Prefix></Prefix> <Delimiter>/</Delimiter> ... <Contents> <Key>s3-dg.pdf</Key> ... </Contents> <CommonPrefixes> <Prefix>Development/</Prefix> </CommonPrefixes> <CommonPrefixes> <Prefix>Finance/</Prefix> </CommonPrefixes> <CommonPrefixes> <Prefix>Private/</Prefix> </CommonPrefixes> </ListBucketResult>

s3-dg.pdf 객체에는 슬래시(/) 구분 기호가 포함되지 않으며, Amazon S3는 이 키를 <Contents> 요소에 반환합니다. 하지만 예제 버킷에 있는 다른 모든 키에는 / 구분 기호가 포함되어 있습니다. Amazon S3는 이러한 키를 그룹화하여 각 개별 접두사 값 Development/, Finance/Private/에 대해 <CommonPrefixes> 요소를 반환합니다. 이러한 각 접두사 값은 이러한 키의 시작 부분부터 지정된 / 구분 기호의 첫 번째 발생 지점까지의 하위 문자열입니다.

콘솔에서 이 결과를 해석하여 루트 수준 항목을 폴더 3개와 객체 키 하나로 표시합니다.


                    세 개의 폴더와 하나의 pdf 파일이 있는 companybucket의 콘텐츠를 보여 주는 콘솔 스크린샷.

Bob 또는 Alice가 Development(개발) 폴더를 열면 콘솔에서 prefixdelimiter 파라미터가 다음 값으로 설정된 GET Bucket(List Objects) 요청이 Amazon S3로 전송됩니다.

  • Development/가 있는 prefix 파라미터입니다.

  • /” 값이 있는 delimiter 파라미터입니다.

이에 응답하여 Amazon S3에서 지정된 접두사로 시작하는 객체 키를 반환합니다.

<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Name>companybucket</Name> <Prefix>Development</Prefix> <Delimiter>/</Delimiter> ... <Contents> <Key>Project1.xls</Key> ... </Contents> <Contents> <Key>Project2.xls</Key> ... </Contents> </ListBucketResult>

콘솔에 객체 키가 표시됩니다.


                    두 개의 xls 파일이 포함된 개발 폴더를 보여 주는 콘솔 스크린샷.

이제 루트 수준 버킷 항목을 나열할 수 있는 사용자 권한을 부여하는 작업으로 돌아갑니다. 버킷 콘텐츠를 나열하려면 다음 정책 설명에 나와 있듯이 사용자에게 s3:ListBucket 작업을 호출할 수 있는 권한이 필요합니다. 사용자가 루트 수준 콘텐츠만 보도록 하기 위해 사용자가 요청에서 빈 prefix를 지정해야 한다는 조건을 추가합니다. 이렇게 하면 사용자는 루트 수준 폴더를 두 번 클릭할 수 없습니다. 마지막으로, 사용자 요청에 “/” 값이 있는 delimiter 파라미터가 포함되도록 하여 폴더 스타일 액세스를 요구하는 조건을 추가합니다.

{ "Sid": "AllowRootLevelListingOfCompanyBucket", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::companybucket"], "Condition":{ "StringEquals":{ "s3:prefix":[""], "s3:delimiter":["/"] } } }

Amazon S3 콘솔에서 버킷을 선택하면 콘솔은 먼저 GET Bucket location 요청을 전송하여 버킷이 배포되는 AWS 리전을 찾습니다. 그런 다음 콘솔은 버킷에 대한 리전별 엔드포인트를 사용하여 GET Bucket (List Objects) 요청을 전송합니다. 결과적으로 사용자가 콘솔을 사용하려는 경우 다음 정책 설명과 같이 s3:GetBucketLocation 작업에 대한 권한을 부여해야 합니다.

{ "Sid": "RequiredByS3Console", "Action": ["s3:GetBucketLocation"], "Effect": "Allow", "Resource": ["arn:aws:s3:::*"] }

사용자가 루트 수준 버킷 콘텐츠를 나열할 수 있도록 허용하려면

  1. AWS Management 콘솔에 로그인하고 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

    IAM 사용자의 자격 증명이 아니라 AWS 계정 자격 증명을 사용하여 콘솔에 로그인합니다.

  2. Consultants 그룹에 연결된 기존 AllowGroupToSeeBucketListInTheConsole 관리형 정책을 다음 정책으로 바꿉니다. 다음 정책은 s3:ListBucket 작업도 허용합니다. 정책에 있는 companybucket을 버킷 이름이 있는 Resource로 바꿔야 합니다.

    단계별 지침은 IAM 사용 설명서IAM 정책 편집을 참조하십시오. 단계별 지침을 따를 때는 정책이 연결된 모든 보안 주체에 변경 사항을 적용하기 위한 단계를 따라야 합니다.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListAndAlsoAllowGetBucketLocationRequiredForListBucket", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::*" ] }, { "Sid": "AllowRootLevelListingOfCompanyBucket", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::companybucket"], "Condition":{ "StringEquals":{ "s3:prefix":[""], "s3:delimiter":["/"] } } } ] }
  3. 업데이트된 권한을 테스트합니다.

    1. IAM 사용자 로그인 링크(IAM 사용자를 위한 로그인 링크를 제공하려면 참조)를 사용하여 AWS Management 콘솔에 로그인합니다.

      https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

    2. 만든 버킷을 선택합니다. 그러면 콘솔에 루트 수준 버킷 항목이 표시됩니다. 버킷에서 폴더 하나를 선택하면 폴더 콘텐츠를 볼 수 없습니다. 아직 해당 권한을 부여하지 않았기 때문입니다.

      
                                    세 개의 폴더가 포함된 회사 버킷을 보여 주는 콘솔 스크린샷.

사용자가 Amazon S3 콘솔을 사용할 때는 이 테스트가 성공합니다. 콘솔에서 버킷을 선택하면 콘솔 구현에서 빈 문자열이 값으로 있는 prefix 파라미터와 “/”가 값으로 있는 delimiter 파라미터가 포함된 요청이 전송됩니다.

4.3단계: 그룹 정책 요약

추가한 그룹 정책의 순 효과는 IAM 사용자인 Alice와 Bob에게 다음과 같은 최소한의 권한을 부여하는 것입니다.

  • 상위 계정이 소유한 모든 버킷 나열

  • companybucket 버킷의 루트 수준 항목 확인

하지만 사용자는 여전히 많은 작업을 수행할 수 없습니다. 다음에는 아래와 같이 사용자별 권한을 부여합니다.

  • Alice가 객체를 가져와서 Development 폴더에 넣을 수 있도록 허용합니다.

  • Bob이 객체를 가져와서 Finance 폴더에 넣을 수 있도록 허용합니다.

사용자별 권한의 경우 그룹이 아니라 특정 사용자에게 정책을 연결합니다. 다음 단원에서는 Alice에게 Development 폴더에서 작업할 수 있는 권한을 부여합니다. 이 단계를 반복하여 Bob에게 Finance 폴더에서 작업을 수행할 수 있는 비슷한 권한을 부여할 수 있습니다.

5단계: IAM 사용자인 Alice에게 특정 권한 부여

이제 Alice가 Development 폴더의 콘텐츠를 보고 객체를 가져와서 해당 폴더에 넣을 수 있도록 Alice에게 추가 권한을 부여합니다.

5.1단계: IAM 사용자인 Alice에게 Development 폴더 콘텐츠 나열 권한 부여

Alice가 Development 폴더 콘텐츠를 나열하려면 요청에 접두사 Development/가 포함되는 경우 companybucket 버킷의 s3:ListBucket 작업에 대한 권한을 부여하는 정책을 Alice 사용자에게 적용해야 합니다. 이 정책을 사용자 Alice에게만 적용하려고 하므로 인라인 정책을 사용합니다. 인라인 정책에 대한 자세한 내용은 IAM 사용 설명서에서 관리형 정책과 인라인 정책 단원을 참조하십시오.

  1. AWS Management 콘솔에 로그인한 다음 https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

    IAM 사용자의 자격 증명이 아니라 AWS 계정 자격 증명을 사용하여 콘솔에 로그인합니다.

  2. 사용자 Alice에게 Development 폴더 콘텐츠를 나열할 수 있는 권한을 부여하기 위해 인라인 정책을 만듭니다.

    1. 왼쪽에 있는 탐색 창에서 Users(사용자)를 선택합니다.

    2. 사용자 이름 Alice를 선택합니다.

    3. 사용자 세부 정보 페이지에서 Permissions(권한) 탭을 선택한 다음 Add inline policy(인라인 정책 추가)를 선택합니다.

    4. JSON 탭을 선택합니다.

    5. 다음 액세스 정책을 복사하여 정책 텍스트 필드에 붙여 넣습니다.

      { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListBucketIfSpecificPrefixIsIncludedInRequest", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::companybucket"], "Condition":{ "StringLike":{"s3:prefix":["Development/*"] } } } ] }
    6. Review policy(정책 검토)를 선택합니다. 다음 페이지에서 Name(이름) 필드에 이름을 입력하고 Create policy(정책 생성)를 선택합니다.

  3. Alice의 권한에 대한 변경 사항을 테스트합니다.

    1. IAM 사용자 로그인 링크(IAM 사용자를 위한 로그인 링크를 제공하려면 참조)를 사용하여 AWS Management 콘솔에 로그인합니다.

    2. https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

    3. Amazon S3 콘솔에서 Alice가 버킷의 Development/ 폴더에 있는 객체의 목록을 볼 수 있는지 확인합니다.

      사용자가 /Development 폴더를 선택하여 그 안에 있는 객체의 목록을 보면 Amazon S3 콘솔에서 접두사 /Development가 있는 ListObjects 요청이 Amazon S3로 전송됩니다. 접두사 Development 및 구분 기호 /이 있는 객체 목록을 볼 수 있는 권한이 사용자에게 부여되기 때문에 Amazon S3에서 키 접두사 Development/가 있는 객체의 목록이 반환되고 콘솔에 이 목록이 표시됩니다.

      
                                    두 개의 xls 파일이 포함된 개발 폴더를 보여 주는 콘솔 스크린샷.

5.2단계: IAM 사용자인 Alice에게 객체를 가져와 Development 폴더에 넣을 수 있는 권한 부여

Alice가 객체를 가져와서 s3:PutObject 폴더에 넣으려면 Developments3:GetObject 작업을 호출할 수 있는 권한이 필요합니다. 다음 정책 설명은 요청에 값 prefix가 있는 Development/ 파라미터가 포함되는 경우 이러한 권한을 부여합니다.

{ "Sid":"AllowUserToReadWriteObjectData", "Action":["s3:GetObject", "s3:PutObject"], "Effect":"Allow", "Resource":["arn:aws:s3:::companybucket/Development/*"] }
  1. AWS Management 콘솔에 로그인하고 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

    IAM 사용자의 자격 증명이 아니라 AWS 계정 자격 증명을 사용하여 콘솔에 로그인합니다.

  2. 이전 단계에서 만든 인라인 정책을 편집합니다.

    1. 왼쪽에 있는 탐색 창에서 Users(사용자)를 선택합니다.

    2. 사용자 이름 Alice를 선택합니다.

    3. 사용자 세부 정보 페이지에서 Permissions(권한) 탭을 선택하고 Inline Policies(인라인 정책) 섹션을 확장합니다.

    4. 이전 단계에서 만든 정책의 이름 옆에 있는 Edit Policy(정책 편집)를 선택합니다.

    5. 다음 정책을 복사하여 정책 텍스트 필드에 붙여 넣어 기존 정책을 바꿉니다.

      { "Version": "2012-10-17", "Statement":[ { "Sid":"AllowListBucketIfSpecificPrefixIsIncludedInRequest", "Action":["s3:ListBucket"], "Effect":"Allow", "Resource":["arn:aws:s3:::companybucket"], "Condition":{ "StringLike":{"s3:prefix":["Development/*"] } } }, { "Sid":"AllowUserToReadWriteObjectDataInDevelopmentFolder", "Action":["s3:GetObject", "s3:PutObject"], "Effect":"Allow", "Resource":["arn:aws:s3:::companybucket/Development/*"] } ] }
  3. 업데이트된 정책을 테스트합니다.

    1. IAM 사용자 로그인 링크(IAM 사용자를 위한 로그인 링크를 제공하려면 참조)를 사용하여 AWS Management 콘솔에 로그인합니다.

    2. https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

    3. Amazon S3 콘솔에서 Alice가 이제 Development 폴더에서 객체를 추가하고 객체를 다운로드할 수 있는지 확인합니다.

5.3단계: 버킷의 다른 모든 폴더에 대한 IAM 사용자 Alice의 권한 명시적으로 거부

이제 사용자 Alice가 companybucket 버킷의 루트 수준 콘텐츠를 나열할 수 있습니다. Alice는 객체를 가져와 Development 폴더에 넣을 수도 있습니다. 액세스 권한을 강화하고 싶은 경우 버킷의 다른 모든 폴더에 대한 Alice의 액세스 권한을 명시적으로 거부할 수 있습니다. Alice에게 버킷의 다른 모든 폴더에 대한 액세스 권한을 부여하는 다른 정책(버킷 정책 또는 ACL)이 있는 경우 이 명시적 거부로 인해 해당 권한이 재정의됩니다.

Alice가 Amazon S3로 보내는 모든 요청에 prefix 파라미터(값: Development/* 또는 빈 문자열)를 포함할 것을 요구하는 다음 설명을 사용자 Alice의 정책에 추가할 수 있습니다.

{ "Sid": "ExplicitlyDenyAnyRequestsForAllOtherFoldersExceptDevelopment", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws:s3:::companybucket"], "Condition":{ "StringNotLike": {"s3:prefix":["Development/*",""] }, "Null" : {"s3:prefix":false } } }

Condition 블록에는 두 개의 조건식이 있습니다. 이러한 조건식의 결과는 논리적 AND를 사용하여 결합됩니다. 두 조건이 모두 true인 경우 결합된 조건의 결과가 true입니다. 이 정책에서 EffectDeny이기 때문에 Condition이 ture로 평가되면 사용자는 지정된 Action을 수행할 수 없습니다.

  • Null 조건식은 Alice가 보내는 요청에 prefix 파라미터가 포함되도록 합니다.

    prefix 파라미터는 폴더와 같은 액세스를 요구합니다. prefix 파라미터 없이 요청을 보낼 경우 Amazon S3에서 모든 객체 키를 반환합니다.

    요청에 널 값이 있는 prefix 파라미터가 포함되는 경우 식은 true로 평가되며 따라서 전체 Condition이 true로 평가됩니다. prefix 파라미터의 값으로 빈 문자열을 허용해야 합니다. 이전 논의에서 null 문자열을 허용하면 Alice가 앞의 논의에서 콘솔이 그랬던 것처럼 루트 수준 버킷 항목을 검색할 수 있습니다. 자세한 내용은 4.2단계: 사용자가 버킷의 루트 수준 콘텐츠를 나열할 수 있도록 허용 단원을 참조하십시오.

  • StringNotLike 조건식은 prefix 파라미터의 값이 지정되고 Development/*가 아닌 경우 요청이 실패하도록 합니다.

이전 단원의 단계를 따라 사용자 Alice에 대해 만든 인라인 정책을 다시 업데이트합니다.

다음 정책을 복사하여 정책 텍스트 필드에 붙여 넣어 기존 정책을 바꿉니다.

{ "Version": "2012-10-17", "Statement":[ { "Sid":"AllowListBucketIfSpecificPrefixIsIncludedInRequest", "Action":["s3:ListBucket"], "Effect":"Allow", "Resource":["arn:aws:s3:::companybucket"], "Condition":{ "StringLike":{"s3:prefix":["Development/*"] } } }, { "Sid":"AllowUserToReadWriteObjectDataInDevelopmentFolder", "Action":["s3:GetObject", "s3:PutObject"], "Effect":"Allow", "Resource":["arn:aws:s3:::companybucket/Development/*"] }, { "Sid": "ExplicitlyDenyAnyRequestsForAllOtherFoldersExceptDevelopment", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws:s3:::companybucket"], "Condition":{ "StringNotLike": {"s3:prefix":["Development/*",""] }, "Null" : {"s3:prefix":false } } } ] }

6단계: IAM 사용자인 Bob에게 특정 권한 부여

이제 Bob에게 Finance 폴더에 대한 권한을 부여하려고 합니다. 앞에서 Alice에게 권한을 부여하는 데 사용한 단계를 따르지만, Development 폴더를 Finance 폴더로 바꿉니다. 단계별 지침은 5단계: IAM 사용자인 Alice에게 특정 권한 부여를 참조하십시오.

7단계: Private 폴더에 보안 지정

이 예제에서는 사용자가 두 명뿐입니다. 그룹 수준에서 필요한 모든 최소한의 권한을 부여하고 필요할 때만 사용자 수준 권한을 개별 사용자 수준에 있는 권한에 부여했습니다. 이 접근 방식을 취하면 권한 관리 작업을 최소화하는 데 도움이 됩니다. 사용자 수가 증가하면서 권한 관리 작업이 부담이 될 수 있습니다. 예를 들어, 이 예제의 어떤 사용자도 Private 폴더의 콘텐츠에 액세스하지 못하게 하려고 합니다. 이 폴더에 실수로 사용자 권한을 부여하지 않도록 하려면 어떻게 해야 할까요? 해당 폴더에 대한 액세스 권한을 명시적으로 거부하는 정책을 추가하면 됩니다. 명시적 거부로 인해 다른 모든 권한이 재정의됩니다.

Private 폴더를 프라이빗으로 유지하려면 다음 두 개의 거부 문을 그룹 정책에 추가할 수 있습니다.

  • Private 폴더의 리소스(companybucket/Private/*)에 대한 모든 작업을 명시적으로 거부하려면 다음 문을 추가합니다.

    { "Sid": "ExplictDenyAccessToPrivateFolderToEveryoneInTheGroup", "Action": ["s3:*"], "Effect": "Deny", "Resource":["arn:aws:s3:::companybucket/Private/*"] }
  • 요청에서 Private/ 접두사를 지정하면 객체 나열 작업에 대한 권한도 거부하게 됩니다. 콘솔에서 Bob 또는 Alice가 Private 폴더를 열면 이 정책으로 인해 Amazon S3에서 오류 응답을 반환합니다.

    { "Sid": "DenyListBucketOnPrivateFolder", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws:s3:::*"], "Condition":{ "StringLike":{"s3:prefix":["Private/"]} } }

Consultants 그룹 정책을 이전의 거부 문을 포함하는 업데이트된 정책으로 대체합니다. 업데이트된 정책이 적용된 후에는 그룹에 있는 어떤 사용자도 버킷의 Private 폴더에 액세스할 수 없습니다.

  1. AWS Management 콘솔에 로그인하고 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

    IAM 사용자의 자격 증명이 아니라 AWS 계정 자격 증명을 사용하여 콘솔에 로그인합니다.

  2. Consultants 그룹에 연결된 기존 AllowGroupToSeeBucketListInTheConsole 관리형 정책을 다음 정책으로 바꿉니다. 정책에서 companybucket을 버킷의 이름으로 대체해야 합니다.

    지침은 IAM 사용 설명서고객 관리형 정책 편집을 참조하십시오. 지침을 따를 때 정책이 연결된 모든 보안 주체에 변경 사항을 적용하는 작업에 대한 지시 사항을 반드시 따르십시오.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListAndAlsoAllowGetBucketLocationRequiredForListBucket", "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"], "Effect": "Allow", "Resource": ["arn:aws:s3:::*"] }, { "Sid": "AllowRootLevelListingOfCompanyBucket", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::companybucket"], "Condition":{ "StringEquals":{"s3:prefix":[""]} } }, { "Sid": "RequireFolderStyleList", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws:s3:::*"], "Condition":{ "StringNotEquals":{"s3:delimiter":"/"} } }, { "Sid": "ExplictDenyAccessToPrivateFolderToEveryoneInTheGroup", "Action": ["s3:*"], "Effect": "Deny", "Resource":["arn:aws:s3:::companybucket/Private/*"] }, { "Sid": "DenyListBucketOnPrivateFolder", "Action": ["s3:ListBucket"], "Effect": "Deny", "Resource": ["arn:aws:s3:::*"], "Condition":{ "StringLike":{"s3:prefix":["Private/"]} } } ] }

8단계: 정리

정리하려면 IAM 콘솔을 열고 사용자 Alice와 Bob을 제거합니다. 단계별 지침은 IAM 사용 설명서IAM 사용자 삭제를 참조하십시오.

스토리지에 대한 추가 요금이 부과되지 않도록 하려면 이 연습을 위해 만든 객체와 버킷도 삭제해야 합니다.

관련 리소스