

# Amazon S3의 ID 기반 정책
<a name="security_iam_id-based-policy-examples"></a>

기본적으로 사용자 및 역할은 Amazon S3 리소스를 생성하거나 수정할 수 있는 권한이 없습니다. 사용자에게 사용자가 필요한 리소스에서 작업을 수행할 권한을 부여하려면 IAM 관리자가 IAM 정책을 생성하면 됩니다.

이러한 예제 JSON 정책 문서를 사용하여 IAM ID 기반 정책을 생성하는 방법을 알아보려면 *IAM 사용 설명서*의 [IAM 정책 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)을 참조하세요.

각 리소스 유형에 대한 ARN 형식을 포함하여 Amazon S3에서 정의한 작업 및 리소스 유형에 대한 자세한 내용은 서비스 권한 부여 참조**의 [Amazon S3의 작업, 리소스 및 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html)를 참조하세요.

S3 리소스 유형별 S3 API 작업 권한에 대한 자세한 내용은 [Amazon S3 API 작업에 필요한 권한](using-with-s3-policy-actions.md) 섹션을 참조하세요.

**Topics**
+ [정책 모범 사례](#security_iam_service-with-iam-policy-best-practices)
+ [사용자 정책을 사용하여 버킷에 대한 액세스 제어](walkthrough1.md)
+ [Amazon S3의 ID 기반 정책 예시](example-policies-s3.md)

## 정책 모범 사례
<a name="security_iam_service-with-iam-policy-best-practices"></a>

ID 기반 정책에 따라 해당 계정에서 누가 Amazon S3 리소스를 생성, 액세스 또는 삭제할 수 있는지 결정됩니다. 이 작업으로 인해 AWS 계정에 비용이 발생할 수 있습니다. ID 기반 정책을 생성하거나 편집할 때는 다음 지침과 권장 사항을 따르세요.
+ **AWS 관리형 정책으로 시작하고 최소 권한을 향해 나아가기** - 사용자 및 워크로드에 권한 부여를 시작하려면 많은 일반 사용 사례에 대한 권한을 부여하는 *AWS관리형 정책*을 사용합니다. AWS 계정에서 사용할 수 있습니다. 사용 사례에 고유한 AWS고객 관리형 정책을 정의하여 권한을 줄이는 것이 좋습니다. 자세한 내용은 *IAM 사용 설명서*의 [AWS 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies) 또는 [AWS직무에 대한 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)을 참조하세요.
+ **최소 권한 적용** – IAM 정책을 사용하여 권한을 설정하는 경우, 작업을 수행하는 데 필요한 권한만 부여합니다. 이렇게 하려면 *최소 권한*으로 알려진 특정 조건에서 특정 리소스에 대해 수행할 수 있는 작업을 정의합니다. IAM을 사용하여 권한을 적용하는 방법에 대한 자세한 정보는 *IAM 사용 설명서*에 있는 [IAM의 정책 및 권한](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)을 참조하세요.
+ **IAM 정책의 조건을 사용하여 액세스 추가 제한** – 정책에 조건을 추가하여 작업 및 리소스에 대한 액세스를 제한할 수 있습니다. 예를 들어, SSL을 사용하여 모든 요청을 전송해야 한다고 지정하는 정책 조건을 작성할 수 있습니다. CloudFormation와 같이, 특정 AWS 서비스를 통해 사용되는 경우에만 서비스 작업에 대한 액세스 권한을 부여할 수도 있습니다. 자세한 내용은 *IAM 사용자 설명서*의 [IAM JSON 정책 요소: 조건](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)을 참조하세요.
+ **IAM Access Analyzer를 통해 IAM 정책을 확인하여 안전하고 기능적인 권한 보장** - IAM Access Analyzer에서는 IAM 정책 언어(JSON)와 모범 사례가 정책에서 준수되도록 새로운 및 기존 정책을 확인합니다. IAM Access Analyzer는 100개 이상의 정책 확인 항목과 실행 가능한 추천을 제공하여 안전하고 기능적인 정책을 작성하도록 돕습니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM Access Analyzer에서 정책 검증](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)을 참조하세요.
+ **다중 인증(MFA) 필요** – AWS 계정에 IAM 사용자 또는 루트 사용자가 필요한 시나리오가 있는 경우, 추가 보안을 위해 MFA를 설정합니다. API 작업을 직접적으로 호출할 때 MFA가 필요하면 정책에 MFA 조건을 추가합니다. 자세한 내용은 *IAM 사용 설명서*의 [MFA를 통한 보안 API 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)를 참조하세요.

