메뉴
Amazon Simple Storage Service
개발자 안내서 (API Version 2006-03-01)

안내 예제: 사용자 정책을 통해 버킷에 대한 액세스 제어

본 연습에서는 Amazon S3에서 사용자 권한이 어떻게 사용되는지를 설명합니다. 폴더가 포함된 버킷을 만든 다음 AWS 계정에 AWS Identity and Access Management 사용자를 만들고 이 사용자에게 Amazon S3 버킷과 여기에 포함된 폴더에 대한 증분 권한을 부여해 보겠습니다.

배경: 버킷 및 폴더 기본 사항

Amazon S3 데이터 모델은 단조로운 구조를 가지고 있습니다. 사용자가 버킷을 만들면 이 버킷에 객체가 저장됩니다. 하위 버킷 또는 하위 폴더로 이루어진 계층 구조가 없지만 폴더 계층 구조를 모방할 수는 있습니다. Amazon S3 콘솔과 같은 도구에서는 여기에 나와 있는 것과 같이 버킷의 이러한 논리적 폴더 및 하위 폴더를 표시할 수 있습니다.

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

  • [Development] 폴더를 만들면 콘솔에서 Development/라는 키를 사용하여 객체를 만듭니다. 후행 '/' 구분 기호에 유의합니다.

  • [Development] 폴더에서 [Projects1.xls]라는 객체를 업로드하면 콘솔에서 객체를 업로드하여 이 객체에 [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, DevelopmentFinance라는 루트 수준 폴더와 s3-dg.pdf라는 루트 수준 객체가 포함된 논리적 계층 구조가 생성됩니다. Amazon S3 콘솔에서 버킷 이름을 클릭하면 루트 수준 항목이 다음과 같이 나타납니다. 콘솔에 최상위 접두사(Private/, Development/ 및 Finance/)가 루트 수준 폴더로 표시됩니다. 객체 키인 s3-dg.pdf에는 접두사가 없으므로 루트 수준 항목으로 나타납니다.

안내 예제

이 안내의 예제는 다음과 같습니다.

  • 버킷을 만든 다음 여기에 3가지 폴더(Private, Development 및 Finance)를 추가합니다.

  • Alice와 Bob이라는 사용자 두 명이 있습니다. Alice는 Development 폴더에만 액세스하게 만들고 Bob은 Finance 폴더에만 액세스하게 만들며 Private 폴더의 콘텐츠는 개인용으로 두려고 합니다. 본 연습에서는 AWS Identity and Access Management(IAM) 사용자를 만들어 액세스를 관리하고 해당 사용자에게 필요한 권한을 부여하겠습니다. 또한 같은 사용자 이름(Alice와 Bob)을 사용하도록 하겠습니다.

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

참고

본 연습에서는 companybucket이 버킷 이름으로 사용되고 Alice와 Bob이 IAM 사용자로 사용되며 Consultants가 그룹 이름으로 사용됩니다. Amazon S3에서는 버킷 이름이 전역적으로 고유해야 하기 때문에 버킷 이름을 만드는 이름으로 대체해야 합니다.

0단계: 연습 준비

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

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

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

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

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

  2. [Navigation] 창에서 [IAM Dashboard]를 클릭합니다.

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

1단계: 버킷 만들기

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

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

  2. 버킷을 만듭니다.

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

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

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

  4. Private, Finance 및 Development라는 3가지 폴더를 버킷에 추가합니다.

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

    이 연습에서는 사용자가 각 폴더에 문서를 몇 개 업로드하여 버킷에 다음 키가 지정된 객체가 포함되어 있다고 가정합니다.

    Private/privDoc1.txt

    Private/privDoc2.zip

    Development/project1.xls

    Development/project2.xls

    Finance/Tax2011/document1.pdf

    Finance/Tax2011/document2.pdf

    s3-dg.pdf

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

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

이제 IAM 콘솔을 사용하여 AWS 계정에 Alice와 Bob이라는 두 IAM 사용자를 추가하십시오. Consultants라는 관리자 그룹도 만든 다음 두 사용자를 모두 이 그룹에 추가하십시오.

주의

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

새로운 IAM 사용자를 만드는 단계별 지침은 IAM 사용 설명서AWS 계정의 IAM 사용자 생성 단원을 참조하십시오.

관리자 그룹을 만드는 단계별 지침은 IAM 사용 설명서IAM 사용자와 관리자 그룹 처음 만들기 단원을 참조하십시오.

3단계: IAM 사용자에게 권한이 없는지 확인

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

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

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

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

이제 사용자에게 증분 권한을 부여해 보겠습니다. 먼저 두 사용자 모두에게 있어야 하는 권한을 부여하는 그룹 정책을 연결하겠습니다.

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

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

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

    이렇게 하려면 Bob과 Alice에게 s3:ListAllMyBuckets 작업을 위한 권한이 있어야 합니다.

  • companybucket 버킷의 루트 수준 항목, 폴더 및 객체 나열

    이렇게 하려면 Bob과 Alice에게 companybucket 버킷에 s3:ListBucket 작업을 수행하기 위한 권한이 있어야 합니다.

이제 이러한 권한을 부여하는 정책을 만든 다음 Consultants 그룹에 연결해 보겠습니다.

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

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

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

    참고

    사용자 권한을 부여할 것이므로 IAM 사용자가 아니라 AWS 계정 자격 증명으로 로그인하십시오.

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

    1. 왼쪽 탐색 창에서 [Policies]를 클릭한 후 [Create Policy]를 클릭합니다.

    2. [Create Your Own Policy] 옆의 [Select]를 클릭합니다.

    3. [Policy Name] 필드에 AllowGroupToSeeBucketListInTheConsole을 입력합니다.

    4. 다음 액세스 정책을 복사하여 [Policy Document] 필드에 붙여 넣습니다.

      Copy
      { "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 요소 값은 특정 권한이 허용되는지 아니면 거부되는지를 결정합니다.

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

    관리형 정책을 연결하는 단계별 지침은 IAM 사용 설명서AWS Management Console을 사용한 관리형 정책 작업 단원을 참조하십시오.

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

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

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

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

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

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

이제 모든 사용자가 루트 수준 companybucket 버킷 항목을 나열할 수 있도록 허용하겠습니다. 사용자가 Amazon S3 콘솔에서 회사 버킷을 클릭하면 해당 사용자에게 버킷의 루트 수준 항목이 표시됩니다.

여기서는 설명을 위해 companybucket을 사용하는 것입니다. 이 연습을 위해 만든 버킷의 이름을 사용해야 합니다.

버킷 이름을 클릭할 때 콘솔에서 Amazon S3로 보내는 요청, Amazon S3에서 반환하는 응답 및 콘솔에서 응답을 해석하는 방식을 이해하려면 심층 분석이 필요합니다.

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

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

  • 값으로 /가 포함된 delimiter 파라미터

다음은 요청 예제입니다.

Copy
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/> 요소를 포함하는 응답을 반환합니다.

Copy
<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개와 객체 키 하나로 표시합니다.

이제 Bob이나 Alice가 [Development] 폴더를 두 번 클릭하면 prefixdelimiter 파라미터가 다음 값으로 설정되어 콘솔에서 Amazon S3로 GET Bucket (List Objects) 요청을 보냅니다.

  • Development/가 포함된 prefix 파라미터

  • '/'가 포함된 delimiter 파라미터

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

Copy
<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>

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

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

Copy
{ "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 작업에 대한 권한을 부여해야 합니다.

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

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

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

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

  2. Consultants 그룹에 연결된 기존 AllowGroupToSeeBucketListInTheConsole 관리형 정책을 s3:ListBucket 작업도 허용하는 다음 정책으로 대체합니다. Resource 정책에서 companybucket을 버킷의 이름으로 대체해야 합니다.

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

    Copy
    { "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 Console에 로그인합니다.

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

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

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

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

    1. 왼쪽 탐색 창에서 [Users]를 클릭합니다.

    2. 사용자 이름 Alice를 클릭합니다.

    3. 사용자 세부 정보 페이지에서 [Permissions] 탭을 선택한 다음 [Inline Policies] 섹션을 확장합니다.

    4. [click here] 또는 [Create User Policy]를 선택합니다.

    5. [Custom Policy]를 클릭한 후 [Select]를 클릭합니다.

    6. [Policy Name] 필드에 정책 이름을 입력합니다.

    7. 다음 정책을 [Policy Document] 필드에 복사해 넣습니다.

      Copy
      { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListBucketIfSpecificPrefixIsIncludedInRequest", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::companybucket"], "Condition":{ "StringLike":{"s3:prefix":["Development/*"] } } } ] }
  3. Alice의 권한에 대한 변경 사항을 테스트합니다.

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

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

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

      사용자가 /Development 폴더에 있는 객체의 목록을 보기 위해 이 폴더를 클릭하면 Amazon S3 콘솔에서 Amazon S3로 접두사 /Development가 지정된 ListObjects 요청을 보냅니다. 접두사 Development 및 구분 기호 '/'로 사용자에게 객체 목록 확인 권한이 부여되기 때문에 Amazon S3에서 키 접두사 Development/가 지정된 객체의 목록이 반환되고 콘솔에 이 목록이 표시됩니다.

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

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

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

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

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

    1. 왼쪽 탐색 창에서 [Users]를 클릭합니다.

    2. 사용자 이름 Alice를 클릭합니다.

    3. 사용자 세부 정보 페이지에서 [Permissions] 탭을 선택한 다음 [Inline Policies] 섹션을 확장합니다.

    4. 이전 단계에서 만든 정책의 이름 옆에 있는 [Edit Policy]를 클릭합니다.

    5. 다음 정책을 [Policy Document] 필드에 복사해 넣어 기존 정책을 대체합니다.

      Copy
      { "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 Console에 로그인합니다.

    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의 정책에 추가할 수 있습니다.

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

Condition 블록에는 조건식이 2개 있습니다. 이 조건식의 결과는 논리적 AND를 사용하여 결합됩니다. 두 조건이 모두 true인 경우 결합된 조건의 결과가 true입니다.

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

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

    요청에 널 값이 지정된 prefix 파라미터가 포함되어 있는 경우 식이 true가 되므로 전체 Condition이 true가 됩니다. prefix 파라미터의 값으로 빈 문자열을 허용해야 합니다. 이전 논의에서 살펴보았듯이 널 문자열을 허용하면 Alice가 루트 수준 버킷 항목을 검색할 수 있습니다. 이는 이전 논의에서 콘솔과 마찬가지입니다. 자세한 내용은 4.2단계: 사용자가 버킷의 루트 수준 콘텐츠를 나열할 수 있도록 허용을 참조하십시오.

  • StringNotLike 조건식은 prefix 파라미터의 값이 지정되었는데 Development/*가 아닌 경우 요청이 실패하게 만듭니다.

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

다음 정책을 [Policy Document] 필드에 복사해 넣어 기존 정책을 대체합니다.

Copy
{ "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 폴더에 대한 권한을 부여하려고 합니다. 앞서 사용한 단계를 따라 Bob에게 권한을 부여하되 Development 폴더를 Finance 폴더로 대체합니다. 단계별 지침은 5단계: IAM 사용자인 Alice에게 특정 권한 부여를 참조하십시오.

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

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

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

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

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

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

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

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

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

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

    Copy
    { "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/"]} } } ] }

정리

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

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

관련 리소스