IAM의 모범 사례에 대한 자세한 내용은 *IAM 사용 설명서*의 [IAM의 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

# 사용자 정책을 사용하여 버킷에 대한 액세스 제어
<a name="walkthrough1"></a>

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

**Topics**
+ [버킷 및 폴더 기본 사항](#walkthrough-background1)
+ [연습 요약](#walkthrough-scenario)
+ [연습 준비](#walkthrough-what-you-need)
+ [1단계: 버킷 만들기](#walkthrough1-create-bucket)
+ [2단계: IAM 사용자 및 그룹 만들기](#walkthrough1-add-users)
+ [3단계: IAM 사용자에게 권한이 없는지 확인](#walkthrough1-verify-no-user-permissions)
+ [4단계: 그룹 수준 권한 부여](#walkthrough-group-policy)
+ [5단계: IAM 사용자인 Alice에게 특정 권한 부여](#walkthrough-grant-user1-permissions)
+ [6단계: IAM 사용자인 Bob에게 특정 권한 부여](#walkthrough1-grant-permissions-step5)
+ [7단계: Private 폴더에 보안 지정](#walkthrough-secure-private-folder-explicit-deny)
+ [8단계: 정리](#walkthrough-cleanup)
+ [관련 리소스](#RelatedResources-walkthrough1)

## 버킷 및 폴더 기본 사항
<a name="walkthrough-background1"></a>

Amazon S3 데이터 모델은 단순한 구조를 가지고 있습니다. 사용자가 버킷을 만들면 이 버킷에 객체가 저장됩니다. 하위 버킷 또는 하위 폴더의 계층 구조는 없지만, 폴더 계층 구조를 에뮬레이션할 수 있습니다. Amazon S3 콘솔과 같은 도구는 버킷에 있는 이러한 논리적 폴더와 하위 폴더의 보기를 표시할 수 있습니다.

콘솔에는 `companybucket`이라는 버킷에 세 개의 폴더 `Private`, `Development` 및 `Finance`와 하나의 객체 `s3-dg.pdf`가 있다는 것이 표시됩니다. 콘솔에서는 객체 이름(키)을 사용하여 폴더 및 하위 폴더로 이루어진 논리적 계층 구조를 만듭니다. 다음 예제를 고려하십시오.
+ `Development` 폴더를 만들면 콘솔에서 `Development/`라는 키를 사용하여 객체가 생성됩니다. 후행 슬래시(`/`) 구분 기호에 주의합니다.
+ `Projects1.xls`라는 객체를 `Development` 폴더에 업로드하면 콘솔에서 객체가 업로드되고 객체에 키 `Development/Projects1.xls`가 제공됩니다.

  키에서 `Development`는 [접두사](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#keyprefix)이고 `/`는 구분 기호입니다. Amazon S3 API 작업에서는 접두사와 구분 기호가 지원됩니다. 예를 들어, 특정 접두사와 구분 기호를 사용하여 버킷에서 모든 객체의 목록을 가져올 수 있습니다. 콘솔에서 `Development` 폴더를 열면 콘솔에 해당 폴더 안에 있는 객체가 나열됩니다. 다음 예제에서는 `Development` 폴더에 객체 하나가 포함되어 있습니다.

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

콘솔은 객체 키를 사용하여 논리적 계층 구조를 추론하고 있습니다. Amazon S3에는 물리적 계층 구조가 없습니다. 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`에는 접두사가 없으므로 이 키는 루트 수준 항목으로 나타납니다.



## 연습 요약
<a name="walkthrough-scenario"></a>

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

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

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

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

## 연습 준비
<a name="walkthrough-what-you-need"></a>

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

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

IAM에 대한 자세한 내용은 *IAM 사용 설명서*의 [AWS Management Console 로그인 페이지](https://docs.aws.amazon.com/IAM/latest/UserGuide/console.html)를 참조하십시오.

### IAM 사용자를 위한 로그인 링크 제공
<a name="walkthrough-sign-in-user-credentials"></a>

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

1. **탐색(Navigation)** 창에서 **IAM 대시보드(IAM Dashboard)**를 선택합니다.

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

## 1단계: 버킷 만들기
<a name="walkthrough1-create-bucket"></a>

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

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

1. 버킷을 만듭니다.

   단계별 지침은 [범용 버킷 생성](create-bucket-overview.md) 섹션을 참조하세요.

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

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

1. `Private`, `Finance` 및 `Development`라는 세 개의 폴더를 버킷에 추가합니다.

   폴더 생성에 대한 단계별 지침은 *Amazon Simple Storage Service 사용 설명서*의 [Amazon S3 콘솔에서 폴더를 사용하여 객체 구성](using-folders.md)>을(를) 참조하십시오.

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

   이 연습에서는 문서 몇 개를 각 폴더에 업로드했으며 결과적으로 버킷에 다음 키를 사용하는 객체가 있다고 가정합니다.
   + `Private/privDoc1.txt`
   + `Private/privDoc2.zip`
   + `Development/project1.xls`
   + `Development/project2.xls`
   + `Finance/Tax2011/document1.pdf`
   + `Finance/Tax2011/document2.pdf`
   + `s3-dg.pdf`

   

   단계별 지침은 [객체 업로드](upload-objects.md) 섹션을 참조하세요.

## 2단계: IAM 사용자 및 그룹 만들기
<a name="walkthrough1-add-users"></a>

이제 [IAM 콘솔](https://console.aws.amazon.com/iam/)을 사용하여 AWS 계정에 Alice와 Bob이라는 두 IAM 사용자를 추가합니다. 단계별 지침은 **IAM 사용 설명서의 [AWS 계정에서 IAM 사용자 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)을 참조하세요.

이름이 `Consultants`인 관리 그룹도 생성합니다. 그런 다음 두 사용자를 그룹에 추가합니다. 단계별 지침은 [IAM 사용자 그룹 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups_create.html)을 참조하세요.

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

새 IAM 사용자 만들기에 대한 단계별 지침은 IAM 사용 설명서**의 [AWS 계정에서 IAM 사용자 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)을 참조하세요. 이 시연에서 사용자를 생성할 때는 **AWS Management Console 액세스**를 선택하고 [프로그래밍 방식 액세스](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys) 선택을 취소하십시오.

관리자 그룹 만들기에 대한 단계별 지침은 *IAM 사용 설명서*의 [IAM 사용자와 관리자 그룹 처음 만들기](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html)를 참조하세요.



## 3단계: IAM 사용자에게 권한이 없는지 확인
<a name="walkthrough1-verify-no-user-permissions"></a>

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

1. IAM 사용자 로그인 링크([IAM 사용자를 위한 로그인 링크 제공](#walkthrough-sign-in-user-credentials) 참조)를 사용하여 IAM 사용자 자격 증명 중 하나로 AWS Management Console에 로그인합니다.

1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

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

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

## 4단계: 그룹 수준 권한 부여
<a name="walkthrough-group-policy"></a>

사용자가 다음을 수행할 수 있게 만들려고 합니다.
+ 상위 계정이 소유한 모든 버킷 나열 이렇게 하려면 Bob과 Alice에게 `s3:ListAllMyBuckets` 작업을 위한 권한이 있어야 합니다.
+ `companybucket` 버킷의 루트 수준 항목, 폴더 및 객체를 나열합니다. 이렇게 하려면 Bob과 Alice에게 `s3:ListBucket` 버킷에 `companybucket` 작업을 수행하기 위한 권한이 있어야 합니다.

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

### 4.1단계: 모든 버킷을 나열하는 권한 부여
<a name="walkthrough1-grant-permissions-step1"></a>

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

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.
**참고**  
사용자 권한을 부여하고 있으므로 IAM 사용자로 로그인하지 않고 AWS 계정 자격 증명을 사용하여 로그인합니다.

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

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

   1. [**JSON**] 탭을 선택합니다.

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

------
#### [ JSON ]

****  

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

   1. **Review policy(정책 검토)**를 선택합니다. 다음 페이지에서 **Name(이름)** 필드에 `AllowGroupToSeeBucketListInTheConsole`을 입력하고 **Create policy(정책 생성)**를 선택합니다.
**참고**  
**요약** 항목에 이 정책이 어떠한 권한도 부여하지 않는다고 알리는 메시지가 표시됩니다. 이 연습의 경우 이 메시지를 무시해도 됩니다.

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

   관리형 정책 연결에 대한 단계별 지침은 IAM 사용 설명서**의 [IAM 자격 증명 권한 추가 및 제거](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#attach-managed-policy-console)를 참조하세요.

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

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

   1. IAM 사용자 로그인 링크([IAM 사용자를 위한 로그인 링크 제공](#walkthrough-sign-in-user-credentials) 참조)를 사용하여 IAM 사용자 자격 증명 중 하나로 콘솔에 로그인합니다.

   1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

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

### 4.2단계: 사용자가 버킷의 루트 수준 콘텐츠를 나열할 수 있도록 허용
<a name="walkthrough1-grant-permissions-step2"></a>

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

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

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

버킷 이름을 선택하면 콘솔에서 [GET Bucket (List Objects)](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html) 요청을 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에서는 이러한 키를 그룹화하여 고유한 각 접두사 값인 `<CommonPrefixes>`, `Development/` 및 `Finance/`에 대해 `Private/` 요소를 반환합니다. 이는 해당 키의 시작 부분부터 지정된 `/` 구분 기호의 첫 번째 발생 지점까지의 범위에서 가져온 하위 문자열입니다.

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

Bob 또는 Alice가 **Development** 폴더를 열면 콘솔에서 `prefix` 및 `delimiter` 파라미터가 다음 값으로 설정된 [GET Bucket(List Objects)](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html) 요청이 Amazon S3로 전송됩니다.
+ 값 `prefix`가 있는 `Development/` 파라미터입니다.
+ “`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>
```

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

이제 루트 수준 버킷 항목을 나열할 수 있는 사용자 권한을 부여하는 작업으로 돌아갑니다. 버킷 콘텐츠를 나열하려면 다음 정책 설명에 나와 있듯이 사용자에게 `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](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETlocation.html) 요청을 전송하여 버킷이 배포되는 AWS 리전을 찾습니다. 그런 다음 콘솔은 버킷에 대한 리전별 엔드포인트를 사용하여 [GET Bucket (List Objects)](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html) 요청을 전송합니다. 결과적으로 사용자가 콘솔을 사용하려는 경우 다음 정책 설명과 같이 `s3:GetBucketLocation` 작업에 대한 권한을 부여해야 합니다.

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

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

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

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

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

   단계별 지침은 IAM 사용 설명서**의 [IAM 정책 편집](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-edit.html)을 참조하세요. 단계별 지침을 따를 때는 정책이 연결된 모든 보안 주체에 변경 사항을 적용하기 위한 단계를 따라야 합니다.

------
#### [ JSON ]

****  

   ```
   {
     "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":["/"]
                              }
                      }
        }
     ] 
   }
   ```

------

1. 업데이트된 권한을 테스트합니다.

   1. IAM 사용자 로그인 링크([IAM 사용자를 위한 로그인 링크 제공](#walkthrough-sign-in-user-credentials) 참조)를 사용하여 AWS Management Console에 로그인합니다.

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

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

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

### 4.3단계: 그룹 정책 요약
<a name="walkthrough-group-policy-summary"></a>

추가한 그룹 정책의 순 효과는 IAM 사용자인 Alice와 Bob에게 다음과 같은 최소한의 권한을 부여하는 것입니다.
+ 상위 계정이 소유한 모든 버킷 나열
+ `companybucket` 버킷의 루트 수준 항목 확인 

하지만 사용자는 여전히 많은 작업을 수행할 수 없습니다. 다음에는 아래와 같이 사용자별 권한을 부여합니다.
+ Alice가 객체를 가져와서 `Development` 폴더에 넣을 수 있도록 허용합니다.
+ Bob이 객체를 가져와서 `Finance` 폴더에 넣을 수 있도록 허용합니다.

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

## 5단계: IAM 사용자인 Alice에게 특정 권한 부여
<a name="walkthrough-grant-user1-permissions"></a>

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

### 5.1단계: IAM 사용자인 Alice에게 Development 폴더 콘텐츠 나열 권한 부여
<a name="walkthrough-grant-user1-permissions-listbucket"></a>

Alice가 `Development` 폴더 콘텐츠를 나열하려면 요청에 접두사 `Development/`가 포함되는 경우 `companybucket` 버킷의 `s3:ListBucket` 작업에 대한 권한을 부여하는 정책을 Alice 사용자에게 적용해야 합니다. 이 정책을 사용자 Alice에게만 적용하려고 하므로 인라인 정책을 사용합니다. 인라인 정책에 대한 자세한 내용은 *IAM 사용 설명서*에서 [관리형 정책과 인라인 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html) 단원을 참조하세요.

1. AWS Management Console에 로그인하여 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

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

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

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

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

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

   1. [**JSON**] 탭을 선택합니다.

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

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	   
          "Statement": [
          {
            "Sid": "AllowListBucketIfSpecificPrefixIsIncludedInRequest",
            "Action": ["s3:ListBucket"],
            "Effect": "Allow",
            "Resource": ["arn:aws:s3:::companybucket"],
            "Condition": { "StringLike": {"s3:prefix": ["Development/*"] }
             }
          }
        ]
      }
      ```

------

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

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

   1. IAM 사용자 로그인 링크([IAM 사용자를 위한 로그인 링크 제공](#walkthrough-sign-in-user-credentials) 참조)를 사용하여 AWS Management Console에 로그인합니다.

   1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

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

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

### 5.2단계: IAM 사용자인 Alice에게 객체를 가져와 Development 폴더에 넣을 수 있는 권한 부여
<a name="walkthrough-grant-user1-permissions-get-put-object"></a>

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

```
{
    "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/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

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

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

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

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

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

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

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

------
#### [ JSON ]

****  

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

------

1. 업데이트된 정책을 테스트합니다.

   1. IAM 사용자 로그인 링크([IAM 사용자를 위한 로그인 링크 제공](#walkthrough-sign-in-user-credentials) 참조)를 사용하여 AWS Management Console에 로그인합니다.

   1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

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

### 5.3단계: 버킷의 다른 모든 폴더에 대한 IAM 사용자 Alice의 권한 명시적으로 거부
<a name="walkthrough-grant-user1-explicit-deny-other-access"></a>

이제 사용자 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입니다. 이 정책에서 `Effect`는 `Deny`이기 때문에 `Condition`이 ture로 평가되면 사용자는 지정된 `Action`을 수행할 수 없습니다.
+ `Null` 조건식은 Alice가 보내는 요청에 `prefix` 파라미터가 포함되도록 합니다.

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

  요청에 널 값이 있는 `prefix` 파라미터가 포함되는 경우 식은 true로 평가되며 따라서 전체 `Condition`이 true로 평가됩니다. `prefix` 파라미터의 값으로 빈 문자열을 허용해야 합니다. 이전 논의에서 null 문자열을 허용하면 Alice가 앞의 논의에서 콘솔이 그랬던 것처럼 루트 수준 버킷 항목을 검색할 수 있습니다. 자세한 내용은 [4.2단계: 사용자가 버킷의 루트 수준 콘텐츠를 나열할 수 있도록 허용](#walkthrough1-grant-permissions-step2) 섹션을 참조하세요.
+ `StringNotLike` 조건식은 `prefix` 파라미터의 값이 지정되고 `Development/*`가 아닌 경우 요청이 실패하도록 합니다.

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

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

------
#### [ JSON ]

****  

```
{
   "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에게 특정 권한 부여
<a name="walkthrough1-grant-permissions-step5"></a>

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

## 7단계: Private 폴더에 보안 지정
<a name="walkthrough-secure-private-folder-explicit-deny"></a>

이 예제에서는 사용자가 두 명뿐입니다. 그룹 수준에서 필요한 모든 최소한의 권한을 부여하고 필요할 때만 사용자 수준 권한을 개별 사용자 수준에 있는 권한에 부여했습니다. 이 접근 방식을 취하면 권한 관리 작업을 최소화하는 데 도움이 됩니다. 사용자 수가 증가하면서 권한 관리 작업이 부담이 될 수 있습니다. 예를 들어, 이 예제의 어떤 사용자도 `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 Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 Amazon S3 콘솔을 엽니다.

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

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

   지침은 IAM 사용 설명서**의 [고객 관리형 정책 편집](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-edit.html#edit-managed-policy-console) 섹션을 참조하세요. 지침을 따를 때 정책이 연결된 모든 보안 주체에 변경 사항을 적용하는 작업에 대한 지시 사항을 반드시 따르십시오.

------
#### [ JSON ]

****  

   ```
   {
     "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단계: 정리
<a name="walkthrough-cleanup"></a>

정리하려면 [IAM 콘솔](https://console.aws.amazon.com/iam/)을 열고 사용자 Alice와 Bob을 제거합니다. 단계별 지침은 IAM 사용 설명서**의 [IAM 사용자 삭제](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_manage.html#id_users_deleting)를 참조하세요.

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

## 관련 리소스
<a name="RelatedResources-walkthrough1"></a>
+ *IAM 사용 설명서*의 [IAM 정책 관리](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage.html)

# Amazon S3의 ID 기반 정책 예시
<a name="example-policies-s3"></a>

이 섹션에서는 Amazon S3에 대한 액세스를 제어하는 몇 가지 예시 AWS Identity and Access Management(IAM) ID 기반 정책을 보여 줍니다. 예를 들어 *버킷 정책*(리소스 기반 정책)은 [Amazon S3의 버킷 정책](bucket-policies.md) 섹션을 참조하세요. IAM 정책 언어에 대한 정보는 [Amazon S3의 정책 및 권한](access-policy-language-overview.md) 섹션을 참조하십시오.

다음 정책 예제는 프로그래밍 방식으로 사용하는 경우 작동합니다. 그러나 Amazon S3 콘솔을 통해 정책을 사용하기 위해서는 콘솔에 필요한 추가 권한을 부여해야 합니다. Amazon S3 콘솔에서 이와 같은 정책을 사용하는 방법에 대한 자세한 내용은 [사용자 정책을 사용하여 버킷에 대한 액세스 제어](walkthrough1.md) 섹션을 참조하세요.

S3 리소스 유형별 S3 API 작업 권한에 대한 자세한 내용은 [Amazon S3 API 작업에 필요한 권한](using-with-s3-policy-actions.md) 섹션을 참조하세요.

**Topics**
+ [버킷 중 하나에 대한 IAM 사용자 액세스 허용](#iam-policy-ex0)
+ [버킷의 폴더에 대한 각 IAM 사용자의 액세스 허용](#iam-policy-ex1)
+ [Amazon S3에 공유 폴더를 보유할 수 있도록 그룹을 허용](#iam-policy-ex2)
+ [모든 사용자가 버킷의 일부로 객체를 읽을 수 있도록 허용](#iam-policy-ex3)
+ [파트너가 버킷의 특정 부분에 파일을 둘 수 있도록 허용](#iam-policy-ex4)
+ [특정 AWS 계정의 Amazon S3 버킷에 대한 액세스 제한](#iam-policy-ex6)
+ [조직 단위 내의 Amazon S3 버킷에 대한 액세스 제한](#iam-policy-ex7)
+ [조직 내의 Amazon S3 버킷에 대한 액세스 제한](#iam-policy-ex8)
+ [AWS 계정에 대한 PublicAccessBlock 구성을 검색할 수 있는 권한 부여](#using-with-s3-actions-related-to-accountss)
+ [버킷 생성을 한 리전으로 제한](#condition-key-bucket-ops-1)

## 버킷 중 하나에 대한 IAM 사용자 액세스 허용
<a name="iam-policy-ex0"></a>

이 예제에서는 AWS 계정의 IAM 사용자에게 버킷 중 하나인 *amzn-s3-demo-bucket1*에 대한 액세스 권한을 부여하고 이 사용자에게 객체를 추가, 업데이트, 삭제하도록 허용하려 합니다.

`s3:PutObject`, `s3:GetObject` 및 `s3:DeleteObject` 권한을 사용자에게 부여하는 것에 추가로, 이 정책에서는 `s3:ListAllMyBuckets`, `s3:GetBucketLocation` 및 `s3:ListBucket` 권한 역시 부여합니다. 이러한 권한은 콘솔에 필요한 추가 권한입니다. 또한 콘솔에서 객체를 복사, 자르기 및 붙여넣기를 할 수 있으려면 `s3:PutObjectAcl` 및 `s3:GetObjectAcl` 작업이 필요합니다. 콘솔을 사용하여 사용자에게 권한을 부여하고 테스트하는 방법에 대한 예는 [사용자 정책을 사용하여 버킷에 대한 액세스 제어](walkthrough1.md)을 참조하세요.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action": "s3:ListAllMyBuckets",
         "Resource":"*"
      },
      {
         "Effect":"Allow",
         "Action":["s3:ListBucket","s3:GetBucketLocation"],
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1"
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:PutObjectAcl",
            "s3:GetObject",
            "s3:GetObjectAcl",
            "s3:DeleteObject"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/*"
      }
   ]
}
```

------

## 버킷의 폴더에 대한 각 IAM 사용자의 액세스 허용
<a name="iam-policy-ex1"></a>

이 예제에서는 2명의 IAM 사용자인 Mary와 Carlos에게 *amzn-s3-demo-bucket1* 버킷에 대한 액세스 권한을 부여하여 이들이 객체를 추가, 업데이트, 삭제할 수 있게 하려고 합니다. 그러나 각 사용자의 액세스 권한을 버킷의 단일 접두사(폴더)로 제한하려 합니다. 사용자 이름과 일치하는 이름으로 폴더를 만들 수 있습니다.

```
amzn-s3-demo-bucket1
   Mary/
   Carlos/
```

각 사용자에게 각자의 폴더에 대해서만 액세스 권한을 부여하려면 각 사용자에 대한 정책을 작성하고 이를 개별적으로 연결하면 됩니다. 예를 들어, 다음 정책을 사용자 중 Mary에게 연결하여 `amzn-s3-demo-bucket1/Mary` 폴더에 대한 특정 Amazon S3 권한을 허용할 수 있습니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion",
            "s3:DeleteObject",
            "s3:DeleteObjectVersion"
         ],
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/Mary/*"
      }
   ]
}
```

------

그런 다음 사용자 Carlos에게 유사한 정책을 연결하여 `Resource` 값의 `Carlos` 폴더를 지정할 수 있습니다.

정책을 개별 사용자에게 연결하는 대신 정책 변수를 사용하는 단일 정책을 작성하여 이 정책을 그룹에 연결할 수도 있습니다. 우선 그룹을 하나 만들어 Mary와 Carlos을 모두 이 그룹에 추가합니다. 다음 정책 예제에서는 `amzn-s3-demo-bucket1/${aws:username}` 폴더의 Amazon S3 권한 집합을 허용합니다. 정책이 평가될 때 정책 변수 `${aws:username}`은 요청자의 사용자 이름으로 대체됩니다. 예를 들어, Mary가 요청을 보내 객체를 배치하는 경우 이 작업은 Mary가 객체를 `amzn-s3-demo-bucket1/Mary` 폴더에 업로드하는 경우에만 허용됩니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion",
            "s3:DeleteObject",
            "s3:DeleteObjectVersion"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/${aws:username}/*"
      }
   ]
}
```

------

**참고**  
정책 변수를 사용하는 경우 정책에 명시적으로 버전 `2012-10-17`을 지정해야 합니다. IAM 정책 언어의 기본 버전인 2008-10-17은 정책 변수를 지원하지 않습니다.

 앞서 다룬 정책을 Amazon S3 콘솔에서 테스트하려는 경우 콘솔에서는 다음 정책에서와 같이 추가 권한을 요구합니다. 콘솔에서 이와 같은 정책을 사용하는 방법에 대한 자세한 내용은 [사용자 정책을 사용하여 버킷에 대한 액세스 제어](walkthrough1.md) 섹션을 참조하세요.

------
#### [ JSON ]

****  

```
{
 "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowGroupToSeeBucketListInTheConsole",
      "Action": [ 
      	"s3:ListAllMyBuckets", 
      	"s3:GetBucketLocation" 
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::*"  
    },
    {
      "Sid": "AllowRootLevelListingOfTheBucket",
      "Action": "s3:ListBucket",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1",
      "Condition": { 
            "StringEquals": {
                    "s3:prefix": [""], "s3:delimiter": ["/"]
                           }
                 }
    },
    {
      "Sid": "AllowListBucketOfASpecificUserPrefix",
      "Action": "s3:ListBucket",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1",
      "Condition": {  "StringLike": {"s3:prefix": ["${aws:username}/*"] }
       }
    },
      {
     "Sid": "AllowUserSpecificActionsOnlyInTheSpecificUserPrefix",
         "Effect": "Allow",
         "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion",
            "s3:DeleteObject",
            "s3:DeleteObjectVersion"
         ],
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/${aws:username}/*"
      }
  ]
}
```

------

**참고**  
2012-10-17 버전의 정책에서, 정책 변수는 `$`로 시작합니다. 이러한 구문상의 변경은 객체 키(객체 이름)에 `$`가 포함된 경우 잠재적으로 충돌을 야기할 수 있습니다.  
이 충돌을 방지하려면 `${$}` 기호를 사용하여 `$` 문자를 지정하십시오. 예를 들어, 객체 키 `my$file`을 정책에 포함하려면 `my${$}file`로 지정하면 됩니다.

IAM 사용자 이름은 익숙하고 읽기 쉬운 식별자여야 하되, 고유한 전역 이름일 필요는 없습니다. 예를 들어, Carlos라는 사용자가 조직을 떠난 후 또 다른 Carlos가 조직에 합류하는 경우 새로 온 Carlos는 이전 Carlos의 정보에 액세스할 수도 있습니다.

사용자 이름을 이용하는 대신 IAM 사용자 ID를 기반으로 한 폴더를 만들 수 있습니다. 각 IAM 사용자 ID는 고유합니다. 이 경우, `${aws:userid}` 정책 변수를 사용하여 앞서 다룬 정책을 수정해야 합니다. 사용자 ID에 대한 자세한 내용은 *IAM 사용 설명서*의 [IAM 식별자](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html) 섹션을 참조하세요.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion",
            "s3:DeleteObject",
            "s3:DeleteObjectVersion"
         ],
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/home/${aws:userid}/*"
      }
   ]
}
```

------

### 버킷의 폴더에 대한 비 IAM 사용자(모바일 앱 사용자)의 액세스 허용
<a name="non-iam-mobile-app-user-access"></a>

S3 버킷에 사용자 데이터를 저장하는 모바일 게임 앱을 개발하려 한다고 가정합니다. 각 앱 사용자에 대해 버킷에 폴더를 만들려고 합니다. 또한 각 사용자의 액세스 권한을 각자의 폴더로 제한하려고 하는데, 누군가 앱을 다운로드하여 게임 플레이를 시작하기 전에는 사용자 ID가 없으므로 폴더를 만들 수 없습니다.

이 경우 사용자에게 Login with Amazon, Facebook 또는 Google과 같은 퍼블릭 ID 공급자를 사용하여 앱에 로그인하도록 요구할 수 있습니다. 사용자가 이들 공급자 중 하나를 통해 앱에 로그인한 후에는 런타임 시 사용자별 폴더 생성에 사용할 수 있는 사용자 ID를 갖게 됩니다.

그런 뒤 AWS Security Token Service의 웹 자격 증명 연동을 사용하여 ID 공급자에게 받은 정보를 앱과 통합하고 각 사용자에 대한 임시 보안 자격 증명을 얻을 수 있습니다. 그런 뒤에는 앱에서 버킷에 액세스할 수 있도록 허용하고 사용자별 폴더를 만들고 데이터를 업로드하는 등의 작업을 수행하는 IAM 정책을 만들 수 있습니다. 웹 아이덴티티 페더레이션에 대한 자세한 내용은 *IAM 사용 설명서*의 [웹 아이덴티티 페더레이션 정보](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html)를 참조하십시오.

## Amazon S3에 공유 폴더를 보유할 수 있도록 그룹을 허용
<a name="iam-policy-ex2"></a>

다음 정책을 그룹에 연결하면 그룹 내 모두에게 Amazon S3의 `amzn-s3-demo-bucket1/share/marketing` 폴더에 대한 액세스 권한이 부여됩니다. 그룹 멤버는 정책에 나와 있는 특정 Amazon S3 권한과 지정된 폴더의 객체에 대해서만 액세스할 수 있도록 허용됩니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion",
            "s3:DeleteObject",
            "s3:DeleteObjectVersion"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/share/marketing/*"
      }
   ]
}
```

------

## 모든 사용자가 버킷의 일부로 객체를 읽을 수 있도록 허용
<a name="iam-policy-ex3"></a>

이 예제에서는 AWS 계정에서 소유한 전체 IAM 사용자를 포함하는 `AllUsers`라는 그룹을 만듭니다. 그런 뒤 그룹에 `GetObject` 및 `GetObjectVersion`에 대해서만 `amzn-s3-demo-bucket1/readonly` 폴더의 객체에 대한 액세스 권한을 부여하는 정책을 연결합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetObject",
            "s3:GetObjectVersion"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/readonly/*"
      }
   ]
}
```

------

## 파트너가 버킷의 특정 부분에 파일을 둘 수 있도록 허용
<a name="iam-policy-ex4"></a>

이 예제에서는 파트너사를 나타내는 `AnyCompany`라는 그룹을 만듭니다. 파트너사에서 액세스 권한을 필요로 하는 사람이나 애플리케이션을 위해 IAM 사용자를 만든 다음 그 사용자를 그룹에 넣습니다.

그런 뒤 그룹에 버킷의 다음 폴더에 대한 `PutObject` 액세스 권한을 부여하는 정책을 연결합니다.

`amzn-s3-demo-bucket1/uploads/anycompany` 

`AnyCompany` 그룹이 버킷을 사용하여 다른 작업을 수행하지 못하도록 하려면 AWS 계정의 Amazon S3 리소스에 대한 `PutObject`를 제외하고 모든 Amazon S3 작업에 대한 권한을 명시적으로 거부하는 문을 추가하면 됩니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":"s3:PutObject",
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/uploads/anycompany/*"
      },
      {
         "Effect":"Deny",
         "Action":"s3:*",
         "NotResource":"arn:aws:s3:::amzn-s3-demo-bucket1/uploads/anycompany/*"
      }
   ]
}
```

------

## 특정 AWS 계정의 Amazon S3 버킷에 대한 액세스 제한
<a name="iam-policy-ex6"></a>

Amazon S3 보안 주체가 신뢰할 수 있는 AWS 계정 내에 있는 리소스에만 액세스하고 있는지 확인하려면 액세스를 제한하면 됩니다. 예를 들어, 이 [자격 증명 기반 IAM 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)에서는 액세스 중인 Amazon S3 리소스가 `222222222222` 계정에 있지 않으면 `Deny` 효과를 사용하여 Amazon S3 작업에 대한 액세스를 차단합니다. AWS 계정의 IAM 보안 주체가 계정 외부의 Amazon S3 객체에 액세스하지 못하게 하려면 다음 IAM 정책을 연결하십시오.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyS3AccessOutsideMyBoundary",
      "Effect": "Deny",
      "Action": [
        "s3:*"
      ],
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:ResourceAccount": [
            "222222222222"
          ]
        }
      }
    }
  ]
}
```

------

**참고**  
이 정책은 액세스 권한을 부여하지 않으므로 기존 IAM 액세스 제어를 대체하지 않습니다. 대신 이 정책은 다른 IAM 정책을 통해 부여된 권한에 관계없이 다른 IAM 권한에 대한 추가 가드레일 역할을 합니다.

정책의 `222222222222` 계정 ID를 본인의 AWS 계정로 대체해야 합니다. 이 제한을 유지하면서 여러 계정에 정책을 적용하려면 계정 ID를 `aws:PrincipalAccount` 조건 키로 바꾸면 됩니다. 이 조건에서는 보안 주체와 리소스가 동일한 계정에 있어야 합니다.

## 조직 단위 내의 Amazon S3 버킷에 대한 액세스 제한
<a name="iam-policy-ex7"></a>

[조직 단위(OU)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_ous.html)를 AWS Organizations에 설정한 경우 조직의 특정 부분으로 Amazon S3 버킷 액세스를 제한할 수 있습니다. 이 예제에서는 `aws:ResourceOrgPaths` 키를 사용하여 조직의 OU로 Amazon S3 버킷 액세스를 제한합니다. 이 예제에서 [OU ID](https://docs.aws.amazon.com/organizations/latest/APIReference/API_OrganizationalUnit.html)는 `ou-acroot-exampleou`입니다. 자체 정책에서 이 값을 자체 OU ID로 바꿔야 합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
     {
       "Sid": "AllowS3AccessOutsideMyBoundary",
       "Effect": "Allow",
       "Action": [
         "s3:*"
       ],
       "Resource": "*",
       "Condition": {
         "ForAllValues:StringLike": {
           "aws:ResourceOrgPaths": [
             "o-acorg/r-acroot/ou-acroot-exampleou/"
           ] 
         }
       }
     }
   ]
 }
```

------

**참고**  
이 정책은 어떤 액세스 권한도 부여하지 않습니다. 대신 이 정책은 다른 IAM 권한에 대한 백스톱 역할을 하므로, 보안 주체가 OU 정의 경계 외부의 Amazon S3 객체에 액세스할 수 없습니다.

액세스 중인 Amazon S3 객체가 조직의 `ou-acroot-exampleou` OU에 없는 한 정책은 Amazon S3 작업에 대한 액세스를 거부합니다. [IAM 정책 조건](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)은 나열된 OU 경로를 포함하는 데 다중 값 조건 키인 `aws:ResourceOrgPaths`를 필요로 합니다. 이 정책은 `ForAllValues:StringNotLike` 연산자를 사용하여 대소문자를 구분하지 않고 `aws:ResourceOrgPaths`의 값을 나열된 OU와 비교합니다.

## 조직 내의 Amazon S3 버킷에 대한 액세스 제한
<a name="iam-policy-ex8"></a>

조직 내의 Amazon S3 객체에 대한 액세스를 제한하려면 IAM 정책을 조직의 루트에 연결하여 조직의 모든 계정에 적용합니다. IAM 보안 주체가 이 규칙을 따르도록 요구하려면 [서비스 제어 정책(SCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)을 사용하면 됩니다. SCP를 사용하기로 선택한 경우 조직 루트에 정책을 연결하기 전에 [SCP를 철저히 테스트](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html#scp-warning-testing-effect)해야 합니다.

다음 예제 정책에서 액세스 중인 Amazon S3 객체가 액세스 중인 IAM 보안 주체와 동일한 조직에 있지 않으면 Amazon S3 작업에 대한 액세스가 거부됩니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
     {
       "Sid": "DenyS3AccessOutsideMyBoundary",
       "Effect": "Deny",
       "Action": [
         "s3:*"
       ],
       "Resource": "arn:aws:s3:::*/*",
       "Condition": {
         "StringNotEquals": {
           "aws:ResourceOrgID": "${aws:PrincipalOrgID}"
         }
       }
     }
   ]
 }
```

------

**참고**  
이 정책은 어떤 액세스 권한도 부여하지 않습니다. 대신 이 정책은 다른 IAM 권한에 대한 백스톱 역할을 하므로, 보안 주체가 조직 외부의 모든 Amazon S3 객체에 액세스할 수 없습니다. 이 정책은 정책이 적용된 후에 생성된 Amazon S3 리소스에도 적용됩니다.

이 예제의 [IAM 정책 조건](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)에서는 서로 동일해지려면 `aws:ResourceOrgID` 및 `aws:PrincipalOrgID`를 필요로 합니다. 이 요구 사항에서는 요청을 수행하는 보안 주체와 액세스 중인 리소스가 동일한 조직에 있어야 합니다.

## AWS 계정에 대한 PublicAccessBlock 구성을 검색할 수 있는 권한 부여
<a name="using-with-s3-actions-related-to-accountss"></a>

다음 ID 기반 정책 예시에서는 사용자에게 `s3:GetAccountPublicAccessBlock` 권한을 부여합니다. 이러한 권한에 대해 `Resource` 값을 `"*"`로 설정합니다. 리소스 ARN에 대한 자세한 내용은 [Amazon S3의 정책 리소스](security_iam_service-with-iam.md#security_iam_service-with-iam-id-based-policies-resources) 섹션을 참조하세요.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"statement1",
         "Effect":"Allow",
         "Action":[
            "s3:GetAccountPublicAccessBlock" 
         ],
         "Resource":[
            "*"
         ]
       }
    ]
}
```

------

## 버킷 생성을 한 리전으로 제한
<a name="condition-key-bucket-ops-1"></a>

AWS 계정 관리자가 해당 계정 사용자(Dave)에게 남아메리카(상파울루) 리전에서만 버킷을 생성하는 권한을 부여하려 한다고 가정합니다. 계정 관리자는 다음과 같은 조건으로 `s3:CreateBucket` 권한을 부여하는 다음 사용자 정책을 연결할 수 있습니다. `Condition` 블록의 키-값 페어는 `s3:LocationConstraint` 조건 키와 `sa-east-1` 리전을 해당 값으로 지정합니다.

**참고**  
이 예제에서 버킷 소유자는 해당 사용자 중 하나에게 권한을 부여하려 하므로 버킷 정책 또는 사용자 정책 중 하나를 사용할 수 있습니다. 이 예제는 사용자 정책을 나타냅니다.

Amazon S3 리전 목록은 **AWS 일반 참조의 [리전 및 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/s3.html)를 참조하십시오.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Sid": "statement1",
         "Effect": "Allow",
         "Action": "s3:CreateBucket",
         "Resource": "arn:aws:s3:::*",
         "Condition": {
             "StringLike": {
                 "s3:LocationConstraint": "sa-east-1"
             }
         }
       }
    ]
}
```

------

**명시적 거부 추가**  
앞의 정책은 `sa-east-1`을 제외한 다른 리전에서 버킷을 생성하지 못하도록 사용자를 제한합니다. 그러나 일부 다른 정책에서는 이 사용자에게 다른 리전에서 버킷을 생성할 수 있는 권한을 부여할 수 있습니다. 예를 들어 사용자가 그룹에 속한 경우 그룹 내 전체 사용자에게 다른 리전에서 버킷을 생성할 수 있는 권한을 허용하는 정책이 이 그룹에 연결되어 있을 수 있습니다. 사용자가 다른 리전에서 버킷을 생성할 수 있는 권한을 갖지 못하게 하려면 위 정책에 명시적 거부 문을 추가할 수 있습니다.

`Deny` 문은 `StringNotLike` 조건을 사용합니다. 즉, 버킷 생성 요청은 위치 제한이 `sa-east-1`이 아닌 경우 거부됩니다. 명시적 거부는 사용자가 다른 어떤 권한을 갖고 있더라도 사용자가 다른 리전에서 버킷을 생성하는 것을 허용하지 않습니다. 다음 정책에는 명시적 거부 문이 포함되어 있습니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"statement1",
         "Effect":"Allow",
         "Action": "s3:CreateBucket",
         "Resource": "arn:aws:s3:::*",
         "Condition": {
             "StringLike": {
                 "s3:LocationConstraint": "sa-east-1"
             }
         }
       },
      {
         "Sid":"statement2",
         "Effect":"Deny",
         "Action": "s3:CreateBucket",
         "Resource": "arn:aws:s3:::*",
         "Condition": {
             "StringNotLike": {
                 "s3:LocationConstraint": "sa-east-1"
             }
         }
       }
    ]
}
```

------

**AWS CLI에서 정책 테스트**  
다음 `create-bucket` AWS CLI 명령을 사용하는 정책을 테스트할 수 있습니다. 이 예제에서는 `bucketconfig.txt` 파일을 사용하여 위치 제한을 지정합니다. Windows 파일 경로를 확인하세요. 버킷 이름과 경로를 적절히 업데이트해야 합니다. `--profile` 파라미터를 사용하여 사용자 자격 증명을 제공해야 합니다. AWS CLI 사용 및 설정에 대한 자세한 내용은 **Amazon S3 API 참조의 [AWS CLI를 사용하여 Amazon S3에서 개발](https://docs.aws.amazon.com/AmazonS3/latest/API/setup-aws-cli.html)을 참조하세요.

```
aws s3api create-bucket --bucket examplebucket --profile AccountADave --create-bucket-configuration file://c:/Users/someUser/bucketconfig.txt
```

`bucketconfig.txt` 파일은 다음과 같은 구성을 지정합니다.

```
{"LocationConstraint": "sa-east-1"}
```