

# Amazon Athena 보안
<a name="security"></a>

AWS은 클라우드 보안을 가장 중요하게 생각합니다. AWS 고객으로서 여러분은 가장 높은 보안 요구 사항을 충족하기 위해 설계된 데이터 센터 및 네트워크 아키텍처의 혜택을 받게 됩니다.

보안은 AWS과 사용자의 공동 책임입니다. [공동 책임 모델](https://aws.amazon.com/compliance/shared-responsibility-model/)은 이를 클라우드*의* 보안과 클라우드 *내* 보안으로 설명합니다.
+ **클라우드의 보안** - AWS는 AWS 서비스 클라우드에서 AWS를 실행하는 인프라를 보호합니다. AWS는 또한 안전하게 사용할 수 있는 서비스를 제공합니다. 서드 파티 감사자는 정기적으로 [AWS 규정 준수 프로그램](https://aws.amazon.com/compliance/programs/)의 일환으로 보안 효과를 테스트하고 검증합니다. Athena에 적용되는 규정 준수 프로그램에 대한 자세한 내용은 [규정 준수 프로그램 제공 범위 내의 AWS 서비스](https://aws.amazon.com/compliance/services-in-scope/)를 참조하세요.
+ **클라우드 내 보안** – 귀하의 책임은 귀하가 사용하는 AWS 서비스로 결정됩니다. 또한 데이터의 민감도, 조직의 요구 사항, 관련 법률 및 규정을 비롯한 기타 요소에 대해서도 책임이 있습니다.

이 설명서는 Amazon Athena 사용 시 공동 책임 모델을 적용하는 방법을 이해하는 데 도움이 됩니다. 다음 항목에서는 보안 및 규정 준수 목표를 충족하도록 Athena를 구성하는 방법을 보여줍니다. 또한 Athena 리소스를 모니터링하고 보호하는 데 도움이 되는 다른 AWS 서비스를 사용하는 방법에 대해 알아봅니다.

**Topics**
+ [

# Athena의 데이터 보호
](security-data-protection.md)
+ [

# Athena의 자격 증명 및 액세스 관리
](security-iam-athena.md)
+ [

# Athena 로깅 및 모니터링
](security-logging-monitoring.md)
+ [

# 규정 준수 확인
](security-compliance-validation.md)
+ [

# Athena의 복원성
](security-resilience.md)
+ [

# Athena의 인프라 보안
](security-infrastructure.md)
+ [

# Athena의 구성 및 취약성 분석
](security-vulnerability-management.md)
+ [

# Athena를 사용하여 AWS Lake Formation에 등록된 데이터 쿼리
](security-athena-lake-formation.md)

# Athena의 데이터 보호
<a name="security-data-protection"></a>

AWS [공동 책임 모델](https://aws.amazon.com/compliance/shared-responsibility-model/)은 데이터 보호에 적용됩니다. 이 모델에서 설명하는 것처럼 AWS는 모든 AWS 클라우드를 실행하는 글로벌 인프라를 보호할 책임이 있습니다. 사용자는 이 인프라에 호스팅되는 콘텐츠에 대한 통제 권한을 유지할 책임이 있습니다. 사용하는 AWS 서비스의 보안 구성과 관리 태스크에 대한 책임도 사용자에게 있습니다. 데이터 프라이버시에 관한 자세한 내용은 [데이터 프라이버시 FAQ](https://aws.amazon.com/compliance/data-privacy-faq/)를 참조하세요. 유럽의 데이터 보호에 대한 자세한 내용은 *AWS보안 블로그*의 [AWS공동 책임 모델 및 GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 블로그 게시물을 참조하세요.

데이터를 보호하려면 AWS 계정자격 증명을 보호하고 AWS IAM Identity Center또는 AWS Identity and Access Management(IAM)를 통해 개별 사용자 계정을 설정하는 것이 좋습니다. 이렇게 하면 개별 사용자에게 자신의 직무를 충실히 이행하는 데 필요한 권한만 부여됩니다. 또한 다음과 같은 방법으로 데이터를 보호하는 것이 좋습니다.
+ 각 계정에 다중 인증(MFA)을 사용합니다.
+ SSL/TLS를 사용하여 AWS리소스와 통신하세요. TLS 1.2는 필수이며 TLS 1.3을 권장합니다.
+ AWS CloudTrail으로 API 및 사용자 활동 로깅을 설정하세요. AWS 활동 캡처에 CloudTrail 추적을 사용하는 방법에 대한 자세한 내용은 *AWS CloudTrail사용 설명서*의 [CloudTrail 추적 작업](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-trails.html)을 참조하세요.
+ AWS 암호화 솔루션을 AWS 서비스내의 모든 기본 보안 컨트롤과 함께 사용하세요.
+ Amazon S3에 저장된 민감한 데이터를 검색하고 보호하는 데 도움이 되는 Amazon Macie와 같은 고급 관리형 보안 서비스를 사용합니다.
+ 명령줄 인터페이스 또는 API를 통해 AWS에 액세스할 때 FIPS 140-3 검증된 암호화 모듈이 필요한 경우, FIPS 엔드포인트를 사용합니다. 사용 가능한 FIPS 엔드포인트에 대한 자세한 내용은 [연방 정보 처리 표준(FIPS) 140-3](https://aws.amazon.com/compliance/fips/)을 참조하세요.

고객의 이메일 주소와 같은 기밀 정보나 중요한 정보는 태그나 **이름** 필드와 같은 자유 형식 텍스트 필드에 입력하지 않는 것이 좋습니다. 여기에는 콘솔, API, AWS CLI 또는 AWS SDK를 사용하여 또는 다른 AWS 서비스로 작업하는 경우가 포함됩니다. 이름에 사용되는 태그 또는 자유 형식 텍스트 필드에 입력하는 모든 데이터는 청구 또는 진단 로그에 사용될 수 있습니다. 외부 서버에 URL을 제공할 때 해당 서버에 대한 요청을 검증하기 위해 자격 증명을 URL에 포함해서는 안 됩니다.

추가 보안 단계로 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia) 전역 조건 컨텍스트 키를 사용하여 Athena에서 보낸 요청으로만 요청을 제한할 수 있습니다. 자세한 내용은 [Athena용 CalledVia 컨텍스트 키 사용](security-iam-athena-calledvia.md) 섹션을 참조하세요.

## 다양한 유형의 데이터 보호
<a name="security-data-protection-types-of-data"></a>

Athena를 사용하여 데이터베이스 및 테이블을 작성할 때 여러 유형의 데이터가 관련됩니다. 이러한 데이터 형식에는 Amazon S3에 저장된 원본 데이터, 쿼리를 실행할 때 만드는 데이터베이스 및 테이블의 메타 데이터 또는 데이터, 쿼리 결과 데이터 및 쿼리 기록 검색을 위한 AWS Glue 크롤러가 포함됩니다. 이 섹션에서는 각 유형의 데이터에 대해 설명하고 데이터 보호에 대한 지침을 제공합니다.
+ **소스 데이터** – Athena는 사용자가 Amazon S3에 저장한 데이터베이스와 테이블의 데이터를 수정하지 않습니다. 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*의 [Amazon S3의 데이터 보호](https://docs.aws.amazon.com/AmazonS3/latest/userguide/DataDurability.html)를 참조하세요. Amazon S3에서 소스 데이터에 대한 액세스를 제어하고 이를 암호화할 수 있습니다. Athena는 [Amazon S3에서 암호화된 데이터 세트를 기반으로 테이블을 생성](creating-tables-based-on-encrypted-datasets-in-s3.md)할 수 있습니다.
+ **데이터베이스 및 테이블 메타데이터(스키마)** – Athena는 스키마-온-리드(schema-on-read) 기술을 사용합니다. 즉, 테이블 정의는 Athena 쿼리 실행 시 Amazon S3의 데이터에 적용됩니다. 사용자가 정의하는 모든 스키마는 명시적으로 삭제하지 않는 한, 자동으로 저장됩니다. Athena에서 DDL 문을 사용하여 데이터 카탈로그 메타데이터를 수정할 수 있습니다. Amazon S3에 저장된 기본 데이터에 영향을 주지 않고도 테이블 정의 및 스키마를 삭제할 수도 있습니다. Athena에서 사용하는 데이터베이스 및 테이블의 메타데이터는 AWS Glue Data Catalog에 저장됩니다.

  AWS Identity and Access Management(IAM)를 사용하면 AWS Glue Data Catalog에 등록된 [데이터베이스 및 테이블에 대해 세분화된 액세스 정책을 정의](fine-grained-access-to-glue-resources.md)할 수 있습니다. [AWS Glue Data Catalog의 메타데이터도 암호화](https://docs.aws.amazon.com/glue/latest/dg/encrypt-glue-data-catalog.html)할 수 있습니다. 메타데이터를 암호화하는 경우 액세스를 위해 [암호화된 메타데이터에 대한 사용 권한](encryption.md#glue-encryption)을 사용하세요.
+ **저장된 쿼리를 포함한 쿼리 결과 및 쿼리 기록** – 쿼리 결과는 전역 또는 각 작업 그룹에 대해 지정하도록 선택할 수 있는 Amazon S3의 위치에 저장됩니다. 지정하지 않으면 Athena는 각 경우에 기본 위치를 사용합니다. 쿼리 결과 및 저장된 쿼리를 저장하는 Amazon S3 버킷에 대한 액세스를 제어합니다. 또한 Amazon S3에 저장한 쿼리 결과를 암호화하도록 선택할 수 있습니다. 사용자는 Amazon S3 위치에 액세스하고 파일을 해독할 수 있는 적절한 권한을 가지고 있어야 합니다. 자세한 내용은 이 문서의 [Amazon S3에 저장된 Athena 쿼리 결과 암호화](encrypting-query-results-stored-in-s3.md) 단원을 참조하세요.

  Athena는 45일 동안 쿼리 기록을 보관합니다. 콘솔에서 Athena API와 AWS CLI를 사용하여 [쿼리 기록을 볼](queries-viewing-history.md) 수 있습니다. 45일 이상 된 쿼리를 저장하려면 저장하세요. 저장된 쿼리에 대한 액세스를 보호하려면 Athena에서 [작업 그룹을 사용](workgroups-manage-queries-control-costs.md)하여 저장된 쿼리에 대한 액세스 권한을, 쿼리를 볼 수 있는 권한이 있는 사용자에게만 제한합니다.

**Topics**
+ [

## 다양한 유형의 데이터 보호
](#security-data-protection-types-of-data)
+ [

# 저장 시 암호화
](encryption.md)
+ [

# 전송 중 암호화
](encryption-in-transit.md)
+ [

# 키 관리
](key-management.md)
+ [

# 인터네트워크 트래픽 개인 정보
](internetwork-traffic-privacy.md)

# 저장 시 암호화
<a name="encryption"></a>

동일한 리전 및 제한된 수의 리전에 있는 Amazon S3의 암호화된 데이터에 대해 Amazon Athena에서 쿼리를 실행할 수 있습니다. Amazon S3의 쿼리 결과와 AWS Glue 데이터 카탈로그의 데이터를 암호화할 수도 있습니다.

다음과 같은 Athena의 자산을 암호화할 수 있습니다.
+ Athena가 Amazon S3 결과 위치로 알려진 위치에 저장하는 Amazon S3의 모든 쿼리 결과 기본 데이터 세트가 Amazon S3에서 암호화되든 그렇지 않든 Amazon S3에 저장된 쿼리 결과를 암호화할 수 있습니다. 자세한 내용은 [Amazon S3에 저장된 Athena 쿼리 결과 암호화](encrypting-query-results-stored-in-s3.md) 섹션을 참조하세요.
+ AWS Glue 데이터 카탈로그의 데이터. 자세한 내용은 [AWS Glue 데이터 카탈로그에 저장된 암호화된 메타데이터 권한](#glue-encryption) 섹션을 참조하세요.

**참고**  
Athena를 사용하여 암호화된 테이블을 읽을 때 Athena는 쿼리 결과에 대한 암호화 옵션이 아니라 테이블 데이터에 지정된 암호화 옵션을 사용합니다. 쿼리 결과 및 테이블 데이터에 대해 별도의 암호화 방법 또는 키가 구성된 경우 Athena는 쿼리 결과를 암호화하거나 해독하는 데 사용되는 암호화 옵션 및 키를 사용하지 않고 테이블 데이터를 읽습니다.  
하지만 Athena를 사용하여 암호화된 데이터가 있는 테이블에 데이터를 삽입하는 경우 Athena는 쿼리 결과에 지정된 암호화 구성을 사용하여 삽입된 데이터를 암호화합니다. 예를 들어 쿼리 결과에 `CSE_KMS` 암호화를 지정하는 경우 Athena는 쿼리 결과 암호화에 사용한 것과 동일한 AWS KMS 키 ID를 사용하여 `CSE_KMS`와 함께 삽입된 테이블 데이터를 암호화합니다.

**Topics**
+ [

## 지원되는 Amazon S3 암호화 옵션
](#encryption-options-S3-and-Athena)
+ [

## Amazon S3의 암호화 데이터 권한
](#permissions-for-encrypting-and-decrypting-data)
+ [

## AWS Glue 데이터 카탈로그에 저장된 암호화된 메타데이터 권한
](#glue-encryption)
+ [

# CSE-KMS에서 SSE-KMS로 마이그레이션
](migrating-csekms-ssekms.md)
+ [

# Amazon S3에 저장된 Athena 쿼리 결과 암호화
](encrypting-query-results-stored-in-s3.md)
+ [

# Amazon S3의 암호화된 데이터세트에 기반한 테이블 생성
](creating-tables-based-on-encrypted-datasets-in-s3.md)

## 지원되는 Amazon S3 암호화 옵션
<a name="encryption-options-S3-and-Athena"></a>

Athena에서는 Amazon S3의 데이터 세트 및 쿼리 결과에 대해 다음과 같은 암호화 옵션을 지원합니다.


| 암호화 유형 | 설명 | 리전 간 지원 | 
| --- | --- | --- | 
| [SSE-S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html) | Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE). | 예 | 
| [SSE-KMS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)(권장됨) | AWS Key Management Service 고객 관리형 키를 사용한 서버 측 암호화(SSE)  | 예 | 
| [CSE-KMS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html#client-side-encryption-kms-managed-master-key-intro) |  AWS KMS 고객 관리형 키를 사용한 클라이언트 측 암호화(CSE) Athena에서 이 옵션을 사용하려면 `'kms_key'='kms_key_arn'`으로 `'has_encrypted_data'='true'` 또는 `'encryption_option'='CSE_KMS'`를 지정하는 `TBLPROPERTIES` 절과 함께 `CREATE TABLE` 문을 사용해야 합니다. 자세한 내용은 [Amazon S3의 암호화된 데이터세트에 기반한 테이블 생성](creating-tables-based-on-encrypted-datasets-in-s3.md) 섹션을 참조하세요.  | 아니요 | 

Amazon S3를 사용한 AWS KMS 암호화에 관한 자세한 내용은 *AWS Key Management Service 개발자 안내서*에서 [AWS Key Management Service란 무엇인가?](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 및 [Amazon Simple Storage Service(Amazon S3)의 AWS KMS 사용 방법](https://docs.aws.amazon.com/kms/latest/developerguide/services-s3.html)을 참조하세요. Athena에 SSE-KMS 또는 CSE-KMS를 사용하는 방법에 대한 자세한 내용은 *AWS Big Data Blog*의 [Launch: Amazon Athena adds support for querying encrypted data](https://aws.amazon.com/blogs/aws/launch-amazon-athena-adds-support-for-querying-encrypted-data/)를 참조하세요.

### 암호화 권장 사항
<a name="encryption-recommendation"></a>

고객 관리형 KMS 키를 사용하여 테이블 데이터 및 쿼리 결과를 암호화 및 복호화하는 경우 SSE-S3 또는 CSE-KMS 암호화 방법을 통한 SSE-KMS 암호화를 사용하는 것이 좋습니다. SSE-KMS는 제어, 단순성 및 성능 부문에서 균형을 제공하므로 데이터 암호화에 관리형 KMS 키를 사용할 때 권장되는 방법입니다.

**SSE-S3를 통한 SSE-KMS의 이점**
+ SSE-KMS를 사용하면 자체 키를 지정하고 관리할 수 있으므로 더 정확한 제어 권한을 제공합니다. 키 정책 정의, 키 수명 주기 감독, 키 사용량 모니터링을 수행할 수 있습니다.

**CSE-KMS를 통한 SSE-KMS의 이점**
+ SSE-KMS는 S3 암호화 클라이언트를 지속적으로 유지 관리해야 하는 CSE-KMS와 달리 데이터 암호화 및 복호화를 추가 인프라가 필요하지 않습니다.
+ CSE-KMS는 진화하는 암호화 알고리즘으로 인해 최신 및 이전 S3 암호화 클라이언트 간의 호환성 문제가 생길 수 있으며, SSE-KMS는 이를 방지합니다.
+ SSE-KMS는 암호화 및 복호화 프로세스 중에 키 검색을 위해 KMS 서비스에 대한 API 직접 호출을 줄여 CSE-KMS에 비해 더 나은 성능을 제공합니다.

### 지원되지 않는 옵션
<a name="encryption-unsupported-options"></a>

다음 암호화 옵션은 지원되지 않습니다.
+ 고객 제공 키가 있는 SSE(SSE-C).
+ 클라이언트 측 관리형 키를 사용한 클라이언트 측 암호화.
+ 비대칭 키.

Amazon S3 암호화 옵션을 비교하려면 *Amazon Simple Storage Service 사용 설명서*의 [암호화를 사용한 데이터 보호](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingEncryption.html)를 참조하세요.

### 클라이언트 측 암호화를 위한 도구
<a name="encryption-client-side-tools"></a>

 클라이언트 측 암호화를 위해 다음 두 가지 도구를 사용할 수 있습니다.
+ [Amazon S3 암호화 클라이언트](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3EncryptionClient.html) - Amazon S3의 데이터만 암호화하며 Athena에서 지원됩니다.
+ [AWS Encryption SDK](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/introduction.html) - SDK를 사용하여 모든 AWS에서 데이터를 암호화할 수 있으나 Athena에서 직접 지원하지는 않습니다.

이러한 도구는 호환되지 않으며 한 도구를 사용하여 암호화된 데이터는 다른 도구에서 복호화할 수 없습니다. Athena는 Amazon S3 암호화 클라이언트만 직접적으로 지원합니다. SDK를 사용하여 데이터를 암호화하면 Athena에서 쿼리를 실행할 수 있지만 데이터가 암호화된 텍스트로 반환됩니다.

Athena를 사용하여 AWS 암호화 SDK로 암호화된 데이터를 쿼리하려면 데이터를 다운로드하고 복호화한 다음 Amazon S3 암호화 클라이언트를 사용하여 데이터를 다시 암호화해야 합니다.

## Amazon S3의 암호화 데이터 권한
<a name="permissions-for-encrypting-and-decrypting-data"></a>

Amazon S3에서 사용한 암호화 유형에 따라, Athena에서 사용한 정책에 ‘허용’ 작업이라고 하는 권한을 추가해야 할 수도 있습니다.
+ **SSE-S3** – 암호화에 SSE-S3를 사용하면 Athena 사용자는 정책에 추가 권한이 필요하지 않습니다. 적절한 Amazon S3 위치(및 Athena 작업)에 대해 적절한 Amazon S3 권한을 갖는 것으로 충분합니다. 적절한 Athena 및 Amazon S3 권한을 허용하는 정책에 대한 자세한 내용은 [Amazon Athena의 AWS 관리형 정책](security-iam-awsmanpol.md) 및 [Athena에서 Amazon S3에 대한 액세스 제어](s3-permissions.md) 단원을 참조하세요.
+ **AWS KMS** – 암호화에 AWS KMS를 사용한다면, Athena 및 Amazon S3 권한 외에 특정 AWS KMS 작업을 수행할 수 있는 권한을 Athena 사용자에게 허용해야 합니다. Amazon S3에서 데이터를 암호화하는 데 사용되는 고객 관리형 키의 키 정책을 편집하여 이러한 작업을 허용합니다. 키 사용자를 적절한 AWS KMS 키 정책에 추가하기 위해 AWS KMS 콘솔을 사용할 수 있습니다([https://console.aws.amazon.com/kms](https://console.aws.amazon.com/kms)). AWS KMS 키 정책에 사용자를 추가하는 방법에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [키 사용자가 고객 관리형 키를 사용하도록 허용](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-users)을 참조하세요.
**참고**  
고급 키 정책 관리자는 키 정책을 세부적으로 조정할 수 있습니다. `kms:Decrypt`는 Athena 사용자가 암호화된 데이터 세트로 작업할 때 허용되는 최소 작업입니다. 암호화된 쿼리 결과로 작업할 때 허용되는 최소 작업은 `kms:GenerateDataKey` 및 `kms:Decrypt`입니다.

  AWS KMS로 암호화된 객체가 다수 포함되어 있는 Amazon S3에서 Athena를 사용해 데이터세트를 쿼리한다면 AWS KMS가 쿼리 결과를 제한할 수 있습니다. 다수의 작은 객체가 있는 경우 이런 현상이 발생할 가능성이 높습니다. Athena가 재시도 요청을 취소해도 제한 오류가 계속 발생할 수 있습니다. 많은 수의 암호화된 객체로 작업하고 이 문제가 발생하는 경우 Amazon S3 버킷 키를 활성화하여 KMS에 대한 호출 수를 줄이는 것이 한 가지 방법입니다. 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*의 [Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-key.html)을 참조하세요. 또 다른 옵션은 AWS KMS에 대한 서비스 할당량을 늘리는 것입니다. 자세한 내용은 *AWS Key Management Service 개발자 안내서*에서 [할당량](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html#requests-per-second)을 참조하세요.

Amazon S3와 Athena 사용 시 권한에 대한 문제 해결 정보는 [권한](troubleshooting-athena.md#troubleshooting-athena-permissions) 주제의 [Athena의 문제 해결](troubleshooting-athena.md) 단원을 참조하세요.

## AWS Glue 데이터 카탈로그에 저장된 암호화된 메타데이터 권한
<a name="glue-encryption"></a>

[AWS Glue Data Catalog의 메타데이터를 암호화한다면](https://docs.aws.amazon.com/glue/latest/dg/encrypt-glue-data-catalog.html), Athena 액세스에 사용한 정책에 `"kms:GenerateDataKey"`, `"kms:Decrypt"`, `"kms:Encrypt"` 작업을 추가해야 합니다. 자세한 내용은 [Athena에서 AWS Glue Data Catalog의 암호화된 메타데이터에 대한 액세스 구성](access-encrypted-data-glue-data-catalog.md) 섹션을 참조하세요.

# CSE-KMS에서 SSE-KMS로 마이그레이션
<a name="migrating-csekms-ssekms"></a>

CSE-KMS 암호화하는 방법은 두 가지로, 작업 그룹 쿼리 결과 암호화 구성 및 클라이언트 측 설정 중에 지정할 수 있습니다. 자세한 내용은 [Amazon S3에 저장된 Athena 쿼리 결과 암호화](encrypting-query-results-stored-in-s3.md) 섹션을 참조하세요. 마이그레이션 프로세스 중에 CSE-KMS 데이터를 읽고 쓰는 기존 워크플로를 감사하고, CSE-KMS가 구성된 작업 그룹을 식별하고, 클라이언트 측 파라미터를 통해 CSE-KMS가 설정된 인스턴스를 찾는 것이 중요합니다.

## 작업 그룹 쿼리 결과 암호화 설정 업데이트
<a name="migrating-updating-workgroup-query-results-encryption"></a>

------
#### [ Console ]

**Athena 콘솔에서 데이터 암호화 설정 업데이트**

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

1. Athena 콘솔 탐색 창에서 **작업 그룹(Workgroups)**을 선택합니다.

1. **작업 그룹(Workgroups)** 페이지에서 편집할 작업 그룹의 버튼을 선택합니다.

1. **작업(Actions)**, **편집(Edit)**을 선택합니다.

1. **쿼리 결과 구성**을 열고 **쿼리 결과 암호화**를 선택합니다.

1. **암호화 유형** 섹션에서 **SSE\$1KMS** 암호화 옵션을 선택합니다.

1. **다른 AWS KMS 키 선택(고급)**에 사용하는 KMS 키를 입력합니다.

1. **변경 사항 저장**을 선택합니다. **작업 그룹(Workgroups)** 페이지의 목록에 업데이트된 작업 그룹이 나타납니다.

------
#### [ CLI ]

다음 명령을 실행하여 쿼리 결과 암호화 구성을 작업 그룹의 SSE-KMS로 업데이트합니다.

```
aws athena update-work-group \
    --work-group "my-workgroup" \
    --configuration-updates '{
        "ResultConfigurationUpdates": {
            "EncryptionConfiguration": {
                "EncryptionOption": "SSE_KMS",
                "KmsKey": "<my-kms-key>"
            }
        }
    }'
```

------

## 클라이언트 측 쿼리 결과 암호화 설정 업데이트
<a name="migrating-updating-clientside-query-results-encryption"></a>

------
#### [ Console ]

쿼리 결과 암호화를 위한 클라이언트 측 설정을 CSE-KMS에서 SSE-KMS로 업데이트하려면 [Amazon S3에 저장된 Athena 쿼리 결과 암호화](encrypting-query-results-stored-in-s3.md) 섹션을 참조하세요.

------
#### [ CLI ]

클라이언트 측 설정에서 쿼리 결과 암호화 구성 지정은 `start-query-execution` 명령을 사용해서 할 수 있습니다. 이 CLI 명령을 실행하고 작업 그룹에서 지정한 쿼리 결과 암호화 구성을 CSE-KMS로 재정의하는 경우 다음과 같이 `SSE_KMS`를 사용하여 명령을 변경해 쿼리 결과를 암호화합니다.

```
aws athena start-query-execution \
    --query-string "SELECT * FROM <my-table>;" \
    --query-execution-context "Database=<my-database>,Catalog=<my-catalog>" \
    --result-configuration '{
        "EncryptionConfiguration": {
            "EncryptionOption": "SSE_KMS",
            "KmsKey": "<my-kms-key>"
        }
    }' \
    --work-group "<my-workgroup>"
```

------

**참고**  
작업 그룹 또는 클라이언트 측 설정을 업데이트한 후 쓰기 쿼리로 삽입하는 모든 신규 데이터는 CSE-KMS 대신 SSE-KMS 암호화를 사용합니다. 쿼리 결과 암호화 구성이 새로 삽입된 테이블 데이터에도 적용되기 때문입니다. Athena 쿼리 결과, 메타데이터 및 매니페스트 파일도 SSE-KMS로 암호화됩니다.
Athena는 CSE-KMS 암호화 객체와 SSE-S3/SSE-KMS 객체가 혼합된 경우에도 `has_encrypted_data` 테이블 속성이 있는 테이블을 읽을 수 있습니다.

# CSE-KMS 테이블 데이터를 SSE-KMS로 변환
<a name="convert-csekms-table-ssekms"></a>

현재 워크플로가 테이블 데이터 암호화에 CSE-KMS를 사용하는 경우 다음 단계를 통해 SSE-KMS로 전환합니다.

## 사전 조건
<a name="convert-csekms-table-ssekms-preq"></a>

CSE-KMS 작업 그룹 또는 클라이언트 측 설정을 사용하여 여전히 데이터를 쓰는 경우 [CSE-KMS에서 SSE-KMS로 마이그레이션](migrating-csekms-ssekms.md)의 단계에 따라 SSE-KMS로 업데이트하세요. 이렇게 하면 마이그레이션 프로세스 중에 테이블에 쓸 수 있는 다른 워크플로에서 새 CSE-KMS 암호화된 데이터가 추가되지 않습니다.

## 데이터 마이그레이션
<a name="convert-csekms-table-ssekms-migrat"></a>

1. 테이블에 `has_encrypted_data` 속성이 `true`로 설정되어 있는지 확인합니다. 이 속성은 테이블에 CSE-KMS 암호화 데이터가 포함될 수 있도록 지정합니다. 그러나 이 속성은 CSE-KMS 암호화 데이터가 실제로는 없는 테이블에도 존재할 수 있다는 점에 유의해야 합니다.

------
#### [ Console ]

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

   1. **쿼리 편집기 시작**을 선택합니다.

   1. 편집기 왼쪽의 **데이터베이스**에서 쿼리할 데이터베이스를 선택합니다.

   1. 쿼리 편집기에서 다음 쿼리를 실행하여 `has_encrypted_data table` 속성으로 설정된 값을 확인합니다.

      ```
      SHOW TBLPROPERTIES <table_name>('has_encrypted_data');
      ```

------
#### [ CLI ]

   다음 예제와 같이 테이블에 `has_encrypted_data` 속성 값을 표시하는 Athena 쿼리를 시작합니다.

   ```
   aws athena start-query-execution \
       --query-string "SHOW TBLPROPERTIES <table-name>('has_encrypted_data');" \
       --work-group "<my-workgroup>"
   ```

   다음 예제와 같이 쿼리 결과를 가져와서 테이블의 `has_encrypted_data` 테이블 속성 값을 확인합니다.

   ```
   aws athena get-query-results --query-execution-id <query-execution-id-from-previous-step>
   ```

------

1. 테이블의 각 CSE-KMS 암호화 객체의 경우.

   1. S3 암호화 클라이언트를 사용하여 S3에서 객체를 다운로드하고 복호화합니다. 다음은 AWS Java SDK V2의 예제입니다.

      **가져오기**

      ```
      import software.amazon.awssdk.core.ResponseInputStream;
      import software.amazon.awssdk.services.s3.model.GetObjectRequest;
      import software.amazon.awssdk.services.s3.model.GetObjectResponse;
      import software.amazon.encryption.s3.S3EncryptionClient;
      import software.amazon.encryption.s3.materials.Keyring;
      import software.amazon.encryption.s3.materials.KmsDiscoveryKeyring;
      ```

      코드

      ```
      final Keyring kmsDiscoveryKeyRing = KmsDiscoveryKeyring.builder()
              .enableLegacyWrappingAlgorithms(true)
              .build();
      final S3EncryptionClient s3EncryptionClient = S3EncryptionClient.builder()
              .enableLegacyUnauthenticatedModes(true)
              .keyring(kmsDiscoveryKeyRing)
              .build();
      
      GetObjectRequest getObjectRequest = GetObjectRequest.builder()
              .bucket("amzn-s3-demo-bucket")
              .key("<my-key>")
              .build();
      
      ResponseInputStream<GetObjectResponse> s3Object = s3EncryptionClient.getObject(getObjectRequest);
      ```

   1. 동일한 이름과 SSE-KMS 암호화를 사용하여 객체를 S3에 업로드합니다. 다음은 AWS Java SDK V2의 예제입니다.

      **가져오기**

      ```
      import software.amazon.awssdk.core.ResponseInputStream;
      import software.amazon.awssdk.core.sync.RequestBody;
      import software.amazon.awssdk.services.s3.S3Client;
      import software.amazon.awssdk.services.s3.model.PutObjectRequest;
      import software.amazon.awssdk.services.s3.model.ServerSideEncryption;
      ```

      **코드**

      ```
      final S3Client s3Client = S3Client.builder()
              .build();
                  
      PutObjectRequest putObjectRequest = PutObjectRequest.builder()
              .bucket("amzn-s3-demo-bucket")
              .key("<my-key>")
              .serverSideEncryption(ServerSideEncryption.AWS_KMS)
              .ssekmsKeyId("<my-kms-key>")
              .build();
      
      s3Client.putObject(putObjectRequest, RequestBody.fromBytes(s3Object.readAllBytes()));
      ```

## 마이그레이션 후
<a name="convert-csekms-table-ssekms-post-migrat"></a>

테이블의 모든 CSE-KMS 파일에 대한 재암호화를 만료한 후 다음 단계를 수행합니다.

1. 테이블에서 `has_encrypted_data` 속성을 제거합니다.

------
#### [ Console ]

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

   1. **쿼리 편집기 시작**을 선택합니다.

   1. 편집기 왼쪽의 **데이터베이스**에서 쿼리할 데이터베이스를 선택합니다.

   1. 쿼리 편집기에서 테이블에 대해 다음 쿼리를 실행합니다.

      ```
      ALTER TABLE <database-name>.<table-name> UNSET TBLPROPERTIES ('has_encrypted_data')
      ```

------
#### [ CLI ]

   다음 명령을 실행하여 테이블에서 `has_encrypted_data` 속성을 제거합니다.

   ```
   aws athena start-query-execution \
       --query-string "ALTER TABLE <database-name>.<table-name> UNSET TBLPROPERTIES ('has_encrypted_data');" \
       --work-group "<my-workgroup>"
   ```

------

1. S3 암호화 클라이언트 대신 기본 S3 클라이언트를 사용하도록 워크플로를 업데이트한 다음 데이터 쓰기에 SSE-KMS 암호화를 지정합니다.

# Amazon S3에 저장된 Athena 쿼리 결과 암호화
<a name="encrypting-query-results-stored-in-s3"></a>

Athena 콘솔을 사용하거나 JDBC 또는 ODBC를 사용할 경우 쿼리 결과 암호화를 설정합니다. 작업 그룹을 통해 쿼리 결과를 암호화할 수 있습니다.

**참고**  
쿼리 결과를 암호화하면 Athena는 쿼리가 작성한 모든 객체를 암호화합니다. 여기에는 `INSERT INTO`, `UPDATE`와 같은 문의 결과와 Iceberg 또는 기타 형식의 데이터에 대한 쿼리 결과가 포함됩니다.

콘솔에서 쿼리 결과의 암호화 구성에 대한 설정은 다음 두 가지 방법으로 구성할 수 있습니다.
+ **클라이언트 측 설정** - 콘솔에서 **설정**을 사용하거나 API 작업을 사용하여 쿼리 결과를 암호화하도록 지정할 경우 클라이언트 측 설정을 사용하는 것입니다. 클라이언트 측 설정에는 쿼리 결과 위치와 암호화가 포함됩니다. 이를 지정할 경우 작업 그룹 설정에서 재정의하지 않는 한 이 설정이 사용됩니다.
+ **작업 그룹 설정** – [작업 그룹을 생성하거나 편집](creating-workgroups.md)하고 **클라이언트 측 설정 재정의(Override client-side settings)** 필드를 선택할 경우 이 작업 그룹에서 실행되는 모든 쿼리가 작업 그룹 암호화 및 쿼리 결과 위치 설정을 사용합니다. 자세한 내용은 [Override client-side settings(클라이언트 측 설정 재정의)](workgroups-settings-override.md) 섹션을 참조하세요.

**콘솔을 사용해 Amazon S3에 저장된 쿼리 결과를 암호화하려면**
**중요**  
작업 그룹에 **클라이언트 측 설정 재정의(Override client-side settings)** 필드가 선택되어 있으면 작업 그룹의 모든 쿼리가 작업 그룹 설정을 사용합니다. Athena 콘솔의 **설정** 탭에 지정된 암호화 구성 및 쿼리 결과 위치, API 작업, JDBC 및 ODBC 드라이버는 사용되지 않습니다. 자세한 내용은 [Override client-side settings(클라이언트 측 설정 재정의)](workgroups-settings-override.md) 섹션을 참조하세요.

1. Athena 콘솔에서 **설정**을 선택합니다.  
![\[Athena 쿼리 편집기의 설정 탭.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/settings.png)

1. **관리**를 선택합니다.

1. **쿼리 결과 위치(Location of query result)**에 Amazon S3 경로를 입력하거나 선택합니다. 이는 쿼리 결과가 저장되는 Amazon S3 위치입니다.

1. [**Encrypt query results**]를 선택합니다.  
![\[Athena 콘솔의 설정 관리 페이지에 있는 쿼리 결과 암호화 옵션.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/encrypt-query-results.png)

1. [**Encryption type**]에서 [**CSE-KMS**], [**SSE-KMS**] 또는 [**SSE-S3**]를 선택합니다. 이 세 가지 중에서 **CSE-KMS**는 가장 높은 수준의 암호화를 제공하고 **SSE-S3**는 가장 낮은 수준의 암호화를 제공합니다.

1. **SSE-KMS** 또는 **CSE-KMS**를 선택한 경우 AWS KMS 키를 지정합니다.
   + 계정에 기존 AWS KMS 고객 관리형 키에 대한 액세스 권한이 있는 경우 **AWS KMS 키 선택**에서 별칭을 선택하거나 AWS KMS 키 ARN을 입력합니다.
   +  계정에서 기존 고객 관리형 키에 액세스할 수 없는 경우 **AWS KMS 키 생성**을 선택한 다음 [AWS KMS 콘솔](https://console.aws.amazon.com/kms)을 엽니다. 자세한 정보는 *AWS Key Management Service 개발자 안내서*의 [키 생성](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)을 참조하세요.
**참고**  
Athena는 데이터 읽기 및 쓰기를 위한 대칭 키만 지원합니다.

1. Athena 콘솔로 돌아가서 별칭 또는 ARN으로 생성한 키를 선택합니다.

1. **저장**을 선택합니다.

## JDBC 또는 ODBC를 사용할 때 Athena 쿼리 결과 암호화
<a name="encrypting-query-results-stored-in-s3-jdbc-odbc"></a>

JDBC 또는 ODBC 드라이버를 사용하여 연결하는 경우 사용할 암호화 유형과 Amazon S3 스테이징 디렉터리 위치를 지정하는 드라이버 옵션을 구성합니다. Athena가 지원하는 암호화 프로토콜을 사용하여 쿼리 결과를 암호화하도록 JDBC 또는 ODBC 드라이버를 구성하는 방법은 [ODBC 및 JDBC 드라이버로 Amazon Athena에 연결](athena-bi-tools-jdbc-odbc.md) 섹션을 참조하세요.

# Amazon S3의 암호화된 데이터세트에 기반한 테이블 생성
<a name="creating-tables-based-on-encrypted-datasets-in-s3"></a>

Athena는 기본 데이터세트가 SSE-S3, SSE-KMS 또는 CSE-KMS로 암호화된 테이블을 읽고 쓸 수 있습니다. 테이블 데이터에 사용되는 암호화 옵션 및 실행된 쿼리 유형에 따라 암호화된 데이터를 읽고 쓰려면 몇 가지 추가 테이블 속성을 지정해야 할 수 있습니다.

## SSE-S3/SSE-KMS로 암호화된 테이블 읽기
<a name="reading-sse-s3-sse-kms-encrypted-tables"></a>

SSE-S3/SSE-KMS로 암호화된 데이터세트를 읽기 위해 테이블 생성 시 추가 테이블 속성을 지정할 필요가 없습니다. Amazon S3는 SSE 객체 복호화를 자동으로 처리합니다.

## CSE-KMS로 암호화된 테이블 읽기
<a name="reading-cse-kms-encrypted-tables"></a>

Athena가 CSE-KMS로 암호화된 데이터세트를 읽기 위해 지정할 수 있는 두 가지 테이블 속성 세트가 있습니다.
+ `encryption_option` 및 `kms_key` 테이블 속성 사용(권장)
+ `has_encrypted_data` 테이블 속성 사용

**중요**  
Amazon EMR을 EMRFS와 함께 사용해 CSE-KMS로 암호화된 Parquet 파일을 업로드하는 경우 `fs.s3n.multipart.uploads.enabled`를 `false`로 설정해 멀티파트 업로드를 비활성화해야 합니다. 이 작업을 하지 않으면, Athena는 Parquet 파일 길이를 확인하지 못하며 **HIVE\$1CANNOT\$1OPEN\$1SPLIT** 오류가 발생합니다. 자세한 내용은 *Amazon EMR 관리 안내서*의 [Amazon S3에 대한 멀티파트 업로드 구성](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-upload-s3.html#Config_Multipart)을 참조하세요.

### encryption\$1option 및 kms\$1key 테이블 속성 사용
<a name="using-encryption-option-and-kms-key-table-properties"></a>

다음 예제처럼 [CREATE TABLE](create-table.md) 문에서 `encryption_option='CSE_KMS'` 및 `kms_key='aws_kms_key_arn'`을 지정하는 `TBLPROPERTIES` 절을 사용합니다.

```
CREATE EXTERNAL TABLE 'my_encrypted_data' (
   `n_nationkey` int,
   `n_name` string,
   `n_regionkey` int,
   `n_comment` string)
ROW FORMAT SERDE
   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
LOCATION
   's3://amzn-s3-demo-bucket/folder_with_my_encrypted_data/'
TBLPROPERTIES (
    'encryption_option' = 'CSE_KMS',
    'kms_key' = 'arn:aws:kms:us-east-1:012345678901:key/my_kms_key')
```

이러한 속성이 구성되는 경우
+ Athena는 V1, V2 또는 V3 Amazon S3 암호화 클라이언트에서 생성된 CSE-KMS로 암호화된 객체를 읽을 수 있습니다.
+ Athena는 `kms_key`의 AWS KMS 키를 사용하여 CSE-KMS 데이터를 복호화합니다. 객체가 다른 AWS KMS 키로 암호화된 경우 쿼리에 실패합니다.
+ 서버 측 객체와 클라이언트 측의 암호화된 객체를 혼합하는 방식은 권장되지 않지만 Athena는 여전히 SSE-S3 및 SSE-KMS로 암호화된 객체를 읽을 수 있습니다.

### has\$1encrypted\$1data 테이블 속성 사용
<a name="using-has-encrypted-data-table-property"></a>

다음 예제처럼 [CREATE TABLE](create-table.md) 문에서 `has_encrypted_data='true'`를 지정하는 `TBLPROPERTIES` 절을 사용합니다.

```
CREATE EXTERNAL TABLE 'my_encrypted_data' (
   `n_nationkey` int,
   `n_name` string,
   `n_regionkey` int,
   `n_comment` string)
ROW FORMAT SERDE
   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
LOCATION
   's3://amzn-s3-demo-bucket/folder_with_my_encrypted_data/'
TBLPROPERTIES (
    'has_encrypted_data' = 'true')
```

has\$1encrypted\$1data 테이블 속성이 지정되는 경우
+ Athena는 V1 Amazon S3 암호화 클라이언트에서 생성된 CSE-KMS로 암호화된 객체만 읽을 수 있습니다.
+ Athena는 객체 메타데이터에서 CSE-KMS 객체를 암호화하는 데 사용되는 AWS KMS 키를 추론한 다음, 해당 키를 사용하여 객체를 복호화합니다.
+ 서버 측 객체와 클라이언트 측의 암호화된 객체를 혼합하는 방식은 권장되지 않지만 Athena는 여전히 SSE-S3 및 SSE-KMS로 암호화된 객체를 읽을 수 있습니다.

**참고**  
`encryption_option` 및 `kms_key`가 `has_encrypted_data`와 함께 지정되면 `encryption_option` 및 `kms_key` 테이블 속성이 우선하고 `has_encrypted_data`는 무시됩니다.

Athena 콘솔에서 [양식을 사용하여 테이블을 생성](data-sources-glue-manual-table.md)하고 테이블 위치를 지정할 때 **암호화된 데이터세트** 옵션을 선택하고 `has_encrypted_data='true'` 속성을 테이블에 추가합니다.

![\[테이블 추가 양식에서 암호화된 데이터 세트(Encrypted data set)을 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/add-table-form-encrypted-option.png)


Athena 콘솔 테이블 목록에서 `has_encrypted_data='true'`를 사용하여 CSE-KMS로 암호화된 테이블은 열쇠 모양 아이콘을 표시합니다.

![\[암호화 테이블 아이콘\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/tables-list-encrypted-table-icon.png)


## SSE-S3/SSE-KMS/CSE-KMS 암호화 데이터 쓰기
<a name="writing-sse-s3-sse-kms-cse-kms-encrypted-data"></a>

기본적으로 새로 삽입된 데이터 파일은 Athena 작업 그룹에 지정된 쿼리 결과의 암호화 구성을 사용하여 암호화됩니다. 쿼리 결과의 암호화 구성과 다른 암호화 구성으로 테이블 데이터를 쓰려면 몇 가지 테이블 속성을 더 추가해야 합니다.

다음 예제처럼 [CREATE TABLE](create-table.md) 문에서 `encryption_option='SSE_S3 | SSE_KMS | CSE_KMS'` 및 `kms_key='aws_kms_key_arn'`을 지정하는 `TBLPROPERTIES` 절을 사용합니다.

```
CREATE EXTERNAL TABLE 'my_encrypted_data' (
   `n_nationkey` int,
   `n_name` string,
   `n_regionkey` int,
   `n_comment` string)
ROW FORMAT SERDE
   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
LOCATION
   's3://amzn-s3-demo-bucket/folder_with_my_encrypted_data/'
TBLPROPERTIES (
    'encryption_option' = 'SSE_KMS',
    'kms_key' = 'arn:aws:kms:us-east-1:012345678901:key/my_kms_key')
```

새로 삽입된 모든 데이터는 작업 그룹에서 쿼리 결과의 암호화 구성을 사용하는 대신 테이블 속성에 지정된 암호화 구성을 사용하여 암호화됩니다.

## 고려 사항 및 제한
<a name="considerations-and-limitations"></a>

암호화된 데이터세트를 쓰고 읽을 때 다음 사항을 고려합니다.
+ `has_encrypted_data`, `encryption_option` 및 `kms_key` 테이블 속성은 Hive 테이블에서만 사용할 수 있습니다.
+ CSE-KMS로 암호화된 데이터가 포함된 테이블을 생성할 때는 모든 데이터가 동일한 AWS KMS 키로 암호화되도록 하는 것이 좋습니다.
+ CSE-KMS로 암호화된 데이터가 포함된 테이블을 생성할 때는 모든 데이터가 CSE-KMS로 암호화되고 CSE-KMS 및 CSE-KMS 이외 방식으로 암호화된 객체가 혼합되지 않도록 하는 것이 좋습니다.

# 전송 중 암호화
<a name="encryption-in-transit"></a>

Amazon S3의 저장된 데이터를 암호화하는 것 외에도 Amazon Athena는 Athena와 Amazon S3 사이, 그리고 Athena와 이에 액세스하는 고객 에플리케이션 사이의 전송 중 데이터에 TLS(Transport Layer Security) 암호화를 사용합니다.

Amazon S3 버킷 IAM 정책에 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Boolean](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Boolean)을 사용하여 HTTPS(TLS)를 통해 암호화된 연결만 허용해야 합니다.

JDBC 또는 ODBC 클라이언트로 스트리밍하는 쿼리 결과는 TLS를 사용하여 암호화됩니다. JDBC 및 ODBC 드라이버의 최신 버전 및 해당 설명서에 대한 자세한 내용은 [JDBC로 Amazon Athena에 연결](connect-with-jdbc.md) 및 [ODBC로 Amazon Athena에 연결](connect-with-odbc.md) 단원을 참조하세요.

Athena 페더레이션된 데이터 소스 커넥터의 경우 TLS를 사용한 전송 중 암호화 지원은 개별 커넥터에 따라 다릅니다. 자세한 내용은 개별 [데이터 소스 커넥터](connectors-available.md)에 대한 설명서를 참조하세요.

# 키 관리
<a name="key-management"></a>

Amazon Athena는 AWS Key Management Service(AWS KMS)가 Amazon S3 및 Athena 쿼리 결과의 데이터세트 암호화 수행을 지원합니다. AWS KMS는 고객 마스터 키를 사용하여 Amazon S3 객체를 암호화하고 [봉투 암호화](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping)를 사용합니다.

AWS KMS에서 다음 작업을 수행할 수 있습니다.
+  [키 생성](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html) 
+  [새로운 고객 관리형 키에 대해 자체 키 구성 요소 가져오기](https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html) 

**참고**  
Athena는 데이터 읽기 및 쓰기를 위한 대칭 키만 지원합니다.

자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [AWS Key Management Service란 무엇인가?](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)와, [Amazon Simple Storage Service가 AWS KMS를 사용하는 방식](https://docs.aws.amazon.com/kms/latest/developerguide/services-s3.html)을 참조하세요. AWS에서 계정을 위해 직접 생성하고 관리하는 키를 보려면 탐색 창에서 **AWS 고객 관리형 키**를 선택합니다.

SSE-KMS로 암호화된 객체를 업로드 또는 액세스하는 경우 강화된 보안을 위해 AWS 서명 버전 4를 사용합니다. 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*의 [요청 인증에서 서명 버전 지정](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingAWSSDK.html#specify-signature-version)을 참조하세요.

Athena 워크로드가 대량의 데이터를 암호화하는 경우 Amazon S3 버킷 키를 사용하여 비용을 절감할 수 있습니다. 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*의 [Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-key.html)을 참조하세요.

# 인터네트워크 트래픽 개인 정보
<a name="internetwork-traffic-privacy"></a>

Athena 및 온프레미스 애플리케이션 간 및 Athena, Amazon S3 간 트래픽이 보호됩니다. Athena와 AWS Glue 및 AWS Key Management Service 등의 다른 서비스 간의 트래픽은 기본값으로 HTTP를 사용합니다.
+ **Athena 및 온프레미스 클라이언트와 애플리케이션 간의 트래픽의 경우** JDBC 또는 ODBC 클라이언트로 스트리밍되는 쿼리 결과는 TLS(전송 계층 보안)를 사용하여 암호화됩니다.

  프라이빗 네트워크와 AWS 사이에 연결 옵션 중 하나를 사용할 수 있습니다.
  + Site-to-Site VPN Site-to-Site VPN 연결. 자세한 내용은 *AWS Site-to-Site VPN 사용 설명서*에서 [Site-to-Site VPN Site-to-Site VPN이란 무엇인가?](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)를 참조하세요.
  + Direct Connect 연결. 자세한 내용은 *Direct Connect 사용 설명서*에서 [Direct Connect란 무엇입니까?](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html) 단원을 참조하세요.
+ **Athena와 Amazon S3 버킷 간의 트래픽의 경우** 전송 계층 보안(TLS)이 Athena와 Amazon S3 사이, 그리고 Athena와 이에 액세스하는 고객 애플리케이션 사이의 전송 중 객체를 암호화합니다. Amazon S3 버킷 IAM 정책에 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Boolean](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_Boolean)을 사용할 때는 HTTPS(TLS)를 통해 암호화된 연결만 허용해야 합니다. Athena는 현재 퍼블릭 엔드포인트를 사용하여 Amazon S3 버킷의 데이터에 액세스하지만 이것이 데이터가 퍼블릭 인터넷을 통과한다는 의미는 아닙니다. Athena와 Amazon S3 간의 모든 트래픽은 AWS 네트워크를 통해 라우팅되고 TLS를 사용하여 암호화됩니다.
+ **규정 준수 프로그램** - Amazon Athena는 SOC, PCI, FedRAMP 등의 여러 AWS 규정 준수 프로그램을 준수합니다. 자세한 내용은 [규정 준수 프로그램 제공 범위 내 AWS 서비스](https://aws.amazon.com/compliance/services-in-scope/)를 참조하세요.

# Athena의 자격 증명 및 액세스 관리
<a name="security-iam-athena"></a>

Amazon Athena는 [AWS Identity and Access Management(IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 정책을 사용해 Athena 작업에 대한 액세스를 제한합니다. Athena의 전체 권한 목록은 *서비스 권한 부여 참조*에서 [Amazon Athena에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonathena.html)를 참조하세요.

IAM 정책을 사용할 때는 항상 IAM 모범 사례를 따라야 합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

Athena 쿼리를 실행하는 데 필요한 권한은 다음과 같습니다.
+ 쿼리할 기본 데이터가 저장되는 Amazon S3 위치입니다. 자세한 내용은 *Amazon Simple Storage Service 개발자 가이드*의 [Amazon S3의 자격 증명 및 액세스 관리](https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-access-control.html)를 참조하세요.
+ 암호화된 메타데이터에 대한 추가 작업을 포함하여 데이터베이스 및 테이블과 같이 사용자가 AWS Glue Data Catalog에 저장하는 메타데이터 및 리소스. 자세한 내용은 *AWS Glue 개발자 안내서*의 [AWS Glue에 대한 IAM 권한 설정](https://docs.aws.amazon.com/glue/latest/dg/getting-started-access.html) 및 [AWS Glue의 암호화 설정](https://docs.aws.amazon.com/glue/latest/dg/set-up-encryption.html)을 참조하세요.
+ Athena API 작업. Athena의 API 작업에 관한 전체 목록은 *Amazon Athena API 참조*의 [작업](https://docs.aws.amazon.com/athena/latest/APIReference/API_Operations.html)을 참조하세요.

다음 주제는 Athena의 특정 영역에 대한 권한에 관하여 추가 정보를 제공합니다.

**Topics**
+ [AWS 관리형 정책](security-iam-awsmanpol.md)
+ [

# 데이터 경계
](data-perimeters.md)
+ [JDBC 및 ODBC 연결을 통한 액세스](policy-actions.md)
+ [

# Athena에서 Amazon S3에 대한 액세스 제어
](s3-permissions.md)
+ [S3 버킷에 대한 계정 간 액세스](cross-account-permissions.md)
+ [AWS Glue의 데이터베이스 및 테이블에 대한 액세스](fine-grained-access-to-glue-resources.md)
+ [AWS Glue 데이터 카탈로그에 대한 교차 계정 액세스](security-iam-cross-account-glue-catalog-access.md)
+ [데이터 카탈로그의 암호화된 메타데이터에 대한 액세스 권한](access-encrypted-data-glue-data-catalog.md)
+ [작업 그룹 및 태그에 대한 액세스](workgroups-access.md)
+ [

# IAM 정책을 사용하여 작업 그룹 액세스 제어
](workgroups-iam-policy.md)
+ [IAM Identity Center 지원 작업 그룹](workgroups-identity-center.md)
+ [최소 암호화 구성](workgroups-minimum-encryption.md)
+ [

# 준비된 문에 대한 액세스 구성
](security-iam-athena-prepared-statements.md)
+ [CalledVia 컨텍스트 키 사용](security-iam-athena-calledvia.md)
+ [

# 외부 Hive 메타스토어용 Athena 데이터 커넥터에 대한 액세스 허용
](hive-metastore-iam-access.md)
+ [

# 외부 Hive 메타스토어에 대한 Lambda 함수 액세스 허용
](hive-metastore-iam-access-lambda.md)
+ [

# 커넥터 및 Athena 카탈로그를 생성하기 위해 필요한 권한
](athena-catalog-access.md)
+ [Athena 연합 쿼리에 대한 액세스 허용](federated-query-iam-access.md)
+ [UDF에 대한 액세스 허용](udf-iam-access.md)
+ [

# Athena를 통한 ML에 액세스 허용
](machine-learning-iam-access.md)
+ [

# Athena API에 대한 페더레이션 액세스 활성화
](access-federation-saml.md)

# Amazon Athena의 AWS 관리형 정책
<a name="security-iam-awsmanpol"></a>

AWS 관리형 정책은 AWS에 의해 생성되고 관리되는 독립 실행형 정책입니다. AWS 관리형 정책은 사용자, 그룹 및 역할에 권한 할당을 시작할 수 있도록 많은 일반 사용 사례에 대한 권한을 제공하도록 설계되었습니다.

AWS 관리형 정책은 모든 AWS 고객이 사용할 수 있기 때문에 특정 사용 사례에 대해 최소 권한을 부여하지 않을 수 있습니다. 사용 사례에 고유한 [고객 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)을 정의하여 권한을 줄이는 것이 좋습니다.

AWS 관리형 정책에서 정의한 권한은 변경할 수 없습니다. 만약 AWS가 AWS 관리형 정책에 정의된 권한을 업데이트할 경우 정책이 연결되어 있는 모든 보안 주체 ID(사용자, 그룹 및 역할)에도 업데이트가 적용됩니다. 새 AWS 서비스을(를) 시작하거나 새 API 작업을 기존 서비스에 이용하는 경우, AWS가 AWS 관리형 정책을 업데이트할 가능성이 높습니다.

자세한 내용은 *IAM 사용자 가이드*의 [AWS 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)을 참조하세요.

## Athena에 관리형 정책을 사용할 때의 고려 사항
<a name="managed-policies-considerations"></a>

관리형 정책은 사용하기 쉽고, 서비스가 향상됨에 따라 필요한 작업으로 자동 업데이트됩니다. Athena에 관리형 정책을 사용할 때 다음 사항에 유의하세요.
+ AWS Identity and Access Management(IAM)를 사용하여 자신 또는 다른 사용자에 대한 Amazon Athena 서비스 작업을 허용하거나 거부하려면 자격 증명 기반 정책을 사용자 또는 그룹 등의 보안 주체에 연결합니다.
+ 각 자격 증명 기반 정책은 허용되거나 거부되는 작업을 정의하는 문으로 구성됩니다. 정책을 사용자에게 연결하는 방법에 대한 자세한 내용과 단계별 지침은 *IAM 사용 설명서*의 [관리형 정책 연결](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html#attach-managed-policy-console)을 참조하세요. 작업 목록은 [Amazon Athena API 참조](https://docs.aws.amazon.com/athena/latest/APIReference/)를 참조하세요.
+  *고객 관리형* 및 *인라인* 자격 증명 기반 정책을 사용하면 정책 내에서 보다 상세한 Athena 작업을 지정하여 액세스를 세부 조정할 수 있습니다. `AmazonAthenaFullAccess` 정책을 시작점으로 사용하고 [Amazon Athena API 참조](https://docs.aws.amazon.com/athena/latest/APIReference/)에 나열된 특정 작업을 허용하거나 거부하는 것이 좋습니다. 인라인 정책에 대한 자세한 내용은 *IAM 사용 설명서*에서 [관리형 정책과 인라인 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html) 단원을 참조하세요.
+ JDBC를 사용하여 연결하는 보안 주체도 있다면, 애플리케이션에 JDBC 드라이버 자격 증명을 입력해야 합니다. 자세한 내용은 [JDBC 및 ODBC 연결을 통한 액세스 제어](policy-actions.md) 섹션을 참조하세요.
+ AWS Glue 데이터 카탈로그를 암호화한 경우 Athena에 대한 자격 증명 기반 IAM 정책에 추가 작업을 지정해야 합니다. 자세한 내용은 [Athena에서 AWS Glue Data Catalog의 암호화된 메타데이터에 대한 액세스 구성](access-encrypted-data-glue-data-catalog.md) 섹션을 참조하세요.
+ 작업 그룹을 만들고 사용할 경우 해당 정책에 작업 그룹 작업에 대한 관련 액세스 권한이 있는지 확인하세요. 자세한 정보는 [IAM 정책을 사용하여 작업 그룹 액세스 제어](workgroups-iam-policy.md) 및 [작업 그룹 정책 예제](example-policies-workgroup.md) 단원을 참조하세요.

## AWS 관리형 정책: AmazonAthenaFullAccess
<a name="amazonathenafullaccess-managed-policy"></a>

`AmazonAthenaFullAccess` 관리형 정책은 Athena에 대한 완전한 액세스 권한을 부여합니다.

액세스 권한을 제공하려면 사용자, 그룹 또는 역할에 권한을 추가합니다.
+ AWS IAM Identity Center의 사용자 및 그룹:

  권한 세트를 생성합니다. *AWS IAM Identity Center 사용자 안내서*에서 [권한 세트 생성](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html)의 지침을 따릅니다.
+ ID 제공업체를 통해 IAM에서 관리되는 사용자:

  ID 페더레이션을 위한 역할을 생성합니다. *IAM 사용자 설명서*의 [Create a role for a third-party identity provider (federation)](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html)의 지침을 따릅니다.
+ IAM 사용자:
  + 사용자가 맡을 수 있는 역할을 생성합니다. *IAM 사용자 설명서*에서 [Create a role for an IAM user](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html)의 지침을 따릅니다.
  + (권장되지 않음) 정책을 사용자에게 직접 연결하거나 사용자를 사용자 그룹에 추가합니다. *IAM 사용 설명서*에서 [사용자(콘솔)에 권한 추가](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)의 지침을 따르세요.

### 권한 그룹화
<a name="amazonathenafullaccess-managed-policy-groupings"></a>

`AmazonAthenaFullAccess` 정책은 다음 권한 집합으로 그룹화됩니다.
+ **`athena`** - 보안 주체에게 Athena 리소스에 대한 액세스를 허용합니다.
+ **`glue`** - 보안 주체에게 AWS Glue 카탈로그, 테이블 및 파티션에 대한 액세스를 허용합니다. 보안 주체가 Athena에 AWS Glue Data Catalog를 사용하려면 이 권한이 필수입니다.
+ **`s3`** - 보안 주체가 Amazon S3에서 쿼리 결과를 읽고 쓰거나, Amazon S3에 상주하는 공개적으로 사용 가능한 Athena 데이터 예제를 읽거나, 버킷을 나열할 수 있도록 허용합니다. 보안 주체가 Athena를 사용하여 Amazon S3 작업을 수행하려면 이 권한이 필수입니다.
+ **`sns`** - 보안 주체가 Amazon SNS 주제를 나열하고 주제 속성을 가져올 수 있도록 허용합니다. 이를 통해 보안 주체는 모니터링 및 알림 목적으로 Athena에 Amazon SNS 주제를 사용할 수 있습니다.
+ **`cloudwatch`** - 보안 주체에게 CloudWatch 경보의 생성, 읽기 및 삭제를 허용합니다. 자세한 내용은 [CloudWatch 및 EventBridge를 사용하여 쿼리 모니터링 및 비용 제어](workgroups-control-limits.md) 섹션을 참조하세요.
+ **`lakeformation`** - 보안 주체가 Lake Formation에 등록된 데이터 레이크 위치의 데이터에 액세스하기 위해 임시 자격 증명을 요청하도록 허용합니다. 자세한 내용은 *AWS Lake Formation 개발자 가이드*의 [기본 데이터 액세스 제어](https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-underlying-data.html)를 참조하세요.
+ **`datazone`** - 보안 주체가 Amazon DataZone 프로젝트, 도메인 및 환경을 나열할 수 있습니다. Athena에서 DataZone을 사용하는 방법에 대한 자세한 내용은 [Athena에서 Amazon DataZone 사용](datazone-using.md) 섹션을 참조하세요.
+ **`pricing`** – AWS 결제 및 비용 관리에 대한 액세스 권한을 제공합니다. 자세한 내용은 AWS 결제 및 비용 관리용 API 참조**의 [GetInstance](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_pricing_GetProducts.html)를 참조하세요.

이 정책의 권한을 보려면 AWS 관리형 정책 참조에서 [AmazonAthenaFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonAthenaFullAccess.html)를 참조하세요.

**참고**  
예제 쿼리와 샘플 데이터세트를 저장하려면 서비스 소유의 Amazon S3 버킷에 대한 액세스를 명시적으로 허용해야 합니다. 자세한 내용은 [데이터 경계](data-perimeters.md) 섹션을 참조하세요.

## AWS 관리형 정책: AWSQuicksightAthenaAccess
<a name="awsquicksightathenaaccess-managed-policy"></a>

`AWSQuicksightAthenaAccess`는 Quick과 Athena의 통합에 필요한 작업에 대한 액세스 권한을 부여합니다. `AWSQuicksightAthenaAccess` 정책을 IAM ID에 연결할 수 있습니다. Athena와 함께 Quick을 사용하는 위탁자에게만 이 정책을 연결합니다. 이 정책에는 사용되지 않거나, 현재 퍼블릭 API에 포함되지 않거나, 반드시 JDBC 및 ODBC 드라이버와 함께 사용하는 Athena를 위한 몇 가지 작업이 포함됩니다.

### 권한 그룹화
<a name="awsquicksightathenaaccess-managed-policy-groupings"></a>

`AWSQuicksightAthenaAccess` 정책은 다음 권한 집합으로 그룹화됩니다.
+ **`athena`** - 보안 주체가 Athena 리소스에 대한 쿼리를 실행할 수 있도록 허용합니다.
+ **`glue`** - 보안 주체에게 AWS Glue 데이터베이스, 테이블 및 파티션에 대한 액세스를 허용합니다. 보안 주체가 Athena에 AWS Glue Data Catalog를 사용하려면 이 권한이 필수입니다.
+ **`s3`** - 보안 주체가 Amazon S3 쿼리 결과를 쓰고 읽을 수 있도록 허용합니다.
+ **`lakeformation`** - 보안 주체가 Lake Formation에 등록된 데이터 레이크 위치의 데이터에 액세스하기 위해 임시 자격 증명을 요청하도록 허용합니다. 자세한 내용은 *AWS Lake Formation 개발자 가이드*의 [기본 데이터 액세스 제어](https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-underlying-data.html)를 참조하세요.

이 정책의 권한을 보려면 AWS 관리형 정책 참조에서 [AWSQuicksightAthenaAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSQuicksightAthenaAccess.html)를 참조하세요.

## AWS 관리형 정책으로 Athena 업데이트
<a name="managed-policies-updates"></a>

이 서비스가 해당 변경 사항을 추적하기 시작한 이후 Athena용 AWS 관리형 정책 업데이트에 대한 세부 정보를 확인합니다.


| 변경 | 설명 | 날짜 | 
| --- | --- | --- | 
| [AWSQuicksightAthenaAccess](#awsquicksightathenaaccess-managed-policy) – 기존 정책에 대한 업데이트 | Athena 사용자가 SageMaker AI Lakehouse 카탈로그에 액세스할 수 있도록 glue:GetCatalog 및 glue:GetCatalogs 권한이 추가되었습니다. | 2025년 1월 2일 | 
| [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) - 기존 정책 업데이트 | Athena 사용자가 SageMaker AI Lakehouse 카탈로그에 액세스할 수 있도록 glue:GetCatalog 및 glue:GetCatalogs 권한이 추가되었습니다. | 2025년 1월 2일 | 
| [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) - 기존 정책 업데이트 |  Athena가 공개적으로 문서화된 AWS Glue `GetCatalogImportStatus` API를 사용하여 카탈로그 가져오기 상태를 검색할 수 있도록 활성화합니다.  | 2024년 6월 18일 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) - 기존 정책 업데이트  |  Athena 사용자가 Amazon DataZone 도메인, 프로젝트 및 환경에서 작업할 수 있도록 `datazone:ListDomains`, `datazone:ListProjects` 및 `datazone:ListAccountEnvironments` 권한이 추가되었습니다. 자세한 내용은 [Athena에서 Amazon DataZone 사용](datazone-using.md) 섹션을 참조하세요.  | 2024년 1월 3일 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) - 기존 정책 업데이트  |  비용 기반 옵티마이저 기능에 대한 통계를 검색하기 위해 Athena에 AWS Glue를 직접 호출할 권한을 제공하도록 `glue:StartColumnStatisticsTaskRun`, `glue:GetColumnStatisticsTaskRun` 및 `glue:GetColumnStatisticsTaskRuns` 권한이 추가되었습니다. 자세한 내용은 [비용 기반 최적화 프로그램 사용](cost-based-optimizer.md) 섹션을 참조하세요.  | 2024년 1월 3일 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) - 기존 정책 업데이트  |  Athena는 AWS 결제 및 비용 관리에 대한 액세스를 제공하기 위해 `pricing:GetProducts`를 추가했습니다. 자세한 내용은 AWS 결제 및 비용 관리용 API 참조**의 [GetInstance](https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_pricing_GetProducts.html)를 참조하세요.  | 2023년 1월 25일 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) - 기존 정책 업데이트  |  CloudWatch 지표 값을 검색하기 위해 `cloudwatch:GetMetricData`를 추가했습니다. 자세한 내용은 *Amazon CloudWatch API 참조*에서 [GetMetricData](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_GetMetricData.html)를 참조하세요.  | 2022년 11월 14일 | 
|  [AmazonAthenaFullAccess](#amazonathenafullaccess-managed-policy) 및 [AWSQuicksightAthenaAccess](#awsquicksightathenaaccess-managed-policy) - 기존 정책에 대한 업데이트  |  Athena가 생성한 버킷에 대한 퍼블릭 액세스를 차단할 수 있도록 Athena에 `s3:PutBucketPublicAccessBlock`이 추가되었습니다.  | 2021년 7월 7일 | 
|  Athena의 변경 내용 추적 시작  |  Athena가 AWS 관리형 정책에 대한 변경 내용 추적을 시작했습니다.  | 2021년 7월 7일 | 

# 데이터 경계
<a name="data-perimeters"></a>

[데이터 경계](https://aws.amazon.com/identity/data-perimeters-on-aws/)는 신뢰할 수 있는 ID만 예상 네트워크에서 신뢰할 수 있는 리소스에 액세스하도록 하는 데 사용하는 AWS 환경의 권한 가드레일 세트입니다.

Amazon Athena는 서비스 소유의 Amazon S3 버킷을 사용하여 예제 쿼리와 샘플 데이터세트를 저장합니다. 데이터 경계를 사용하여 환경에서 액세스를 제어하는 경우 해당 Athena 기능을 사용하려면 이러한 서비스 소유 리소스에 대한 액세스를 명시적으로 허용해야 할 수 있습니다.

 다음 표에는 Athena가 액세스해야 하는 Amazon S3 버킷의 ARN, 필요한 권한, Athena에서 사용하는 ID, S3 버킷에 의존하는 기능이 나열되어 있습니다. 액세스를 허용하려면 버킷 ARN의 `<region>`을 실제 AWS 리전으로 바꾸고 Amazon S3 액세스 제어에 따라 이 버킷을 허용 목록에 추가하세요.


**Athena에서 사용하는 데이터 경계**  

| 리소스 ARN | 필수 권한 | 액세스에 사용되는 ID | 액세스 시나리오 | 
| --- | --- | --- | --- | 
|  arn:aws:s3:::athena-examples-<region>  | s3:GetObjects3:ListBucket | Athena에 액세스하는 IAM 위탁자입니다. |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/data-perimeters.html)  | 

# JDBC 및 ODBC 연결을 통한 액세스 제어
<a name="policy-actions"></a>

Athena 및 Amazon S3 버킷 같은 AWS 서비스와 리소스에 대한 액세스를 얻으려면 애플리케이션에 JDBC 또는 ODBC 드라이버 자격 증명을 제공합니다. JDBC 드라이버 또는 ODBC 드라이버를 사용한다면, IAM 권한 정책에 [AWS 관리형 정책: AWSQuicksightAthenaAccess](security-iam-awsmanpol.md#awsquicksightathenaaccess-managed-policy)에 있는 작업이 모두 포함되었는지 확인하세요.

IAM 정책을 사용할 때마다 IAM 모범 사례를 따라야 합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

## 인증 방법
<a name="security-jdbc-odbc-access-authentication"></a>

Athena JDBC 및 ODBC 드라이버는 다음 자격 증명 공급자를 비롯한 SAML 2.0 기반 인증을 지원합니다.
+ AD FS(Active Directory Federation Services)
+ Azure Active Directory(AD)
+ Okta 
+ PingFederate

자세한 내용은 해당 드라이버의 설치 및 구성 가이드를 참조하세요. 해당 가이드는 [JDBC](connect-with-jdbc.md) 및 [ODBC](connect-with-odbc.md) 드라이버 페이지에서 PDF 형식으로 다운로드할 수 있습니다. 추가 관련 정보는 다음을 참조하세요.
+ [Athena API에 대한 페더레이션 액세스 활성화](access-federation-saml.md)
+ [Athena에 대한 페더레이션 액세스를 위해 Lake Formation과 JDBC 또는 ODBC 드라이버 사용](security-athena-lake-formation-jdbc.md)
+  [ODBC, SAML 2.0 및 Okta ID 제공업체를 사용하여 Single Sign-On 구성](okta-saml-sso.md)

JDBC 및 ODBC 드라이버의 최신 버전 및 해당 설명서에 대한 자세한 내용은 [JDBC로 Amazon Athena에 연결](connect-with-jdbc.md) 및 [ODBC로 Amazon Athena에 연결](connect-with-odbc.md) 단원을 참조하세요.

# Athena에서 Amazon S3에 대한 액세스 제어
<a name="s3-permissions"></a>

ID 기반 정책, 버킷 리소스 정책, 액세스 포인트 정책 또는 위 정책들의 조합을 사용하여 Amazon S3 위치에 대한 액세스 권한을 부여할 수 있습니다. 액터가 Athena와 상호 작용하면 해당 권한이 Athena를 통해 전달되어 Athena가 액세스할 수 있는 대상이 결정됩니다. 즉, 사용자는 Athena에서 Amazon S3 버킷을 쿼리하려면 Amazon S3 버킷에 액세스할 수 있는 권한이 있어야 합니다.

IAM 정책을 사용할 때마다 IAM 모범 사례를 따라야 합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

Amazon S3에 대한 요청은 `aws:SourceIp`에 지정된 소스 IP가 아니라 Athena의 프라이빗 IPv4 주소에서 전송된다는 점에 유의하세요. 따라서 주어진 IAM 정책에서는 `aws:SourceIp` 조건을 사용하여 Amazon S3 작업에 대한 액세스를 거부할 수 없습니다. 또한 `aws:SourceVpc` 또는 `aws:SourceVpce` 조건 키에 따라 Amazon S3 리소스에 대한 액세스를 제한하거나 허용할 수 없습니다.

**참고**  
IAM Identity Center 인증을 사용하는 Athena 작업 그룹의 경우 신뢰할 수 있는 ID 전파 ID를 사용하도록 S3 Access Grants를 구성해야 합니다. 자세한 내용은 **Amazon Simple Storage Service 사용 설명서의 [S3 Access Grants and directory identities](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-directory-ids.html)를 참조하십시오.

**Topics**
+ [ID 기반 정책](#s3-permissions-identity-based-policies)
+ [버킷 리소스 정책](#s3-permissions-bucket-resource-policies)
+ [액세스 포인트 정책](#s3-permissions-aliases)
+ [CalledVia 컨텍스트 키](#s3-permissions-calledvia)
+ [

## 추가 리소스
](#s3-permissions-additional-resources)

## 자격 증명 기반 정책을 사용하여 Amazon S3 버킷에 대한 액세스 제어
<a name="s3-permissions-identity-based-policies"></a>

자격 증명 기반 정책은 IAM 사용자, 그룹 또는 역할에 연결됩니다. 이러한 정책으로 자격 증명이 수행할 수 있는 작업(권한)을 지정할 수 있습니다. 자격 증명 기반 정책을 사용하여 Amazon S3 버킷에 대한 액세스를 제어할 수 있습니다.

다음 자격 증명 기반 정책은 특정 Amazon S3 버킷에 있는 객체에 대해 `Read` 및 `Write`의 액세스를 허용합니다. 이 정책을 사용하려면 *기울임꼴 자리 표시자 텍스트*를 자체 값으로 바꿉니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ListObjectsInBucket",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
        },
        {
            "Sid": "AllObjectActions",
            "Effect": "Allow",
            "Action": "s3:*Object",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ]
        }
    ]
}
```

------

## 버킷 리소스 정책을 사용하여 Amazon S3 버킷에 대한 액세스 제어
<a name="s3-permissions-bucket-resource-policies"></a>

Amazon S3 버킷 정책을 사용하면 적절한 권한을 가진 사용자만 객체에 액세스할 수 있도록 하여 버킷의 객체 액세스를 보호할 수 있습니다. Amazon S3 정책 생성에 대한 지침은 *Amazon S3 사용 설명서*의 [Amazon S3 콘솔을 사용하여 버킷 정책 추가](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-bucket-policy.html)를 참조하세요.

다음 권한 정책 예제는 `environment: production` 태그 키 및 값이 있는 객체만 사용자가 읽을 수 있도록 제한합니다. 이 정책 예제는 `s3:ExistingObjectTag` 조건 키를 사용하여 태그 키 및 값을 지정합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/JohnDoe"
            },
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:ExistingObjectTag/environment": "production"
                }
            }
        }
    ]
}
```

------

더 많은 버킷 정책 예제는 [Amazon S3 사용 설명서](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html)의 *Amazon S3 버킷 정책 예제*를 참조하세요.

## Amazon S3 액세스 포인트를 사용하여 버킷 액세스를 보다 정밀하게 제어
<a name="s3-permissions-aliases"></a>

Amazon S3 버킷에 공유 데이터 세트이 있는 경우 수백 개의 사용 사례에 대해 액세스를 관리하는 하나의 버킷 정책을 유지하는 것은 어려울 수 있습니다.

Amazon S3 버킷 액세스 포인트, 정책 및 별칭은 이 문제를 해결하는 데 도움이 됩니다. 버킷에는 여러 액세스 포인트가 있을 수 있으며, 각 액세스 포인트는 서로 다른 방식으로 버킷에 대한 액세스 권한을 제어하는 정책이 있습니다.

생성한 각 액세스 포인트에 대해 Amazon S3는 액세스 포인트를 나타내는 별칭을 생성합니다. 별칭은 Amazon S3 버킷 이름 형식이므로 Athena에서 `CREATE TABLE` 문의 `LOCATION` 절에 이 별칭을 사용할 수 있습니다. 이렇게 하면 버킷에 대한 Athena의 액세스는 별칭이 나타내는 액세스 포인트에 대한 정책에 의해 제어됩니다.

자세한 내용은 *Amazon S3 사용 설명서*의 [Amazon S3의 테이블 위치 지정](tables-location-format.md) 및 [액세스 포인트 사용](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points.html)을 참조하세요.

## CalledVia 컨텍스트 키를 사용하여 Athena에서만 다른 서비스를 직접적으로 호출하도록 허용
<a name="s3-permissions-calledvia"></a>

보안 강화를 위해 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia) 전역 조건 컨텍스트 키를 사용할 수 있습니다. `aws:CalledVia` 조건 키에는 다른 서비스를 직접적으로 호출할 수 있는 서비스 목록이 포함되어 있습니다. 예를 들어 `aws:CalledVia` 컨텍스트 키에 Athena 서비스 보안 주체 이름 `athena.amazonaws.com`을 지정하여 Athena에서 직접적으로 호출하는 경우에만 AWS Lambda에 대한 `InvokeFunction` 호출을 허용할 수 있습니다. 자세한 내용은 [Athena용 CalledVia 컨텍스트 키 사용](security-iam-athena-calledvia.md) 섹션을 참조하세요.

## 추가 리소스
<a name="s3-permissions-additional-resources"></a>

Amazon S3 액세스 권한을 부여하는 방법에 대한 자세한 내용과 예는 다음 리소스를 참조하세요.
+ [예제 시연: *Amazon S3 사용 설명서*의 액세스 관리](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access.html).
+ AWS 지식 센터의 [Amazon S3 버킷에 있는 객체에 대해 계정 간 액세스 권한을 제공하려면 어떻게 해야 합니까?](https://aws.amazon.com/premiumsupport/knowledge-center/cross-account-access-s3/).
+ [Athena에서 Amazon S3 버킷에 대한 크로스 계정 액세스 구성](cross-account-permissions.md).

# Athena에서 Amazon S3 버킷에 대한 크로스 계정 액세스 구성
<a name="cross-account-permissions"></a>

일반적인 Amazon Athena 시나리오는 버킷 소유자와 다른 계정의 사용자가 쿼리를 수행할 수 있도록 액세스 권한을 부여하는 것입니다. 이 경우 버킷 정책을 사용하여 액세스를 부여합니다.

**참고**  
Athena에서 AWS Glue 데이터 카탈로그에 대해 계정 간 액세스를 적용하는 방법에 관한 자세한 내용은 [AWS Glue 데이터 카탈로그에 대한 크로스 계정 액세스 구성](security-iam-cross-account-glue-catalog-access.md) 단원을 참조하세요.

버킷 소유자가 생성하여 버킷 `s3://amzn-s3-demo-bucket`에 적용한 다음 예제 버킷 정책은 이와 다른 계정인 계정 `123456789123`의 모든 사용자에게 액세스를 부여합니다.

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Id": "MyPolicyID",
   "Statement": [
      {
          "Sid": "MyStatementSid",
          "Effect": "Allow",
          "Principal": {
             "AWS": "arn:aws:iam::123456789123:root"
          },
          "Action": [
             "s3:GetBucketLocation",
             "s3:GetObject",
             "s3:ListBucket",
             "s3:ListBucketMultipartUploads",
             "s3:ListMultipartUploadParts",
             "s3:AbortMultipartUpload"
          ],
          "Resource": [
             "arn:aws:s3:::amzn-s3-demo-bucket",
             "arn:aws:s3:::amzn-s3-demo-bucket/*"
          ]
       }
    ]
 }
```

------

계정의 특정 사용자에게 액세스를 부여하려면, `root` 대신 사용자를 지정하는 키로 `Principal` 키를 바꿉니다. 예를 들어 사용자 프로필 `Dave`의 경우 `arn:aws:iam::123456789123:user/Dave`를 사용합니다.

## 사용자 지정 AWS KMS 키로 암호화된 버킷에 대한 크로스 계정 액세스 구성
<a name="cross-account-permissions-kms"></a>

사용자 지정 AWS Key Management Service(AWS KMS) 키로 암호화된 Amazon S3 버킷이 있는 경우, 다른 Amazon Web Services 계정의 사용자에게 해당 버킷에 대한 액세스 권한을 부여해야 할 수 있습니다.

계정 A의 AWS KMS로 암호화된 버킷에 대한 액세스 권한을 계정 B의 사용자에게 부여하려면 다음 권한이 필요합니다.
+ 계정 A의 버킷 정책은 계정 B가 맡은 역할에 액세스 권한을 부여해야 합니다.
+ 계정 A의 AWS KMS 키 정책은 계정 B의 사용자가 맡은 역할에 액세스 권한을 부여해야 합니다.
+ 계정 B가 맡은 AWS Identity and Access Management(IAM) 역할은 계정 A의 버킷과 키 모두에 대한 액세스 권한을 부여해야 합니다.

다음 절차에서는 이러한 각 권한을 부여하는 방법에 대해 설명합니다.

**계정 A의 버킷에 대한 액세스 권한을 계정 B의 사용자에게 부여하려면**
+ 계정 A에서 [S3 버킷 정책을 검토하고](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-bucket-policy.html) 계정 B의 계정 ID에서 액세스할 수 있도록 허용하는 문이 있는지 확인합니다.

  예를 들어 다음 버킷 정책은 `s3:GetObject`에 계정 ID `111122223333`에 대한 액세스를 허용합니다.

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

****  

  ```
  {
    "Id": "ExamplePolicy1",
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "ExampleStmt1",
        "Action": [
          "s3:GetObject"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
        "Principal": {
          "AWS": [
            "111122223333"
          ]
        }
      }
    ]
  }
  ```

------

**계정 A의 AWS KMS 키 정책에서 계정 B의 사용자에게 액세스 권한을 부여하려면**

1. 계정 A의 AWS KMS 키 정책에서 계정 B가 맡은 역할에 다음 작업에 대한 권한을 부여합니다.
   +  `kms:Encrypt` 
   +  `kms:Decrypt` 
   +  `kms:ReEncrypt*` 
   +  `kms:GenerateDataKey*` 
   +  `kms:DescribeKey` 

   다음 예제에서는 하나의 IAM 역할에만 키 액세스 권한을 부여합니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AllowUseOfTheKey",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::111122223333:role/role_name"
               },
               "Action": [
                   "kms:Encrypt",
                   "kms:Decrypt",
                   "kms:ReEncrypt*",
                   "kms:GenerateDataKey*",
                   "kms:DescribeKey"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 계정 A에서 [AWS Management Console 정책 보기](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to-console-policy-view)를 사용하여 키 정책을 검토합니다.

1. 키 정책에서 다음 문에 계정 B가 보안 주체로 나열되어 있는지 확인합니다.

   ```
   "Sid": "Allow use of the key" 
   ```

1. `"Sid": "Allow use of the key"` 문이 없으면 다음 단계를 수행하세요.

   1. [콘솔 기본 보기를 사용하여](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to-console-default-view) 키 정책을 보도록 전환합니다.

   1.  계정 B의 계정 ID를 키에 대한 액세스 권한이 있는 외부 계정으로 추가합니다.

**계정 B가 맡은 IAM 역할에서 계정 A의 버킷 및 키에 대한 액세스 권한을 부여하려면**

1. 계정 B에서 IAM 콘솔을 엽니다([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)).

1. 계정 B에서 사용자와 연결된 IAM 역할을 엽니다.

1. IAM 역할에 적용된 권한 정책 목록을 검토합니다.

1. 버킷에 대한 액세스 권한을 부여하는 정책이 적용되었는지 확인합니다.

   다음 예제 문은 IAM 역할에 버킷 `amzn-s3-demo-bucket`의 `s3:GetObject` 및 `s3:PutObject` 작업에 대한 액세스 권한을 부여합니다.

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "ExampleStmt2",
         "Action": [
           "s3:GetObject",
           "s3:PutObject"
         ],
         "Effect": "Allow",
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
       }
     ]
   }
   ```

------

1. 키에 대한 액세스 권한을 부여하는 정책이 적용되었는지 확인합니다.
**참고**  
계정 B가 맡은 IAM 역할에 이미 [관리자 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html) 권한이 있으면 사용자의 IAM 정책에서 키에 대한 액세스 권한을 부여할 필요가 없습니다.

   다음 예제 문은 IAM 역할에 `arn:aws:kms:us-west-2:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd` 키를 사용할 수 있는 액세스 권한을 부여합니다.

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "ExampleStmt3",
         "Action": [
           "kms:Decrypt",
           "kms:DescribeKey",
           "kms:Encrypt",
           "kms:GenerateDataKey",
           "kms:ReEncrypt*"
         ],
         "Effect": "Allow",
         "Resource": "arn:aws:kms:us-west-2:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd"
       }
     ]
   }
   ```

------

## 버킷 객체에 대한 크로스 계정 액세스 구성
<a name="cross-account-permissions-objects"></a>

버킷의 소유 계정(계정 A) 이외의 계정(계정 C)에서 업로드한 객체에는 쿼리 계정(계정 B)에 읽기 액세스 권한을 부여하는 명시적인 객체 수준 ACL이 필요할 수 있습니다. 이러한 요구 사항을 피하려면 계정 C가 계정 A의 버킷에 객체를 배치하기 전에 계정 A의 역할을 맡아야 합니다. 자세한 내용은 [Amazon S3 버킷에 있는 객체에 대한 교차 계정 액세스 권한을 제공하려면 어떻게 해야 합니까?](https://aws.amazon.com/premiumsupport/knowledge-center/cross-account-access-s3/)를 참조하세요.

# AWS Glue Data Catalog의 데이터베이스 및 테이블에 대한 액세스 구성
<a name="fine-grained-access-to-glue-resources"></a>

Amazon Athena와 AWS Glue Data Catalog를 함께 사용하면, Athena에서 사용하는 데이터베이스 및 테이블 데이터 카탈로그 객체에 대한 리소스 수준 정책을 정의할 수 있습니다.

**참고**  
이 주제에서는 데이터베이스 및 테이블 수준 보안에 대해 설명합니다. 열 수준, 행 수준 및 셀 수준 보안 구성에 대한 자세한 내용은 [Lake Formation 포메이션의 데이터 필터링 및 셀 수준 보안](https://docs.aws.amazon.com/lake-formation/latest/dg/data-filtering.html) 섹션을 참조하세요.

IAM ID 기반 정책에서 리소스 수준 권한을 정의합니다.

**중요**  
이 단원에서는 IAM ID 기반 정책의 리소스 수준 사용 권한에 대해 설명합니다. 이는 리소스 기반 정책과는 다릅니다. 차이점에 대한 자세한 내용은 *IAM 사용 설명서*의 [ID 기반 정책 및 리소스 기반 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)을 참조하십시오.

이러한 작업에 대해서는 다음 주제를 참조하세요.


| 이 작업을 수행하려면 | 다음 주제를 참조하세요. | 
| --- | --- | 
| 리소스에 대한 액세스를 정의하는 IAM 정책 생성 | IAM 사용 설명서의 [IAM 정책 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html). | 
| AWS Glue에서 사용하는 IAM ID 기반 정책에 대해 알아봅니다. | AWS Glue 개발자 안내서의 [ID 기반 정책(IAM 정책)](https://docs.aws.amazon.com/glue/latest/dg/using-identity-based-policies.html). | 

 **이 섹션** 
+  [제한 사항 ](#access-to-glue-resources-limitations) 
+  [AWS 리전별로 카탈로그 및 데이터베이스에 대한 AWS Glue 액세스 구성](#full-access-to-default-db-per-region) 
+  [AWS Glue의 테이블 파티션 및 버전에 대한 액세스 제어](#access-to-glue-resources-table-partitions-and-versions) 
+  [데이터베이스 및 테이블 수준 권한 예](#examples-fine-grained-table-database-policies) 

## 제한 사항
<a name="access-to-glue-resources-limitations"></a>

AWS Glue Data Catalog 및 Athena에 데이터베이스 및 테이블 수준 액세스 제어를 사용할 경우 다음과 같은 제한 사항을 고려하세요.
+ IAM Identity Center 지원 Athena 작업 그룹을 사용하려면 IAM Identity Center ID를 사용하도록 Lake Formation을 구성해야 합니다. 자세한 내용은 **AWS Lake Formation 개발자 안내서의 [Integrating IAM Identity Center](https://docs.aws.amazon.com/lake-formation/latest/dg/identity-center-integration.html)를 참조하십시오.
+ 데이터베이스와 테이블에 대한 액세스만 제한할 수 있습니다. 이러한 제어는 테이블 수준에서 적용됩니다. 한 테이블의 개별 파티션에 대한 액세스는 제한할 수 없습니다. 자세한 내용은 [AWS Glue의 테이블 파티션 및 버전에 대한 액세스 제어](#access-to-glue-resources-table-partitions-and-versions) 섹션을 참조하세요.
+ AWS Glue Data Catalog에는 `CATALOG`, `DATABASE`, `TABLE` 및 `FUNCTION` 리소스가 포함되어 있습니다.
**참고**  
이 목록에서 Athena와 AWS Glue Data Catalog 간의 공통적인 리소스는 각 계정에 대한 `TABLE`, `DATABASE`, `CATALOG`입니다. `Function`은 AWS Glue에만 적용됩니다. Athena의 삭제 작업의 경우, AWS Glue 작업에 대한 권한을 포함해야 합니다. [데이터베이스 및 테이블 수준 권한 예](#examples-fine-grained-table-database-policies)을(를) 참조하세요.

  계층 구조는 다음과 같습니다. `CATALOG`는 각 계정 내에서 모든 `DATABASES`의 상위 항목이고, 각 `DATABASE`는 자신의 `TABLES` 및 `FUNCTIONS` 모두의 상위 항목입니다. 예를 들어, 계정의 카탈로그 내에서 데이터베이스 `db`에 속한 `table_test` 테이블의 경우 상위 항목은 계정 내 `db`와 카탈로그입니다. `db` 데이터베이스의 경우 상위 항목은 계정 내 카탈로그이고 하위 항목은 테이블과 함수입니다. 리소스의 계층적 구조에 대한 자세한 내용은 *AWS Glue 개발자 안내서*의 [데이터 카탈로그의 ARN 목록](https://docs.aws.amazon.com/glue/latest/dg/glue-specifying-resource-arns.html#data-catalog-resource-arns)을 참조하세요.
+ 리소스에 대한 삭제 이외의 모든 Athena 작업의 경우(예: `CREATE DATABASE`, `CREATE TABLE`, `SHOW DATABASE`, `SHOW TABLE` 또는 `ALTER TABLE`) 데이터 카탈로그에서 리소스(테이블 또는 데이터베이스)와 리소스의 모든 상위 항목에 대해 해당 작업을 호출할 권한이 필요합니다. 예를 들어, 테이블의 경우 상위 항목은 속하는 데이터베이스와 계정에 대한 카탈로그입니다. 데이터베이스의 경우 상위 항목은 계정의 카탈로그입니다. [데이터베이스 및 테이블 수준 권한 예](#examples-fine-grained-table-database-policies)을(를) 참조하세요.
+ Athena에서의 삭제 작업(예: `DROP DATABASE` 또는 `DROP TABLE`)의 경우에는 데이터 카탈로그에서 이 리소스의 모든 상위 항목 및 하위 항목에 대해 삭제 작업을 호출할 권한이 추가로 필요합니다. 예를 들어, 데이터베이스를 삭제하려면 데이터베이스, 카탈로그(데이터베이스의 상위 항목)과 모든 테이블, 사용자 정의 함수(테이블의 하위 항목)에 대한 권한이 필요합니다. 테이블은 하위 항목이 없습니다. `DROP TABLE`을 실행하려면 테이블, 테이블이 속한 데이터베이스 및 카탈로그에서 이 작업에 대한 사용 권한이 필요합니다. [데이터베이스 및 테이블 수준 권한 예](#examples-fine-grained-table-database-policies)을(를) 참조하세요.

## AWS 리전별로 카탈로그 및 데이터베이스에 대한 AWS Glue 액세스 구성
<a name="full-access-to-default-db-per-region"></a>

Athena에서 AWS Glue를 사용하려면 AWS 리전당 계정의 AWS Glue Data Catalog 및 데이터베이스에 대한 액세스 권한을 부여하는 정책이 필요합니다. 데이터베이스를 생성하려면 `CreateDatabase` 권한도 필요합니다. 다음 예제 정책에서는 AWS 리전, AWS 계정 ID 및 데이터베이스 이름을 사용자의 고유한 이름으로 바꿉니다.

```
{
   "Sid": "DatabasePermissions",
   "Effect": "Allow",
   "Action": [
      "glue:GetDatabase", 
      "glue:GetDatabases",
      "glue:CreateDatabase"
   ],
   "Resource": [
     "arn:aws:glue:us-east-1:123456789012:catalog",
     "arn:aws:glue:us-east-1:123456789012:database/default"
   ]
}
```

## AWS Glue의 테이블 파티션 및 버전에 대한 액세스 제어
<a name="access-to-glue-resources-table-partitions-and-versions"></a>

AWS Glue에서 테이블에는 파티션 및 버전이 있을 수 있습니다. 테이블 버전 및 파티션은 AWS Glue에서 독립적인 리소스로 간주되지 않습니다. 테이블과 테이블의 상위 리소스에 대한 액세스 권한을 부여해 테이블 버전 및 파티션에 대한 액세스 권한을 제공합니다.

액세스 제어를 위해 다음 액세스 권한이 적용됩니다.
+ 제어는 테이블 수준에서 적용됩니다. 데이터베이스와 테이블에 대한 액세스만 제한할 수 있습니다. 예를 들어, 분할된 테이블에 대한 액세스를 허용하는 경우 해당 액세스 권한은 테이블의 모든 파티션에 적용됩니다. 한 테이블의 개별 파티션에 대한 액세스는 제한할 수 없습니다.
**중요**  
AWS Glue에서 파티션에 대해 작업을 실행하려면 카탈로그, 데이터베이스 및 테이블 수준에서 파티션 작업에 대한 권한이 필요합니다. 테이블 내의 파티션에 액세스하는 것만으로는 충분하지 않습니다. 예를 들어 `myDB` 데이터베이스의 `myTable` 테이블에서 `GetPartitions`를 실행하려면 카탈로그, `myDB` 데이터베이스 및 `myTable` 리소스에 대한 `glue:GetPartitions` 권한을 부여해야 합니다.
+ 액세스 제어는 테이블 버전에는 적용되지 않습니다. 파티션과 마찬가지로, 테이블의 이전 버전에 대한 액세스 권한은 AWS Glue에서 테이블, 테이블 상위 항목 및 테이블 버전 API에 대한 액세스를 통해 부여됩니다.

AWS Glue 작업의 권한에 대한 자세한 내용은 *AWS Glue 개발자 안내서*의 [AWS Glue API 권한: 작업 및 리소스 참조](https://docs.aws.amazon.com/glue/latest/dg/api-permissions-reference.html)를 참조하세요.

## 데이터베이스 및 테이블 수준 권한 예
<a name="examples-fine-grained-table-database-policies"></a>

다음 표는 Athena에서 데이터베이스 및 테이블에 대한 액세스를 허용하는 IAM 자격 증명 기반 정책의 예제를 보여줍니다. 처음에는 이 예제로 시작한 다음, 자신의 필요에 따라 특정 데이터베이스와 테이블에 대한 특정 작업을 허용하거나 거부하도록 수정하는 방법을 권장합니다.

이 예제에는 Athena와 AWS Glue를 함께 사용할 수 있도록 데이터베이스 및 카탈로그에 대한 액세스가 포함됩니다. 여러 AWS 리전의 경우 리전별로 한 줄씩 각각의 데이터베이스 및 카탈로그에 대해 유사한 정책을 포함합니다.

예제에서는 `example_db` 데이터베이스와 `test` 테이블 이름을 사용자의 고유한 데이터베이스 및 테이블 이름으로 바꿉니다.


| DDL 문 | 리소스에 대한 액세스를 부여하는 IAM 액세스 정책 예제 | 
| --- | --- | 
| ALTER DATABASE | example\$1db 데이터베이스의 속성을 수정할 수 있습니다.<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:UpdateDatabase"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />}</pre> | 
| 데이터베이스 생성 | example\$1db(이)라는 데이터베이스를 생성할 수 있습니다.<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:CreateDatabase"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />}<br /></pre> | 
| CREATE TABLE | example\$1db 데이터베이스에 test(이)라는 테이블을 생성할 수 있습니다.<pre>{<br />   "Sid": "DatabasePermissions",<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase", <br />      "glue:GetDatabases"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db"<br />   ]<br />},<br />{<br />   "Sid": "TablePermissions",<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetTables",<br />      "glue:GetTable",<br />      "glue:GetPartitions",<br />      "glue:CreateTable"<br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db",<br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />   ]<br />}</pre> | 
| DROP DATABASE | example\$1db 데이터베이스를 포함된 모든 테이블과 함께 삭제할 수 있습니다.<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:DeleteDatabase",<br />      "glue:GetTables", <br />      "glue:GetTable", <br />      "glue:DeleteTable" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/*", <br />     "arn:aws:glue:us-east-1:123456789012:userDefinedFunction/example_db/*"<br />   ]<br /> }</pre> | 
| DROP TABLE | example\$1db 데이터베이스에 test(이)라는 분할된 테이블을 삭제할 수 있습니다. 테이블에 파티션이 없다면 파티션 작업을 포함하지 마세요.<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetTable",<br />      "glue:DeleteTable", <br />      "glue:GetPartitions",<br />      "glue:GetPartition",<br />      "glue:DeletePartition" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />   ]<br /> }</pre> | 
| MSCK REPAIR TABLE | example\$1db 데이터베이스에서 test라는 테이블에 Hive 호환 파티션을 추가한 후 카탈로그 메타데이터를 업데이트할 수 있습니다.<pre>{<br />    "Effect": "Allow",<br />    "Action": [<br />        "glue:GetDatabase",<br />        "glue:CreateDatabase",<br />        "glue:GetTable",<br />        "glue:GetPartitions",<br />        "glue:GetPartition",<br />        "glue:BatchCreatePartition"<br />    ],<br />    "Resource": [<br />      "arn:aws:glue:us-east-1:123456789012:catalog",<br />      "arn:aws:glue:us-east-1:123456789012:database/example_db", <br />      "arn:aws:glue:us-east-1:123456789012:table/example_db/test"<br />    ]<br />}</pre> | 
| SHOW DATABASES | AWS Glue Data Catalog의 모든 데이터베이스를 나열할 수 있습니다.<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetDatabases" <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/*"<br />   ]<br /> }</pre> | 
| SHOW TABLES | example\$1db의 모든 테이블을 나열할 수 있습니다.<pre>{<br />   "Effect": "Allow",<br />   "Action": [<br />      "glue:GetDatabase",<br />      "glue:GetTables"    <br />   ],<br />   "Resource": [<br />     "arn:aws:glue:us-east-1:123456789012:catalog",<br />     "arn:aws:glue:us-east-1:123456789012:database/example_db",  <br />     "arn:aws:glue:us-east-1:123456789012:table/example_db/*"<br />   ]<br />}</pre> | 

# AWS Glue 데이터 카탈로그에 대한 크로스 계정 액세스 구성
<a name="security-iam-cross-account-glue-catalog-access"></a>

Athena의 계정 간 AWS Glue 카탈로그 기능을 사용해 자신의 계정이 아닌 다른 계정의 AWS Glue 카탈로그를 등록할 수 있습니다. AWS Glue에 요구되는 IAM 권한을 구성하고 카탈로그를 Athena [DataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_DataCatalog.html) 리소스로 등록하면 Athena를 사용해 계정 간 쿼리를 실행할 수 있습니다. Athena 콘솔을 사용하여 다른 계정의 카탈로그를 등록하는 방법에 대한 자세한 내용은 [다른 계정의 데이터 카탈로그 등록](data-sources-glue-cross-account.md) 단원을 참조하세요.

AWS Glue에서 계정 간 액세스에 대한 자세한 내용은 *AWS Glue 개발자 안내서*의 [계정 간 액세스 권한 부여](https://docs.aws.amazon.com/glue/latest/dg/cross-account-access.html)를 참조하세요.

## 시작하기 전에
<a name="security-iam-cross-account-glue-catalog-access-before-you-start"></a>

이 기능은 기존의 Athena `DataCatalog` 리소스 API 및 계정 간 액세스를 활성화하는 기능을 사용하므로 시작하기 전에 다음 리소스를 읽어보는 것이 좋습니다.
+ [데이터 원본에 연결](work-with-data-stores.md) - Athena와 함께 AWS Glue, Hive 또는 Lambda 데이터 카탈로그 소스를 사용하는 주제를 포함하고 있습니다.
+ [데이터 카탈로그 예제 정책](datacatalogs-example-policies.md) - 데이터 카탈로그에 대한 액세스를 제어하는 정책을 작성하는 방법을 보여 줍니다.
+ [Hive 메타스토어와 함께 AWS CLI 사용](datastores-hive-cli.md) - Hive 메타스토어와 함께 AWS CLI를 사용하는 방법을 보여줍니다. 다른 데이터 소스에 적용한 사용 사례도 포함되어 있습니다.

## 고려 사항 및 제한 사항
<a name="security-iam-cross-account-glue-catalog-access-considerations-and-limitations"></a>

현재 Athena 계정 간 AWS Glue 카탈로그에는 다음과 같은 제한 사항이 있습니다.
+ Athena 엔진 버전 2 이상이 지원되는 AWS 리전에서만 기능을 사용할 수 있습니다. Athena 엔진 버전에 대한 자세한 내용은 [Athena 엔진 버전 관리](engine-versions.md) 단원을 참조하세요. 작업 그룹의 엔진 버전을 업그레이드하려면 [Athena 엔진 버전 변경](engine-versions-changing.md) 섹션을 참조하세요.
+ 다른 계정의 AWS Glue Data Catalog를 자신의 계정에 등록할 때 해당 특정 리전에 있는 다른 계정의 데이터에만 연결되는 리전별 `DataCatalog` 리소스를 생성합니다.
+ 현재 계정 간 AWS Glue 카탈로그를 포함한 `CREATE VIEW` 문은 지원되지 않습니다.
+ AWS 관리형 키를 사용하여 암호화된 카탈로그는 여러 계정에서 쿼리할 수 없습니다. 여러 계정에서 쿼리하려는 카탈로그의 경우 고객 관리형 키(`KMS_CMK`)를 대신 사용하세요. 고객 관리형 및 AWS 관리형 키의 차이점에 대한 자세한 내용은 **AWS Key Management Service 개발자 안내서의 [고객 키 및 AWS 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-mgmt                     )를 참조하세요.

## 시작하기
<a name="security-iam-cross-account-glue-catalog-getting-started"></a>

다음 상황에서는 다음 예제처럼 '차용자' 계정(666666666666)이 AWS Glue 카탈로그를 참조하는 `SELECT` 쿼리를 실행하려 합니다. 이 카탈로그는 '소유자' 계정(999999999999)에 속해 있습니다.

```
SELECT * FROM ownerCatalog.tpch1000.customer
```

다음 절차에서 1a 및 1b 단계는 차용자와 소유자의 관점에서 소유자 계정의 AWS Glue 리소스에 대한 액세스 권한을 차용자 계정에 부여하는 방법을 보여줍니다. 이 예제에서는 `tpch1000` 데이터베이스와 `customer` 테이블에 액세스 권한을 부여합니다. 이러한 예제 이름을 요구 사항에 맞게 변경합니다.

### 1a 단계: 소유자의 AWS Glue 리소스에 액세스하는 정책을 가진 차용자 역할 생성
<a name="security-iam-cross-account-glue-catalog-access-step-1a"></a>

소유자 계정의 AWS Glue 리소스에 대한 액세스 권한이 포함된 차용자 계정 역할을 생성하려면 AWS Identity and Access Management(IAM) 콘솔 또는 [IAM API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_Operations.html)를 사용할 수 있습니다. 다음 절차에서는 IAM 콘솔을 사용합니다.

**차용자 역할 및 정책을 생성하여 소유자 계정의 AWS Glue 리소스에 액세스**

1. 차용자 계정에서 IAM 콘솔에 로그인합니다([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)).

1. 서비스 탐색 창에서 **액세스 관리**를 확장하고 **정책**을 선택합니다.

1. **정책 생성**을 선택합니다.

1. **정책 편집기**에서 **JSON**을 선택합니다.

1. 정책 편집기에서 다음 정책을 입력한 다음 필요에 따라 수정합니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "glue:*",
               "Resource": [
                   "arn:aws:glue:us-east-1:999999999999:catalog",
                   "arn:aws:glue:us-east-1:999999999999:database/tpch1000",
                   "arn:aws:glue:us-east-1:999999999999:table/tpch1000/customer"
               ]
           }
       ]
   }
   ```

------

1. **다음**을 선택합니다.

1. **검토 및 생성** 페이지의 **정책 이름**에 정책 이름(예: **CrossGluePolicyForBorrowerRole**)을 입력합니다.

1. **정책 생성**을 선택합니다.

1. 탐색 창에서 **Roles**를 선택합니다.

1. **역할 생성(Create role)**을 선택합니다.

1. **신뢰할 수 있는 엔티티** 페이지에서 **AWS 계정** 선택 후 **다음**을 선택합니다.

1. **권한 추가** 페이지에서 검색 상자에 생성한 정책의 이름을 입력합니다(예: **CrossGluePolicyForBorrowerRole**).

1. 정책 이름 옆에 있는 확인란을 선택하고, **다음**을 선택합니다.

1. **이름, 검토 및 생성** 페이지에서 **역할 이름(Role name)**에서 역할 이름을 입력합니다(예: **CrossGlueBorrowerRole**).

1. **역할 생성**을 선택합니다.

### 1b 단계: 차용자에 대해 AWS Glue 액세스 권한을 부여하는 소유자 정책 생성
<a name="security-iam-cross-account-glue-catalog-access-step-1b"></a>

소유자 계정(999999999999)으로부터 차용자의 역할에 AWS Glue 액세스 권한을 부여하려면 AWS Glue 콘솔 또는 AWS Glue [PutResourcePolicy](https://docs.aws.amazon.com/glue/latest/webapi/API_PutResourcePolicy.html) API 작업을 사용합니다. 다음 절차에서는 AWS Glue 콘솔을 사용합니다.

**소유자로부터 차용자 계정에 AWS Glue 액세스 권한을 부여하려면**

1. 소유자 계정에서 AWS Glue 콘솔에 로그인합니다([https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)).

1. 탐색 창에서 **데이터 카탈로그**를 확장하고 **카탈로그 설정**을 선택합니다.

1. **권한(Permissions)** 상자에 다음과 같은 정책을 입력합니다. *rolename*에 1a 단계에서 차용자 계정이 생성한 역할(예: **CrossGlueBorrowerRole**)을 입력합니다. 권한 범위를 늘리고자 한다면 데이터베이스 및 테이블 리소스 유형에 와일드카드 문자 `*`를 사용할 수 있습니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "AWS": [
                       "arn:aws:iam::666666666666:user/username",
                       "arn:aws:iam::666666666666:role/rolename"
                   ]
               },
               "Action": "glue:*",
               "Resource": [
                   "arn:aws:glue:us-east-1:999999999999:catalog",
                   "arn:aws:glue:us-east-1:999999999999:database/tpch1000",
                   "arn:aws:glue:us-east-1:999999999999:table/tpch1000/customer"
               ]
           }
       ]
   }
   ```

------

완료 후 [AWS Glue API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api.html)를 사용해 계정 간 호출을 몇 차례 테스트하여 권한이 예상대로 구성되었는지 확인하는 것이 좋습니다.

### 2단계: 차용자가 소유자 계정에 속한 AWS Glue Data Catalog 등록
<a name="security-iam-cross-account-glue-catalog-access-step-2"></a>

다음 절차는 Athena 콘솔을 사용하여 소유자 Amazon Web Services 계정의 AWS Glue Data Catalog를 데이터 소스로 구성하는 방법을 보여줍니다. 콘솔 대신 API 작업을 사용하여 카탈로그를 등록하는 방법에 대한 자세한 내용은 [(선택 사항) API를 사용하여 소유자 계정에 속한 Athena 데이터 카탈로그 등록](#security-iam-cross-account-glue-catalog-access-step-2-api) 단원을 참조하세요.

**다른 계정에 속한 AWS Glue Data Catalog 등록**

1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home)에서 Athena 콘솔을 엽니다.

1. 콘솔 탐색 창이 표시되지 않으면 왼쪽의 확장 메뉴를 선택합니다.  
![\[확장 메뉴를 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/nav-pane-expansion.png)

1. **관리**를 확장하고 **데이터 소스**를 선택합니다.

1. 오른쪽 위에서 **데이터 소스 생성(Create data source)**을 선택합니다.

1. **데이터 소스 선택** 페이지의 **데이터 소스**에서 **S3 - AWS Glue Data Catalog**를 선택하고 **다음**을 선택합니다.

1. **데이터 원본 세부 정보 입력** 페이지의 **AWS Glue Data Catalog** 섹션에서 **AWS Glue Data Catalog 선택**에 대해 **다른 계정의 AWS Glue Data Catalog**를 선택합니다.

1. **데이터 세트 세부 정보(Dataset details)**에 다음 정보를 입력합니다.
   + **데이터 소스 이름(Data source name)** – 다른 계정의 데이터 카탈로그를 참조할 때 SQL 쿼리에 사용할 이름을 입력합니다.
   + **설명(Description)** - (선택 사항) 다른 계정의 데이터 카탈로그에 대한 설명을 입력합니다.
   + **카탈로그 ID(Catalog ID)** - 데이터 카탈로그가 속한 계정의 Amazon Web Services 계정 ID(12자리)를 입력합니다. Amazon Web Services 계정 ID는 카탈로그 ID입니다.

1. (선택 사항) **태그**를 확장하고 데이터 소스에 연결할 키 값 페어를 입력합니다. 태그에 대한 자세한 내용은 [Athena 리소스 태깅](tags.md) 섹션을 참조하세요.

1. **다음**을 선택합니다.

1. **검토 및 생성(Review and create)** 페이지에서 제공한 정보를 검토한 다음 **데이터 소스 생성(Create data source)**을 선택합니다. **데이터 소스 세부 정보(Data source details)** 페이지는 등록한 데이터 카탈로그에 대한 데이터베이스 및 태그를 나열합니다.

1. **데이터 소스 및 카탈로그**를 선택합니다. 등록한 데이터 카탈로그가 **데이터 소스 이름(Data source name)** 열에 나열됩니다.

1. 새 데이터 카탈로그에 대한 정보를 보거나 편집하려면 카탈로그를 선택한 다음 **작업(Actions)**, **편집(Edit)**을 선택합니다.

1. 새 데이터 카탈로그를 삭제하려면 카탈로그를 선택한 다음 **작업(Actions)**, **삭제(Delete)**를 선택합니다.

### 3단계: 차용자가 쿼리 제출
<a name="security-iam-cross-account-glue-catalog-access-step-4"></a>

다음 예제처럼 차용자가 *catalog*.*database*.*table* 구문을 사용해 카탈로그를 참조하는 쿼리를 제출합니다.

```
SELECT * FROM ownerCatalog.tpch1000.customer
```

정규화된 구문을 사용하는 대신 차용자는 [QueryExecutionContext](https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecutionContext.html)를 통해 이를 전달하여 상황에 맞게 카탈로그를 지정할 수도 있습니다.

## (선택 사항) 추가 Amazon S3 권한 구성
<a name="security-iam-cross-account-glue-catalog-access-additional-s3-permissions"></a>
+ 차용자 계정이 Athena 쿼리를 사용하여 소유자 계정의 테이블에 새 데이터를 쓰는 경우 테이블이 소유자 계정에 있더라도 소유자는 Amazon S3의 해당 데이터에 대한 액세스 권한을 자동으로 보유하지 않습니다. 달리 구성하지 않는 한 차용자가 Amazon S3에 있는 정보의 객체 소유자이기 때문입니다. 소유자에게 데이터에 대한 액세스 권한을 부여하려면 추가 단계로 개체에 대한 권한을 적절히 설정합니다.
+ [MSCK REPAIR TABLE](msck-repair-table.md) 같은 특정한 계정 간 DDL 작업은 Amazon S3 권한을 요구합니다. 예를 들어 소유자 계정 S3 버킷에 있는 데이터를 포함한 소유자 계정의 테이블에 대해 차용자 계정이 계정 간 `MSCK REPAIR` 작업을 수행할 경우 쿼리가 성공하려면 해당 버킷이 차용자가 맡은 역할에 권한을 부여해야 합니다.

버킷 권한 부여에 대한 자세한 내용은 *Amazon Simple Storage Service 사용 설명서*의 [ACL 버킷 권한을 설정하는 방법](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/set-bucket-permissions.html)을 참조하세요.

## (선택 사항) 카탈로그를 동적으로 사용
<a name="security-iam-cross-account-glue-catalog-access-dynamic-catalogs"></a>

어떤 경우에는 계정 간 AWS Glue 카탈로그를 등록하는 사전 단계 없이 신속히 테스트를 수행해야 할 수 있습니다. 앞서 이 설명서에서 설명한 필수 IAM 및 Amazon S3 권한을 올바르게 구성했다면 `DataCatalog` 리소스를 생성하지 않고도 계정 간 쿼리를 동적으로 수행할 수 있습니다.

등록 없이 카탈로그를 명시적으로 참조하려면 다음 예제의 구문을 사용합니다.

```
SELECT * FROM "glue:arn:aws:glue:us-east-1:999999999999:catalog".tpch1000.customer
```

"`glue:<arn>`" 형식을 사용합니다. 여기서 `<arn>`은(는) 사용하고자 하는 [AWS Glue Data Catalog ARN](https://docs.aws.amazon.com/glue/latest/dg/glue-specifying-resource-arns.html#data-catalog-resource-arns)입니다. 이 예제에서 Athena는 이 구문을 사용하여 마치 `DataCatalog` 객체를 별도로 생성한 것처럼 999999999999 계정의 AWS Glue 데이터 카탈로그를 동적으로 가리키도록 할 수 있습니다.

### 동적 카탈로그 사용에 대한 참고 사항
<a name="security-iam-cross-account-glue-catalog-access-notes-dynamic-catalogs"></a>

동적 카탈로그를 사용할 때 다음 사항에 유의해야 합니다.
+ 동적 카탈로그를 사용하려면 Athena 데이터 카탈로그 API 작업에 일반적으로 사용하는 IAM 권한이 필요합니다. 주된 차이점은 데이터 카탈로그 리소스 이름이 `glue:*` 이름 지정 규칙을 따른다는 것입니다.
+ 카탈로그 ARN은 쿼리가 실행되는 리전과 동일한 리전에 속해야 합니다.
+ DML 쿼리 또는 뷰에서 동적 카탈로그를 사용할 경우 이스케이프된 큰따옴표(`\"`)로 묶어야 합니다. DDL 쿼리에서 동적 카탈로그를 사용할 경우 백틱 문자(```)로 묶어야 합니다.

## (선택 사항) API를 사용하여 소유자 계정에 속한 Athena 데이터 카탈로그 등록
<a name="security-iam-cross-account-glue-catalog-access-step-2-api"></a>

2단계에서 설명한 대로 Athena 콘솔을 사용하는 대신 API 작업을 사용하여 소유자 계정에 속한 데이터 카탈로그를 등록할 수 있습니다.

Athena [DataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_DataCatalog.html) 리소스의 생성자는 Athena [CreateDataCatalog](https://docs.aws.amazon.com/athena/latest/APIReference/API_CreateDataCatalog.html) API 작업을 실행하는 데 필요한 권한이 있어야 합니다. 요구 사항에 따라 추가 API 작업에 액세스해야 할 수도 있습니다. 자세한 내용은 [데이터 카탈로그 예제 정책](datacatalogs-example-policies.md) 단원을 참조하세요.

다음 `CreateDataCatalog` 요청 본문은 계정 간 액세스를 위한 AWS Glue 카탈로그를 등록합니다.

```
# Example CreateDataCatalog request to register a cross-account Glue catalog:
{
    "Description": "Cross-account Glue catalog",
    "Name": "ownerCatalog",
    "Parameters": {"catalog-id" : "999999999999"  # Owner's account ID
    },
    "Type": "GLUE"
}
```

다음 샘플 코드는 Java 클라이언트를 사용하여 `DataCatalog` 객체를 생성합니다.

```
# Sample code to create the DataCatalog through Java client
CreateDataCatalogRequest request = new CreateDataCatalogRequest()
    .withName("ownerCatalog")
    .withType(DataCatalogType.GLUE)
    .withParameters(ImmutableMap.of("catalog-id", "999999999999"));

athenaClient.createDataCatalog(request);
```

이 단계가 끝나면 [ListDataCatalogs](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListDataCatalogs.html) API 작업을 호출할 때 차용자에게 `ownerCatalog`가 표시되어야 합니다.

## 추가 리소스
<a name="security-iam-cross-account-glue-catalog-access-additional-resources"></a>
+ [다른 계정의 데이터 카탈로그 등록](data-sources-glue-cross-account.md)
+ *AWS Prescriptive Guidance Patterns* 안내서의 [Configure cross-account access to a shared AWS Glue Data Catalog using Amazon Athena](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-a-shared-aws-glue-data-catalog-using-amazon-athena.html).
+ *AWS 빅 데이터 블로그*의 [Query cross-account AWS Glue Data Catalogs using Amazon Athena](https://aws.amazon.com/blogs/big-data/query-cross-account-aws-glue-data-catalogs-using-amazon-athena/)
+ *AWS Glue 개발자 안내서*의 [Granting cross-account access](https://docs.aws.amazon.com/glue/latest/dg/cross-account-access.html) 

# Athena에서 AWS Glue Data Catalog의 암호화된 메타데이터에 대한 액세스 구성
<a name="access-encrypted-data-glue-data-catalog"></a>

Amazon Athena와 함께 AWS Glue Data Catalog를 사용하는 경우 AWS Glue 콘솔이나 API를 이용해 AWS Glue Data Catalog에서 암호화를 사용할 수 있습니다. 자세한 내용은 *AWS Glue 개발자 안내서*의 [데이터 카탈로그 암호화](https://docs.aws.amazon.com/glue/latest/dg/encrypt-glue-data-catalog.html)를 참조하세요.

AWS Glue Data Catalog를 암호화한다면, Athena에 액세스하는 데 사용하는 모든 정책에 다음 작업을 추가해야 합니다.

IAM 정책을 사용할 때는 항상 IAM 모범 사례를 따라야 합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

# 작업 그룹 및 태그에 대한 액세스 구성
<a name="workgroups-access"></a>

작업 그룹은 Athena에서 관리하는 리소스입니다. 따라서 해당 작업 그룹 정책에서 `workgroup`을 입력으로 받는 작업을 사용할 경우 다음과 같이 작업 그룹의 ARN을 지정해야 하며 `workgroup-name`이 작업 그룹의 이름입니다..

```
"Resource": [arn:aws:athena:region:AWSAcctID:workgroup/workgroup-name]
```

예를 들어 Amazon Web Services 계정 `123456789012`의 `us-west-2` 리전에 있는 `test_workgroup`이라는 이름의 작업 그룹의 경우 다음 ARN을 사용하여 작업 그룹을 리소스로 지정합니다.

```
"Resource":["arn:aws:athena:us-east-2:123456789012:workgroup/test_workgroup"]
```

신뢰할 수 있는 ID 전파(TIP) 지원 작업 그룹에 액세스하려면 Athena [GetWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetWorkGroup.html) API 작업의 응답으로 반환되는 `IdentityCenterApplicationArn`에 IAM Identity Center 사용자를 할당해야 합니다.
+ 작업 그룹 정책 목록은 [작업 그룹 정책 예제](example-policies-workgroup.md) 단원을 참조하세요.
+ 작업 그룹에 대한 태그 기반 정책 목록은 [태그 기반 IAM 액세스 제어 정책 사용](tags-access-control.md) 단원을 참조하세요.
+ IAM 정책을 생성하는 방법에 대한 자세한 내용은 [IAM 정책을 사용하여 작업 그룹 액세스 제어](workgroups-iam-policy.md) 단원을 참조하세요.
+ Amazon Athena 작업의 전체 목록은 [Amazon Athena API 참조](https://docs.aws.amazon.com/athena/latest/APIReference/)의 API 작업 이름을 참조하세요.
+ IAM 정책에 대한 자세한 내용은 [IAM 사용 설명서](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor)의 *시각적 편집기로 정책 생성*을 참조하세요.

IAM 정책을 사용할 때는 항상 IAM 모범 사례를 따라야 합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

# IAM 정책을 사용하여 작업 그룹 액세스 제어
<a name="workgroups-iam-policy"></a>

작업 그룹에 대한 액세스를 제어하려면 리소스 수준 IAM 권한이나 ID 기반 IAM 정책을 사용합니다. IAM 정책을 사용할 때는 항상 IAM 모범 사례를 따라야 합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

**참고**  
신뢰할 수 있는 ID 전파 지원 작업 그룹에 액세스하려면 Athena [GetWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetWorkGroup.html) API 작업의 응답으로 반환되는 `IdentityCenterApplicationArn`에 IAM Identity Center 사용자를 할당해야 합니다.

다음은 Athena용 절차입니다.

IAM용 정보는 이 단원 끝부분에 나와 있는 링크를 참조하세요. JSON 작업 그룹 정책 예제에 대한 자세한 내용은 [작업 그룹 정책 예제](example-policies-workgroup.md) 단원을 참조하세요.

**IAM 콘솔에서 시각적 편집기를 사용하려면 작업 그룹 정책을 만듭니다.**

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

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

1. **시각적 편집기**(Visual editor) 탭에서 **서비스 선택**(Choose a service)을 선택합니다. 그런 다음 Athena를 선택하여 정책에 추가합니다.

1. **작업 선택**(Select actions)을 선택한 후 정책에 추가할 작업을 선택합니다. 시각적 편집기에 Athena에서 사용할 수 있는 작업이 표시됩니다. 자세한 내용은 *서비스 권한 부여 참조*에서 [Amazon Athena에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonathena.html)를 참조하세요.

1. **작업 추가**(add actions)를 선택하여 특정 작업을 입력하거나 와일드카드(\$1)를 사용하여 여러 개의 작업을 지정합니다.

   기본적으로 사용자가 생성하는 정책은 사용자가 선택하는 작업을 허용합니다. Athena의 `workgroup` 리소스에 대해 리소스 수준 권한을 지원하는 작업을 하나 이상 선택하면 편집기에 `workgroup` 리소스가 나열됩니다.

1. **리소스**를 선택하여 정책에 대한 특정 작업 그룹을 지정합니다. JSON 작업 그룹 정책 예제는 [작업 그룹 정책 예제](example-policies-workgroup.md) 단원을 참조하세요.

1. 다음과 같이 `workgroup` 리소스를 지정합니다.

   ```
   arn:aws:athena:<region>:<user-account>:workgroup/<workgroup-name>
   ```

1. **정책 검토**(Review policy)를 선택한 후 생성하려는 정책에 대한 **이름**(Name)과 **설명**(Description)(선택 사항)을 입력합니다. 정책 요약을 검토하여 의도한 권한을 부여했는지 확인합니다.

1. **정책 생성**(Create policy)을 선택하고 새로운 정책을 저장합니다.

1. ID 기반 정책을 사용자, 그룹 또는 역할에 연결합니다.

자세한 내용은 *서비스 권한 부여 참조*와 *IAM 사용 설명서*에서 다음 주제를 참조하세요.
+  [Amazon Athena에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonathena.html) 
+  [시각적 편집기를 사용하여 정책 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor) 
+  [IAM 정책 추가 및 제거](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html) 
+  [리소스에 대한 액세스 제어](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_controlling.html#access_controlling-resources) 

JSON 작업 그룹 정책 예제는 [작업 그룹 정책 예제](example-policies-workgroup.md) 단원을 참조하세요.

Amazon Athena 작업의 전체 목록은 [Amazon Athena API 참조](https://docs.aws.amazon.com/athena/latest/APIReference/)의 API 작업 이름을 참조하세요.

# 작업 그룹 정책 예제
<a name="example-policies-workgroup"></a>

이 단원에서는 작업 그룹에 다양한 작업을 허용하는 데 사용할 수 있는 예제 정책을 설명합니다. IAM 정책을 사용할 때는 항상 IAM 모범 사례를 따라야 합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

작업 그룹은 Athena에서 관리하는 IAM 리소스입니다. 따라서 해당 작업 그룹 정책에서 `workgroup`을 입력으로 받는 작업을 사용할 경우 다음과 같이 작업 그룹의 ARN을 지정해야 합니다.

```
"Resource": [arn:aws:athena:<region>:<user-account>:workgroup/<workgroup-name>]
```

`<workgroup-name>`은 작업 그룹의 이름입니다. 예를 들어 다음과 같이 `test_workgroup`이라는 작업 그룹을 리소스로 지정할 수 있습니다.

```
"Resource": ["arn:aws:athena:us-east-1:123456789012:workgroup/test_workgroup"]
```

Amazon Athena 작업의 전체 목록은 [Amazon Athena API 참조](https://docs.aws.amazon.com/athena/latest/APIReference/)의 API 작업 이름을 참조하세요. IAM 정책에 대한 자세한 내용은 *IAM 사용 설명서*의 [시각적 편집기로 정책 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-visual-editor)을 참조하세요. IAM 정책을 생성하는 방법에 대한 자세한 내용은 [IAM 정책을 사용하여 작업 그룹 액세스 제어](workgroups-iam-policy.md) 단원을 참조하세요.
+  [Example policy for full access to all workgroups](#example1-full-access-all-wkgs) 
+  [Example policy for full access to a specified workgroup](#example2-full-access-this-wkg) 
+  [Example policy for running queries in a specified workgroup](#example3-user-access) 
+  [Example policy for running queries in the primary workgroup](#example4-run-in-primary-access) 
+  [Example policy for management operations on a specified workgroup](#example5-manage-wkgs-access) 
+  [Example policy for listing workgroups](#example6-list-all-wkgs-access) 
+  [Example policy for running and stopping queries in a specific workgroup](#example7-run-queries-access) 
+  [Example policy for working with named queries in a specific workgroup](#example8-named-queries-access) 
+  [Example policy for working with Spark notebooks](#example9-spark-workgroup) 

**Example 모든 작업 그룹에 대해 전체 액세스를 허용하는 정책의 예**  
다음 정책은 계정에 있는 모든 작업 그룹 리소스에 대해 전체 액세스를 허용합니다. 해당 계정에서 다른 모든 사용자에 대해 작업 그룹을 관리해야 하는 사용자에게 이 정책을 사용하는 것이 좋습니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

**Example 지정한 작업 그룹에 대해 전체 액세스를 허용하는 정책의 예**  
다음 정책은 `workgroupA`이라는 하나의 특정 작업 그룹 리소스에 대해 전체 액세스를 허용합니다. 이 정책은 특정 작업 그룹에 대해 전체 제어 권한을 가진 사용자에게 사용할 수 있습니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListEngineVersions",
                "athena:ListWorkGroups",
                "athena:ListDataCatalogs",
                "athena:ListDatabases",
                "athena:GetDatabase",
                "athena:ListTableMetadata",
                "athena:GetTableMetadata"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:BatchGetQueryExecution",
                "athena:GetQueryExecution",
                "athena:ListQueryExecutions",
                "athena:StartQueryExecution",
                "athena:StopQueryExecution",
                "athena:GetQueryResults",
                "athena:GetQueryResultsStream",
                "athena:CreateNamedQuery",
                "athena:GetNamedQuery",
                "athena:BatchGetNamedQuery",
                "athena:ListNamedQueries",
                "athena:DeleteNamedQuery",
                "athena:CreatePreparedStatement",
                "athena:GetPreparedStatement",
                "athena:ListPreparedStatements",
                "athena:UpdatePreparedStatement",
                "athena:DeletePreparedStatement"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/workgroupA"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:DeleteWorkGroup",
                "athena:UpdateWorkGroup",
                "athena:GetWorkGroup",
                "athena:CreateWorkGroup"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/workgroupA"
            ]
        }
    ]
}
```

**Example 지정된 작업 그룹에서 쿼리 실행을 위한 정책의 예**  
다음 정책은 지정된 `workgroupA`에서 사용자가 쿼리를 실행하고 보도록 허용합니다. 사용자는 작업 그룹에 대해 업데이트나 삭제 등의 관리 작업을 수행할 수 없습니다. 참고로 예제 정책은 사용자를 이 작업 그룹으로만 제한하거나 다른 작업 그룹에 대한 액세스를 거부하지 않습니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
       {
            "Effect": "Allow",
            "Action": [
                "athena:ListEngineVersions",
                "athena:ListWorkGroups",
                "athena:ListDataCatalogs",
                "athena:ListDatabases",
                "athena:GetDatabase",
                "athena:ListTableMetadata",
                "athena:GetTableMetadata"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:GetWorkGroup", 
                "athena:BatchGetQueryExecution",
                "athena:GetQueryExecution",
                "athena:ListQueryExecutions",
                "athena:StartQueryExecution",
                "athena:StopQueryExecution",
                "athena:GetQueryResults",
                "athena:GetQueryResultsStream",
                "athena:CreateNamedQuery",
                "athena:GetNamedQuery",
                "athena:BatchGetNamedQuery",
                "athena:ListNamedQueries",
                "athena:DeleteNamedQuery",
                "athena:CreatePreparedStatement",
                "athena:GetPreparedStatement",
                "athena:ListPreparedStatements",
                "athena:UpdatePreparedStatement",
                "athena:DeletePreparedStatement"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/workgroupA"
            ]
        }
    ]
}
```

**Example 기본 작업 그룹에서 쿼리를 실행하기 위한 정책의 예**  
이전 예제를 수정하여 특정 사용자가 기본 작업 그룹에서 쿼리를 실행하도록 허용할 수 있습니다.  
지정된 작업 그룹에서 쿼리를 실행하도록 구성된 모든 사용자에게 기본 작업 그룹 리소스를 추가하는 것이 좋습니다. 이 리소스를 작업 그룹 사용자 정책에 추가하면 지정된 작업 그룹이 삭제되거나 비활성화된 경우에 유용합니다. 이렇게 하면 사용자들이 기본 작업 그룹에서 쿼리 실행을 계속할 수 있습니다.
계정의 사용자가 기본 작업 그룹에서 쿼리를 실행하도록 허용하려면, 다음 예와 같이 기본 작업 그룹의 ARN이 포함된 줄을 [Example policy for running queries in a specified workgroup](#example3-user-access)의 리소스 섹션에 추가합니다.  

```
arn:aws:athena:us-east-1:123456789012:workgroup/primary"
```

**Example 지정된 작업 그룹에서 관리 작업을 위한 정책의 예**  
다음 정책은 사용자가 `test_workgroup` 작업 그룹을 만들고, 삭제하고, 세부 정보를 조회하고, 업데이트할 수 있도록 허용합니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListEngineVersions"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "athena:CreateWorkGroup",
                "athena:GetWorkGroup",
                "athena:DeleteWorkGroup",
                "athena:UpdateWorkGroup"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/test_workgroup"
            ]
        }
    ]
}
```

**Example 작업 그룹 목록 조회를 위한 정책의 예**  
다음 정책은 모든 사용자가 모든 작업 그룹의 목록을 조회할 수 있도록 허용합니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListWorkGroups"
            ],
            "Resource": "*"
        }
    ]
}
```

**Example 지정된 작업 그룹에서 쿼리 실행 및 중지를 위한 정책의 예**  
이 정책은 사용자가 작업 그룹에서 쿼리를 실행하도록 허용합니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:StartQueryExecution",
                "athena:StopQueryExecution"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/test_workgroup"
            ]
        }
    ]
}
```

**Example 지정된 작업 그룹에서 지명한 쿼리에 대한 작업을 위한 정책의 예**  
다음 정책은, 지정된 작업 그룹에서 지명한 쿼리를 생성 및 삭제하고 세부 정보를 볼 수 있는 권한을 사용자에게 부여합니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:CreateNamedQuery",
                "athena:GetNamedQuery",
                "athena:DeleteNamedQuery"
            ],
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/test_workgroup"            ]
        }
    ]
}
```

**Example Athena에서 Spark 노트북으로 작업하기 위한 정책의 예**  
Athena에서 Spark 노트북으로 작업하려면 다음과 같은 정책을 사용하세요.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowCreatingWorkGroupWithDefaults",
            "Action": [
                "athena:CreateWorkGroup",
                "s3:CreateBucket",
                "iam:CreateRole",
                "iam:CreatePolicy",
                "iam:AttachRolePolicy",
                "s3:GetBucketLocation",
                "athena:ImportNotebook"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:athena:us-east-1:123456789012:workgroup/Demo*",
                "arn:aws:s3:::123456789012-us-east-1-athena-results-bucket-*",
                "arn:aws:iam::123456789012:role/service-role/AWSAthenaSparkExecutionRole-*",
                "arn:aws:iam::123456789012:policy/service-role/AWSAthenaSparkRolePolicy-*"
            ]
        },
        {
            "Sid": "AllowRunningCalculations",
            "Action": [
                "athena:ListWorkGroups",
                "athena:GetWorkGroup",
                "athena:StartSession",
                "athena:CreateNotebook",
                "athena:ListNotebookMetadata",
                "athena:ListNotebookSessions",
                "athena:GetSessionStatus",
                "athena:GetSession",
                "athena:GetNotebookMetadata",
                "athena:CreatePresignedNotebookUrl"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:athena:us-east-1:123456789012:workgroup/Demo*"
        },
        {
            "Sid": "AllowListWorkGroupAndEngineVersions",
            "Action": [
                "athena:ListWorkGroups",
                "athena:ListEngineVersions"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```

# IAM Identity Center 지원 Athena 작업 그룹 사용
<a name="workgroups-identity-center"></a>

[신뢰할 수 있는 ID 전파](https://docs.aws.amazon.com//singlesignon/latest/userguide/trustedidentitypropagation-overview.html)는 연결된 AWS 서비스의 관리자가 서비스 데이터에 대한 액세스 권한을 부여하고 감사하는 데 사용할 수 있는 AWS IAM Identity Center 기능입니다. 이 데이터에 대한 액세스는 그룹 연결과 같은 사용자 속성을 기반으로 합니다. 신뢰할 수 있는 ID 전파를 설정하려면 연결된 AWS 서비스의 관리자와 IAM Identity Center 관리자 간의 협업이 필요합니다. 자세한 내용은 [사전 조건 및 고려 사항](https://docs.aws.amazon.com//singlesignon/latest/userguide/trustedidentitypropagation-overall-prerequisites.html)을 참조하세요.

[IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)를 사용하면 인력 ID(인력 사용자)의 로그인 보안을 관리할 수 있습니다. IAM Identity Center를 사용하면 인력 사용자를 생성하거나 연결하고 인력 사용자의 모든 AWS 계정 및 애플리케이션에 대한 액세스를 중앙에서 관리하는 기능을 한 곳에서 이용할 수 있습니다. 다중 계정 권한을 사용하여 이러한 사용자에게 AWS 계정 대한 액세스 권한을 할당할 수 있습니다. 애플리케이션 할당을 사용하여 IAM Identity Center 지원 애플리케이션, 클라우드 애플리케이션 및 고객 Security Assertion Markup Language(SAML 2.0) 애플리케이션에 대한 액세스 권한을 사용자에게 할당할 수 있습니다. 자세한 내용은 **AWS IAM Identity Center 사용 설명서의 [Trusted identity propagation across applications](https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation.html)를 참조하십시오.

신뢰할 수 있는 ID 전파에 대한 Athena SQL 지원은 EMR Studio 및 SageMaker Unified Studio 모두에서 사용할 수 있습니다. 각 플랫폼은 Athena에서 TIP를 사용하기 위한 특정 인터페이스를 제공합니다.

EMR Studio에서 IAM Identity Center ID와 함께 Athena SQL을 사용하는 경우 두 가지 작업 그룹 옵션이 있습니다.
+ **일반 작업 그룹** - 사용자/그룹 할당이 필요하지 않습니다.
+ **IAM Identity Center 지원 작업 그룹** - IAM Identity Center 콘솔 또는 API를 통해 사용자/그룹을 할당해야 합니다.

옵션 모두 IAM Identity Center가 활성화된 EMR Studio에서 Athena SQL 인터페이스를 사용하여 쿼리를 실행할 수 있습니다.

## 고려 사항 및 제한 사항
<a name="workgroups-identity-center-considerations-and-limitations"></a>

Amazon Athena에서 신뢰할 수 있는 ID 전파를 사용하는 경우 다음 사항을 고려하세요.
+ 작업 그룹이 생성된 후에는 작업 그룹의 인증 방법을 변경할 수 없습니다.
  + IAM Identity Center 지원 작업 그룹을 지원하도록 기존 Athena SQL 작업 그룹을 수정할 수 없습니다. 기존 Athena SQL 작업 그룹은 ID를 다운스트림 서비스에 전파할 수 있습니다.
  + 리소스 수준 IAM 권한이나 ID 기반 IAM 정책을 지원하도록 IAM Identity Center 지원 작업 그룹을 수정할 수 없습니다.
+ 신뢰할 수 있는 ID 전파를 지원하는 작업 그룹에 액세스하려면 Athena [GetWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetWorkGroup.html) API 작업의 응답으로 반환되는 `IdentityCenterApplicationArn`에 IAM Identity Center 사용자를 할당해야 합니다.
+ 신뢰할 수 있는 ID 전파 ID를 사용하도록 Amazon S3 Access Grants를 구성해야 합니다. 자세한 내용은 **Amazon S3 사용 설명서의 [S3 Access Grants and corporate directory identities](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-directory-ids.html)를 참조하십시오.
+ IAM Identity Center 지원 Athena 작업 그룹을 사용하려면 IAM Identity Center ID를 사용하도록 Lake Formation을 구성해야 합니다. 구성 정보는 **AWS Lake Formation 개발자 안내서의 [Integrating IAM Identity Center](https://docs.aws.amazon.com/lake-formation/latest/dg/identity-center-integration.html)를 참조하십시오.
+ 기본적으로 쿼리는 IAM Identity Center 지원 작업 그룹에서 30분 후에 시간 초과됩니다. 쿼리 제한 시간 증가를 요청할 수 있지만 신뢰할 수 있는 ID 전파 작업 그룹에서 쿼리를 실행할 수 있는 최대 시간은 1시간입니다.
+ 신뢰할 수 있는 ID 전파 작업 그룹의 사용자 또는 그룹 권한 변경 사항이 적용되는 데 최대 1시간이 걸릴 수 있습니다.
+ 신뢰할 수 있는 ID 전파를 사용하는 Athena 작업 그룹의 쿼리는 Athena 콘솔에서 직접 실행할 수 없습니다. 이러한 쿼리는 IAM Identity Center가 활성화된 EMR Studio의 Athena 인터페이스에서 실행해야 합니다. *EMR Studio에서 Athena를 사용하는 방법에 대한 자세한 내용은 *Amazon EMR 관리 안내서의 [Use the Amazon Athena SQL editor in EMR Studio](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-athena.html)를 참조하십시오.
+ 신뢰할 수 있는 ID 전파는 다음 Athena 기능과 호환되지 않습니다.
  + IAM Identity Center 지원 작업 그룹용 `aws:CalledVia` 컨텍스트 키
  + Athena for Spark 작업 그룹
  + Athena API에 대한 연동 액세스
  + Lake Formation과 Athena JDBC 및 ODBC 드라이버를 사용하여 Athena에 대한 연동 액세스
+ 다음 AWS 리전에서만 Athena와 함께 신뢰할 수 있는 ID 전파를 사용할 수 있습니다.
  + `us-east-2` - 미국 동부(오하이오)
  + `us-east-1` - 미국 동부(버지니아 북부)
  + `us-west-1` - 미국 서부(캘리포니아 북부)
  + `us-west-2` - 미국 서부(오레곤)
  + `af-south-1` – 아프리카(케이프타운)
  + `ap-east-1` – 아시아 태평양(홍콩)
  + `ap-southeast-3` – 아시아 태평양(자카르타)
  + `ap-south-1` – 아시아 태평양(뭄바이)
  + `ap-northeast-3` – 아시아 태평양(오사카)
  + `ap-northeast-2` – 아시아 태평양(서울)
  + `ap-southeast-1` – 아시아 태평양(싱가포르)
  + `ap-southeast-2` – 아시아 태평양(시드니)
  + `ap-northeast-1` – 아시아 태평양(도쿄)
  + `ca-central-1` - 캐나다(중부)
  + `eu-central-1` – 유럽(프랑크푸르트)
  + `eu-central-2` - 유럽(취리히)
  + `eu-west-1` – 유럽(아일랜드)
  + `eu-west-2` – 유럽(런던)
  + `eu-south-1` – 유럽(밀라노)
  + `eu-west-3` – 유럽(파리)
  + `eu-north-1` – 유럽(스톡홀름)
  + `me-south-1` – 중동(바레인)
  + `sa-east-1` – 남아메리카(상파울루)

## 필수 권한
<a name="workgroups-identity-center-required-permissions"></a>

Athena 콘솔에서 IAM Identity Center 지원 작업 그룹을 생성하는 관리자의 IAM 사용자는 다음 정책을 연결해야 합니다.
+ `AmazonAthenaFullAccess` 관리형 정책. 자세한 내용은 [AWS 관리형 정책: AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)을 참조하세요.
+ 다음은 IAM 및 IAM Identity Center 작업을 허용하는 인라인 정책입니다.

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

****  

  ```
  { "Version":"2012-10-17",		 	 	  "Statement": [ { "Action": [ "iam:createRole",
      "iam:CreatePolicy", "iam:AttachRolePolicy", "iam:ListRoles", "identitystore:ListUsers",
      "identitystore:ListGroups", "identitystore:CreateUser", "identitystore:CreateGroup",
      "sso:ListInstances", "sso:CreateInstance", "sso:DeleteInstance", "sso:ListTrustedTokenIssuers",
      "sso:DescribeTrustedTokenIssuer", "sso:ListApplicationAssignments",
      "sso:DescribeRegisteredRegions", "sso:GetManagedApplicationInstance",
      "sso:GetSharedSsoConfiguration", "sso:PutApplicationAssignmentConfiguration",
      "sso:CreateApplication", "sso:DeleteApplication", "sso:PutApplicationGrant",
      "sso:PutApplicationAuthenticationMethod", "sso:PutApplicationAccessScope",
      "sso:ListDirectoryAssociations", "sso:CreateApplicationAssignment",
      "sso:DeleteApplicationAssignment", "organizations:ListDelegatedAdministrators",
      "organizations:DescribeAccount", "organizations:DescribeOrganization",
      "organizations:CreateOrganization", "sso-directory:SearchUsers", "sso-directory:SearchGroups",
      "sso-directory:CreateUser" ], "Effect": "Allow", "Resource": [ "*" ] }, { "Action": [
      "iam:PassRole" ], "Effect": "Allow", "Resource": [
          "arn:aws:iam::111122223333:role/service-role/AWSAthenaSQLRole-*"
      ] } ] }
  ```

------

## IAM Identity Center 지원 Athena 작업 그룹 생성
<a name="workgroups-identity-center-creating-an-identity-center-enabled-athena-workgroup"></a>

다음 절차에서는 IAM Identity Center 지원 Athena 작업 그룹 생성과 관련된 단계 및 옵션을 보여줍니다. Athena 작업그룹에 사용할 수 있는 다른 구성 옵션에 대한 설명은 [작업 그룹 만들기](creating-workgroups.md) 섹션을 참조하십시오.

**Athena 콘솔에서 SSO 지원 작업 그룹 생성**

1. [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home)에서 Athena 콘솔을 엽니다.

1. Athena 콘솔 탐색 창에서 **작업 그룹(Workgroups)**을 선택합니다.

1. **작업 그룹** 페이지에서 **작업 그룹 생성**을 선택합니다.

1. **작업 그룹 생성** 페이지의 **작업 그룹 이름**에 작업 그룹의 이름을 입력합니다.

1. **분석 엔진**으로 **Athena SQL** 기본값을 사용합니다.

1. **인증**으로 **IAM Identity Center**를 선택합니다.

1. **IAM Identity Center 액세스를 위한 서비스 역할**로 기존 서비스 역할을 선택하거나 새 서비스 역할을 생성합니다.

   Athena가 사용자를 대신하여 IAM Identity Center에 액세스할 수 있는 권한이 필요합니다. 이를 위해서는 Athena에 서비스 역할이 필요합니다. 서비스 역할은 AWS 서비스가 사용자를 대신하여 다른 AWS 서비스에 액세스할 수 있도록 권한을 부여하는 IAM 역할입니다. 페더레이션 카탈로그를 쿼리하거나 UDF를 실행하려면 해당 Lambda 권한으로 서비스 역할을 업데이트하세요. 자세한 내용은 *IAM 사용 설명서*의 [AWS서비스에 대한 권한을 위임할 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)을 참조하세요.

1. **쿼리 결과 구성**을 확장한 다음 **쿼리 결과의 위치**에 Amazon S3 경로를 입력하거나 선택합니다.

1. (선택 사항) **쿼리 결과 암호화**를 선택합니다. 기본적으로 SSE-S3가 지원됩니다. 쿼리 결과 위치와 함께 SSE-KMS 및 CSE-KMS를 사용하려면 Amazon S3 Access Grants의 **IAM Identity Center에 대한 서비스 역할**에 권한 부여를 제공하세요. 자세한 내용은 [샘플 역할 정책](#workgroups-identity-center-access-grant-location-sample-role-policy)을 참조하세요.

1. (선택 사항) **사용자 ID 기반 S3 접두사 생성**을 선택합니다.

   IAM Identity Center 지원 작업 그룹을 생성할 때는 기본적으로 **S3 Access Grants 활성화** 옵션이 선택됩니다. Amazon S3 Access Grants를 사용하여 Amazon S3의 Athena 쿼리 결과 위치(접두사)에 대한 액세스를 제어할 수 있습니다. Amazon S3 Access Grants에 대한 자세한 내용은 [Managing access with Amazon S3 Access Grants](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants.html)를 참조하십시오.

   IAM Identity Center 인증을 사용하는 Athena 작업 그룹에서 Amazon S3 Access Grants에 의해 관리되는 ID 기반 쿼리 결과 위치 생성을 활성화할 수 있습니다. 이러한 사용자 ID 기반 Amazon S3 접두사를 사용하면 Athena 작업 그룹의 사용자는 쿼리 결과를 동일한 작업 그룹의 다른 사용자와 격리된 상태로 유지할 수 있습니다.

   사용자 접두사 옵션을 활성화하면 Athena는 사용자 ID를 작업 그룹의 쿼리 결과 출력 위치에 Amazon S3 경로 접두사로 추가합니다(예: `s3://amzn-s3-demo-bucket/${user_id}`). 이 기능을 사용하려면 `user_id` 접두사가 있는 위치에 대한 사용자 권한만 허용하도록 Access Grants를 구성해야 합니다. Athena 쿼리 결과에 대한 액세스를 제한하는 Amazon S3 Access Grants의 위치 역할 정책 샘플은 [샘플 역할 정책](#workgroups-identity-center-access-grant-location-sample-role-policy)을 참조하세요.
**참고**  
사용자 ID S3 접두사 옵션을 선택하면 다음 단계에서 설명하는 것처럼 작업 그룹에 대한 클라이언트 측 설정 재정의 옵션이 자동으로 활성화됩니다. 클라이언트 측 설정 재정의 옵션은 사용자 ID 접두사 기능의 요구 사항입니다.

1. **설정**을 확장한 다음 **클라이언트 측 설정 재정의**가 선택되어 있는지 확인합니다.

   **클라이언트 측 설정 재정의**를 선택하면 작업 그룹 설정이 작업 그룹의 모든 클라이언트에 대해 작업 그룹 수준에서 적용됩니다. 자세한 내용은 [Override client-side settings(클라이언트 측 설정 재정의)](workgroups-settings-override.md) 섹션을 참조하세요.

1. (선택 사항) [작업 그룹 만들기](creating-workgroups.md)에 설명된 대로 필요한 기타 구성 설정을 지정합니다.

1. **작업 그룹 생성**을 선택합니다.

1. Athena 콘솔의 **작업 그룹** 섹션을 사용하여 IAM Identity Center 디렉터리의 사용자 또는 그룹을 IAM Identity Center 활성화 Athena 작업 그룹에 할당할 수 있습니다.

## 샘플 역할 정책
<a name="workgroups-identity-center-access-grant-location-sample-role-policy"></a>

다음 샘플은 Athena 쿼리 결과에 대한 액세스를 제한하는 Amazon S3 Access Grant 위치에 연결할 역할에 대한 정책을 보여줍니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "s3:*"
            ],
            "Condition": {
                "ArnNotEquals": {
                    "s3:AccessGrantsInstanceArn": "arn:aws:s3:us-east-1:111122223333:access-grants/default"
                },
                "StringNotEquals": {
                    "aws:ResourceAccount": "111122223333"
                }
            },
            "Effect": "Deny",
            "Resource": "*",
            "Sid": "ExplicitDenyS3"
        },
        {
            "Action": [
                "kms:*"
            ],
            "Effect": "Deny",
            "NotResource": "arn:aws:kms:us-east-1:111122223333:key/${keyid}",
            "Sid": "ExplictDenyKMS"
        },
        {
            "Action": [
                "s3:ListMultipartUploadParts",
                "s3:GetObject"
            ],
            "Condition": {
                "ArnEquals": {
                    "s3:AccessGrantsInstanceArn": "arn:aws:s3:us-east-1:111122223333:access-grants/default"
                },
                "StringEquals": {
                    "aws:ResourceAccount": "111122223333"
                }
            },
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::ATHENA-QUERY-RESULT-LOCATION/${identitystore:UserId}/*",
            "Sid": "ObjectLevelReadPermissions"
        },
        {
            "Action": [
                "s3:PutObject",
                "s3:AbortMultipartUpload"
            ],
            "Condition": {
                "ArnEquals": {
                    "s3:AccessGrantsInstanceArn": "arn:aws:s3:us-east-1:111122223333:access-grants/default"
                },
                "StringEquals": {
                "aws:ResourceAccount": "111122223333"
                }
            },
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::ATHENA-QUERY-RESULT-LOCATION/${identitystore:UserId}/*",
            "Sid": "ObjectLevelWritePermissions"
        },
        {
            "Action": "s3:ListBucket",
            "Condition": {
                "ArnEquals": {
                    "s3:AccessGrantsInstanceArn": "arn:aws:s3:us-east-1:111122223333:access-grants/default"
                },
                "StringEquals": {
                    "aws:ResourceAccount": "111122223333"
                },
                "StringLikeIfExists": {
                    "s3:prefix": [
                        "${identitystore:UserId}",
                        "${identitystore:UserId}/*"
                    ]
                }
            },
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::ATHENA-QUERY-RESULT-LOCATION",
            "Sid": "BucketLevelReadPermissions"
        },
        {
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/${keyid}",
            "Sid": "KMSPermissions"
        }
    ]
}
```

------

# 작업 그룹에 대한 최소 암호화 구성
<a name="workgroups-minimum-encryption"></a>

Athena SQL 작업 그룹의 관리자는 Amazon S3에서 작업 그룹의 모든 쿼리 결과에 대해 최소 수준의 암호화를 적용할 수 있습니다. 이 기능을 사용하면 쿼리 결과가 암호화되지 않은 상태로 Amazon S3 버킷에 저장되지 않도록 합니다.

최소 암호화가 활성화된 작업 그룹의 사용자가 쿼리를 제출하면 사용자가 구성한 최소 수준 또는 사용 가능한 경우 더 높은 수준으로만 암호화를 설정할 수 있습니다. Athena에서는 사용자가 쿼리를 실행할 때 지정된 수준 또는 작업 그룹에 설정된 수준에서 쿼리 결과를 암호화합니다.

사용 가능한 수준은 다음과 같습니다.
+ **기본** - Amazon S3 관리형 키를 사용한 Amazon S3 서버 측 암호화(**SSE-S3**).
+ **중급** - KMS 관리형 키를 사용한 서버 측 암호화(**SSE-KMS**).
+ **고급** - KMS 관리형 키를 사용한 클라이언트 측 암호화(**CSE\$1KMS**).

## 고려 사항 및 제한 사항
<a name="workgroups-minimum-encryption-considerations-and-limitations"></a>
+ Apache Spark 지원 작업 그룹에서는 최소 암호화 기능을 사용할 수 없습니다.
+ 최소 암호화 기능은 작업 그룹에서 **[클라이언트 측 설정 재정의](https://docs.aws.amazon.com/athena/latest/ug/workgroups-settings-override.html)** 옵션을 활성화하지 않은 경우에만 작동합니다.
+ 작업 그룹에 **클라이언트 측 설정 재정의** 옵션이 활성화된 경우 작업그룹 암호화 설정이 우선하며 최소 암호화 설정은 영향을 주지 않습니다.
+ 이 기능을 활성화하는 데 비용은 들지 않습니다.

## 작업 그룹에 대해 최소 암호화 활성화
<a name="workgroups-minimum-encryption-enabling"></a>

작업 그룹을 생성하거나 업데이트할 때 Athena SQL 작업 그룹의 쿼리 결과에 대해 최소 암호화 수준을 활성화할 수 있습니다. 이를 위해 Athena 콘솔, Athena API 또는 AWS CLI를 사용할 수 있습니다.

### Athena 콘솔을 사용하여 최소 암호화 활성화
<a name="workgroups-minimum-encryption-enabling-using-the-athena-console"></a>

Athena 콘솔을 사용하여 작업 그룹의 생성 또는 편집을 시작하려면 [작업 그룹 생성](https://docs.aws.amazon.com/athena/latest/ug/workgroups-create-update-delete.html#creating-workgroups) 또는 [작업 그룹 편집](https://docs.aws.amazon.com/athena/latest/ug/workgroups-create-update-delete.html#editing-workgroups)을 참조하세요. 작업 그룹을 구성하는 경우 다음 단계를 사용하여 최소 암호화를 활성화합니다.

**작업 그룹 쿼리 결과에 대해 최소 암호화 수준을 구성하려면**

1. **클라이언트 측 설정 재정의** 옵션을 지우거나 선택되지 않았는지 확인합니다.

1. **쿼리 결과 암호화** 옵션을 선택합니다.

1. **암호화 유형**에서 작업 그룹 쿼리 결과에 대해 Athena에서 사용할 암호화 방법을 선택합니다(**SSE\$1S3**, **SSE\$1KMS** 또는 **CSE\$1KMS**). 이러한 암호화 유형은 기본, 중급, 고급 보안 수준에 해당합니다.

1. 선택한 암호화 방법을 모든 사용자에 대한 최소 암호화 수준으로 적용하려면 **최소 암호화로 *encryption\$1method* 설정**을 선택합니다.

   이 옵션을 선택하면 선택한 암호화 유형이 최소 암호화로 구성될 때 사용자에게 허용되는 암호화 계층 구조 및 암호화 수준이 테이블에 표시됩니다.

1. 작업 그룹을 생성하거나 작업 그룹 구성을 업데이트한 후 **작업 그룹 생성** 또는 **변경 사항 저장**을 선택합니다.

### Athena API 또는 AWS CLI를 사용하여 최소 암호화 활성화
<a name="workgroups-minimum-encryption-enabling-using-the-athena-api-or-cli"></a>

[CreateWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_CreateWorkGroup.html) 또는 [UpdateWorkGroup](https://docs.aws.amazon.com/athena/latest/APIReference/API_UpdateWorkGroup.html) API를 사용하여 Athena SQL 작업 그룹을 생성하거나 업데이트하는 경우 [EnforceWorkGroupConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroupConfiguration.html#athena-Type-WorkGroupConfiguration-EnforceWorkGroupConfiguration)을 `false`로, [EnableMinimumEncryptionConfiguration](https://docs.aws.amazon.com/athena/latest/APIReference/API_WorkGroupConfiguration.html#athena-Type-WorkGroupConfiguration-EnableMinimumEncryptionConfiguration)을 `true`로 설정하고 [EncryptionOption](https://docs.aws.amazon.com/athena/latest/APIReference/API_EncryptionConfiguration.html#athena-Type-EncryptionConfiguration-EncryptionOption)을 사용하여 암호화 유형을 지정합니다.

AWS CLI에서 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/create-work-group.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/create-work-group.html) 또는 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/update-work-group.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/update-work-group.html) 명령과 함께 `--configuration` 또는 `--configuration-updates` 파라미터를 사용하고 API의 옵션에 해당하는 옵션을 지정합니다.

# 준비된 문에 대한 액세스 구성
<a name="security-iam-athena-prepared-statements"></a>

이 주제에서는 Amazon Athena의 준비된 문에 대한 IAM 권한에 대해 다룹니다. IAM 정책을 사용할 때는 항상 IAM 모범 사례를 따라야 합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

준비된 문에 대한 자세한 내용은 [파라미터화된 쿼리 사용](querying-with-prepared-statements.md) 단원을 참조하세요.

준비된 문을 생성, 관리, 실행하는 데 필요한 IAM 권한은 다음과 같습니다.

```
athena:CreatePreparedStatement
athena:UpdatePreparedStatement
athena:GetPreparedStatement
athena:ListPreparedStatements
athena:DeletePreparedStatement
```

다음 표에 나타난 대로 이 권한을 사용해야 합니다.


****  

| 목적 | 사용할 권한 | 
| --- | --- | 
| PREPARE 쿼리 실행 | athena:StartQueryExecution athena:CreatePreparedStatement | 
| 기존의 준비된 문을 업데이트하기 위해 PREPARE 쿼리 재실행 | athena:StartQueryExecution athena:UpdatePreparedStatement | 
| EXECUTE 쿼리 실행 | athena:StartQueryExecution athena:GetPreparedStatement | 
| DEALLOCATE PREPARE 쿼리 실행 | athena:StartQueryExecution athena:DeletePreparedStatement | 

## 예제
<a name="security-iam-athena-prepared-statements-example"></a>

다음의 IAM 정책 예제는 지정된 계정 ID 및 작업 그룹에 준비된 문을 관리하고 실행할 수 있는 권한을 부여합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:StartQueryExecution",
                "athena:CreatePreparedStatement",
                "athena:UpdatePreparedStatement",
                "athena:GetPreparedStatement",
                "athena:DeletePreparedStatement",
                "athena:ListPreparedStatements"
            ],
            "Resource": [
                "arn:aws:athena:*:111122223333:workgroup/<workgroup-name>"
            ]
        }
    ]
}
```

------

# Athena용 CalledVia 컨텍스트 키 사용
<a name="security-iam-athena-calledvia"></a>

[보안 주체](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html#intro-structure-principal)가 AWS에 [요청](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html#intro-structure-request)하면 AWS는 요청을 평가하고 권한을 부여하는 *요청 컨텍스트*로 요청 정보를 수집합니다. JSON 정책의 `Condition` 요소를 사용하여 요청 컨텍스트의 키를 정책에서 지정한 키 값과 비교할 수 있습니다. *글로벌 조건 컨텍스트 키*는 `aws:` 접두사가 있는 조건 키입니다.

## aws:CalledVia 컨텍스트 키
<a name="security-iam-athena-calledvia-the-awscalledvia-context-key"></a>

[https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia) 글로벌 컨텍스트 키를 사용하면 정책의 서비스를, IAM 보안 주체(사용자 또는 역할)를 대신하여 요청을 수행한 서비스와 비교할 수 있습니다. 보안 주체가 AWS 서비스에 요청하면 해당 서비스는 보안 주체의 자격 증명을 사용하여 다른 서비스에 대한 후속 요청을 할 수 있습니다. `aws:CalledVia` 키에는 보안 주체를 대신하여 요청을 수행한 체인의 각 서비스 목록이 정렬되어 있습니다.

`aws:CalledVia` 컨텍스트 키에 대한 서비스 주체 이름을 지정하여 컨텍스트 키를 AWS 서비스별로 지정할 수 있습니다. 예를 들어, `aws:CalledVia` 조건 키를 사용해 Athena에서 수행된 요청으로만 요청을 제한할 수 있습니다. Athena에서 어떤 정책에 `aws:CalledVia` 조건 키를 사용하려면 다음 예제처럼 Athena 서비스 보안 주체 이름 `athena.amazonaws.com`을 지정합니다.

```
 ...
    "Condition": {
        "ForAnyValue:StringEquals": { 
            "aws:CalledVia": "athena.amazonaws.com"
        }
    }
...
```

`aws:CalledVia` 컨텍스트 키는 발신자가 Athena로부터 리소스를 호출할 때 발신자만 리소스(예: Lambda 함수)에 대한 액세스 권한을 갖도록 하는 데 사용할 수 있습니다.

**참고**  
`aws:CalledVia` 컨텍스트 키는 신뢰할 수 있는 ID 전파 기능과 호환되지 않습니다.

## Lambda 함수에 대한 액세스를 위해 CalledVia 컨텍스트 키 추가
<a name="security-iam-athena-calledvia-example-policy-to-add-an-optional-calledvia-context-key-for-fine-grained-access-to-a-lambda-function"></a>

Athena에서는 쿼리와 연결된 Lambda 함수를 호출하려면 발신자에게 `lambda:InvokeFunction` 권한이 있어야 합니다. 다음 문은 사용자가 Athena에서만 Lambda 함수를 간접적으로 호출할 수 있도록 지정합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-east-1:111122223333:function:OneAthenaLambdaFunction",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "aws:CalledVia": "athena.amazonaws.com"
                }
            }
        }
    ]
}
```

------

다음 예제에서는 사용자가 연합 쿼리를 실행하고 읽도록 허용하는 정책에 앞의 문을 추가하는 방법을 보여줍니다. 이러한 작업을 수행할 수 있는 보안 주체는 연합 데이터 원본과 연결된 Athena 카탈로그를 지정하는 쿼리를 실행할 수 있습니다. 그러나 보안 주체는 Athena를 통해 함수가 호출되지 않는 한 연결된 Lambda 함수에 액세스할 수 없습니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0", 
            "Effect": "Allow",
            "Action": [ 
                "athena:GetWorkGroup", 
                "s3:PutObject", 
                "s3:GetObject", 
                "athena:StartQueryExecution", 
                "s3:AbortMultipartUpload",  
                "athena:StopQueryExecution", 
                "athena:GetQueryExecution", 
                "athena:GetQueryResults", 
                "s3:ListMultipartUploadParts" 
            ], 
            "Resource": [ 
                "arn:aws:athena:*:111122223333:workgroup/WorkGroupName",
                "arn:aws:s3:::MyQueryResultsBucket/*", 
                "arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillPrefix*"
            ] 
        }, 
        {
            "Sid": "VisualEditor1", 
            "Effect": "Allow", 
            "Action": "athena:ListWorkGroups", 
            "Resource": "*" 
        }, 
        {
            "Sid": "VisualEditor2", 
            "Effect": "Allow", 
            "Action": 
                [ 
                "s3:ListBucket", 
                "s3:GetBucketLocation" 
                ], 
            "Resource": "arn:aws:s3:::MyLambdaSpillBucket" 
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:OneAthenaLambdaFunction", 
                "arn:aws:lambda:*:111122223333:function:AnotherAthenaLambdaFunction"
            ], 
            "Condition": {
                "ForAnyValue:StringEquals": { 
                    "aws:CalledVia": "athena.amazonaws.com"
                }
            }
        }            
    ]
}
```

------

`CalledVia` 글로벌 조건 키에 대한 자세한 내용은 *IAM 사용 설명서*의 [AWS 글로벌 조건 컨텍스트 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)를 참조하세요.

# 외부 Hive 메타스토어용 Athena 데이터 커넥터에 대한 액세스 허용
<a name="hive-metastore-iam-access"></a>

이 주제의 권한 정책 예제에서는 필요한 허용된 작업과 해당 작업이 허용되는 리소스를 보여줍니다. IAM 자격 증명에 유사한 권한 정책을 연결하기 전에 이러한 정책을 신중하게 검토하고 요구 사항에 따라 수정합니다.
+  [Example Policy to Allow an IAM Principal to Query Data Using Athena Data Connector for External Hive Metastore](#hive-using-iam) 
+  [Example Policy to Allow an IAM Principal to Create an Athena Data Connector for External Hive Metastore](#hive-creating-iam) 

**Example – IAM 보안 주체가 외부 Hive 메타스토어용 Athena 데이터 커넥터를 사용하여 데이터를 쿼리할 수 있도록 허용합니다.**  
다음 정책은 [AWS 관리형 정책: AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy) 외에 Athena 작업에 대한 전체 액세스 권한을 부여하는 IAM 보안 주체에도 연결됩니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "lambda:GetFunction",
                "lambda:GetLayerVersion",
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:MyAthenaLambdaFunction",
                "arn:aws:lambda:*:111122223333:function:AnotherAthenaLambdaFunction",
                "arn:aws:lambda:*:111122223333:layer:MyAthenaLambdaLayer:*"
            ]
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": "arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillLocation"
        }
    ]
}
```


**권한에 대한 설명**  

| 허용된 작업 | 설명 | 
| --- | --- | 
|  <pre>"s3:GetBucketLocation",<br />"s3:GetObject",<br />"s3:ListBucket",<br />"s3:PutObject",<br />"s3:ListMultipartUploadParts",<br />"s3:AbortMultipartUpload"</pre>  |  `s3` 작업을 사용하면 `"arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillLocation"`으로 지정된 리소스를 읽고 쓸 수 있습니다. 여기서 *MyLambdaSpillLocation*은 호출되는 Lambda 함수의 구성에 지정된 유출 버킷(spill bucket)을 식별합니다. *arn:aws:lambda:\$1:*MyAWSAcctId*:layer:*MyAthenaLambdaLayer*:\$1* 리소스 식별자는 배포 시 함수 아티팩트 크기를 줄이기 위해 Athena 계층을 사용하여 사용자 지정 런타임 종속성을 만드는 경우에만 필요합니다. 마지막 위치에 있는 `*`은 계층 버전의 와일드카드입니다.  | 
|  <pre>"lambda:GetFunction",<br />"lambda:GetLayerVersion",<br />"lambda:InvokeFunction"</pre>  | 쿼리가 Resource 블록에 지정된 AWS Lambda 함수를 호출할 수 있습니다. arn:aws:lambda:\$1:MyAWSAcctId:function:MyAthenaLambdaFunction을 예로 들 수 있습니다. 여기서 MyAthenaLambdaFunction은 호출할 Lambda 함수의 이름을 지정합니다. 예제와 같이 여러 함수를 지정할 수 있습니다. | 

**Example – IAM 보안 주체가 외부 Hive 메타스토어용 Athena 데이터 커넥터를 생성할 수 있도록 허용합니다.**  
다음 정책은 [AWS 관리형 정책: AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy) 외에 Athena 작업에 대한 전체 액세스 권한을 부여하는 IAM 보안 주체에도 연결됩니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:GetFunction",
                "lambda:ListFunctions",
                "lambda:GetLayerVersion",
                "lambda:InvokeFunction",
                "lambda:CreateFunction",
                "lambda:DeleteFunction",
                "lambda:PublishLayerVersion",
                "lambda:DeleteLayerVersion",
                "lambda:UpdateFunctionConfiguration",
                "lambda:PutFunctionConcurrency",
                "lambda:DeleteFunctionConcurrency"
            ],
            "Resource": "arn:aws:lambda:*:111122223333: function: MyAthenaLambdaFunctionsPrefix*"
        }
    ]
}
```
 **권한에 대한 설명**   
쿼리가 `Resource` 블록에 지정된 AWS Lambda 함수에 대한 AWS Lambda 함수를 호출할 수 있습니다. `arn:aws:lambda:*:MyAWSAcctId:function:MyAthenaLambdaFunction`을 예로 들 수 있습니다. 여기서 *MyAthenaLambdaFunction*은 호출되는 Lambda 함수의 이름을 지정합니다. 예제와 같이 여러 함수를 지정할 수 있습니다.

# 외부 Hive 메타스토어에 대한 Lambda 함수 액세스 허용
<a name="hive-metastore-iam-access-lambda"></a>

사용자 계정에서 Lambda 함수를 호출하려면 다음 권한을 가진 역할을 만들어야 합니다.
+ `AWSLambdaVPCAccessExecutionRole` – 함수를 VPC에 연결하는 탄력적 네트워크 인터페이스를 관리하기 위한 [AWS Lambda 실행 역할](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) 권한입니다. 충분한 수의 네트워크 인터페이스 및 IP 주소를 사용할 수 있는지 확인합니다.
+ `AmazonAthenaFullAccess` – [AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy) 관리형 정책은 Athena에 대한 모든 액세스 권한을 부여합니다.
+ Lambda 함수가 S3에 쓸 수 있도록 허용하고 Athena가 S3에서 읽을 수 있도록 허용하는 Amazon S3 정책입니다.

예를 들어 다음 정책은 유출 위치 `s3:\\mybucket\spill`에 대한 권한을 정의합니다.

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

****  

```
{ "Version":"2012-10-17",		 	 	  "Statement": [ { "Effect": "Allow", "Action": [
    "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:PutObject" ], "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/spill" ] } ] }
```

------

IAM 정책을 사용할 때는 항상 IAM 모범 사례를 따라야 합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

## Lambda 함수 생성
<a name="hive-metastore-iam-access-lambda-creating-lambda-functions"></a>

사용자 계정에서 Lambda 함수를 만들려면 함수 개발 권한 또는 `AWSLambdaFullAccess` 역할이 필요합니다. 자세한 내용은 [AWS Lambda에 대한 자격 증명 기반 IAM 정책](https://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html)을 참조하세요.

Athena는 AWS Serverless Application Repository를 사용해 Lambda 함수를 생성하기 때문에 Lambda 함수를 생성하는 슈퍼 사용자 또는 관리자는 [Athena 연합 쿼리를 허용할](federated-query-iam-access.md) IAM 정책도 보유해야 합니다.

## 카탈로그 등록 및 메타데이터 API 작업을 위한 권한 구성
<a name="hive-metastore-iam-access-lambda-catalog-registration-and-metadata-api-operations"></a>

카탈로그 등록 및 메타데이터 작업에 대한 API 액세스에는 [AmazonAthenaFullAccess 관리형 정책](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)을 사용할 수 있습니다. `AmazonAthenaFullAccess` 정책을 사용하지 않는 경우에는 다음 API 작업을 Athena 정책에 추가하세요.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:ListDataCatalogs",
                "athena:GetDataCatalog",
                "athena:CreateDataCatalog",
                "athena:UpdateDataCatalog",
                "athena:DeleteDataCatalog",
                "athena:GetDatabase",
                "athena:ListDatabases",
                "athena:GetTableMetadata",
                "athena:ListTableMetadata"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

------

## 여러 리전에서 Lambda 함수를 직접적으로 호출
<a name="hive-metastore-iam-access-lambda-cross-region-invocation"></a>

기본적으로 Athena는 동일한 리전에 정의된 Lambda 함수를 호출합니다. Athena 쿼리를 실행 중인 리전 이외의 AWS 리전에서 Lambda 함수를 간접적으로 호출하려면 Lambda 함수의 전체 ARN을 사용합니다.

다음 예제에서는 유럽(프랑크푸르트) 리전의 카탈로그가 미국 동부(버지니아 북부) 리전에서 Lambda 함수를 지정하여 유럽(프랑크푸르트) 리전의 Hive 메타스토어에서 데이터를 가져오는 방법을 보여줍니다.

```
arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new     
```

이러한 방식으로 전체 ARN을 지정하면 Athena는 `us-east-1`의 `external-hms-service-new` Lambda 함수를 호출하여 `eu-central-1`에서 Hive 메타스토어 데이터를 가져올 수 있습니다.

**참고**  
카탈로그는 Athena 쿼리를 실행하는 데 사용하는 동일한 AWS 리전에 등록되어야 합니다.

## 여러 계정에서 Lambda 함수 호출
<a name="hive-metastore-iam-access-lambda-cross-account-invocation"></a>

경우에 따라 다른 계정에서 Hive 메타스토어에 액세스해야 할 수도 있습니다. 예를 들어 Hive 메타스토어를 실행하기 위해 Athena 쿼리에 사용하는 계정과 다른 계정을 사용할 수도 있습니다. 여러 그룹 또는 팀이 VPC 내에서 여러 계정으로 Hive 메타스토어를 실행할 수도 있습니다. 또는 여러 그룹 또는 팀에서 여러 Hive 메타스토어의 메타데이터에 액세스해야 할 수도 있습니다.

Athena는 [계정 간 액세스에 대한 AWS Lambda 지원](https://aws.amazon.com/blogs/compute/easy-authorization-of-aws-lambda-functions/)을 사용하여 Hive 메타스토어에 대한 계정 간 액세스를 활성화합니다.

**참고**  
Athena에 대한 계정 간 액세스는 일반적으로 Amazon S3의 메타데이터 및 데이터 모두에 대한 계정 간 액세스를 의미합니다.

다음 시나리오를 예로 들겠습니다.
+ 계정 `111122223333`은 EMR 클러스터에서 실행 중인 Hive 메타스토어에 액세스하기 위해 Athena의 us-east-1에 Lambda 함수 `external-hms-service-new`를 설정합니다.
+ 계정 `111122223333`에서 계정 444455556666이 Hive 메타스토어 데이터에 액세스하도록 허용할 수 있습니다.

Lambda 함수 `external-hms-service-new`에 대한 액세스 권한을 계정 `444455556666`에 부여하기 위해 계정 `111122223333`은 다음 AWS CLI `add-permission` 명령을 사용합니다. 명령은 가독성을 위해 형식이 지정되었습니다.

```
$ aws --profile perf-test lambda add-permission
      --function-name external-hms-service-new
      --region us-east-1
      --statement-id Id-ehms-invocation2
      --action "lambda:InvokeFunction"
      --principal arn:aws:iam::444455556666:user/perf1-test
{
    "Statement": "{\"Sid\":\"Id-ehms-invocation2\",
                   \"Effect\":\"Allow\",
                   \"Principal\":{\"AWS\":\"arn:aws:iam::444455556666:user/perf1-test\"},
                   \"Action\":\"lambda:InvokeFunction\",
                   \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new\"}"
}
```

Lambda 권한을 확인하려면 다음 예제와 같이 `get-policy` 명령을 사용합니다. 명령은 가독성을 위해 형식이 지정되었습니다.

```
$ aws --profile perf-test lambda get-policy 
      --function-name arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new 
      --region us-east-1
{
    "RevisionId": "711e93ea-9851-44c8-a09f-5f2a2829d40f",
    "Policy": "{\"Version\":\"2012-10-17\",		 	 	 
                \"Id\":\"default\",
                \"Statement\":[{\"Sid\":\"Id-ehms-invocation2\",
                                \"Effect\":\"Allow\",
                                \"Principal\":{\"AWS\":\"arn:aws:iam::444455556666:user/perf1-test\"},
                                \"Action\":\"lambda:InvokeFunction\",
                                \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new\"}]}"
}
```

권한을 추가한 후, 카탈로그 `ehms`를 정의할 때 다음과 같이 `us-east-1`에서 Lambda 함수의 전체 ARN을 사용할 수 있습니다.

```
arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new
```

교차 리전 호출에 대한 자세한 내용은 이 주제의 앞부분에 있는 [여러 리전에서 Lambda 함수를 직접적으로 호출](#hive-metastore-iam-access-lambda-cross-region-invocation)을 참조하세요.

### 데이터에 대한 크로스 계정 액세스 권한 부여
<a name="hive-metastore-iam-access-lambda-granting-cross-account-access-to-data"></a>

Athena 쿼리를 실행하려면 먼저 Amazon S3의 데이터에 대한 계정 간 액세스 권한을 부여해야 합니다. 이 작업을 다음 중 한 가지 방법으로 수행할 수 있습니다.
+ Amazon S3 버킷의 액세스 제어 목록 정책을 [정식 사용자 ID](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html)로 업데이트합니다.
+ 계정 간 액세스를 Amazon S3 버킷 정책에 추가합니다.

예를 들어 다음 정책을 계정 `111122223333`의 Amazon S3 버킷 정책에 추가하여 계정 `444455556666`이 지정된 Amazon S3 위치에서 데이터를 읽을 수 있도록 합니다.

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

****  

```
{ "Version":"2012-10-17",		 	 	  "Statement": [ { "Sid": "Stmt1234567890123", "Effect":
    "Allow", "Principal": { "AWS":
        "arn:aws:iam::444455556666:user/perf1-test"
    }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::athena-test/lambda/dataset/*" } ]
    }
```

------

**참고**  
데이터뿐만 아니라 Amazon S3 유출 위치에도 Amazon S3에 대한 계정 간 액세스 권한을 부여해야 할 수도 있습니다. 응답 객체의 크기가 지정된 임계값을 초과하면 Lambda 함수는 여분의 데이터를 유출 위치로 분산합니다. 샘플 정책에 대한 이 주제의 시작 부분을 참조하세요.

현재 예제에서, 교차 계정 액세스가 `444455556666,`에 부여된 후 `444455556666`은 자체 `account`의 카탈로그 `ehms`를 사용하여 계정 `111122223333`에 정의된 테이블을 쿼리할 수 있습니다.

다음 예제에서 SQL Workbench 프로필 `perf-test-1`은 계정 `444455556666`에 대한 것입니다. 쿼리는 카탈로그 `ehms`를 사용하여 계정 `111122223333`의 Amazon S3 데이터 및 Hive 메타스토어에 액세스합니다.

![\[SQL Workbench의 여러 계정에서 Hive 메타스토어 및 Amazon S3 데이터에 액세스.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/hive-metastore-iam-access-lambda-1.png)


# 커넥터 및 Athena 카탈로그를 생성하기 위해 필요한 권한
<a name="athena-catalog-access"></a>

Athena `CreateDataCatalog`를 호출하려면 다음 권한이 있는 역할을 생성해야 합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
  {
  "Sid": "ECR",
  "Effect": "Allow",
  "Action": [
  "ecr:BatchGetImage",
  "ecr:GetDownloadUrlForLayer"
  ],
  "Resource": "arn:aws:ecr:*:*:repository/*"
  },
  {
  "Effect": "Allow",
  "Action": [
  "s3:GetObject",
  "glue:TagResource",
  "glue:GetConnection",
  "glue:CreateConnection",
  "glue:DeleteConnection",
  "glue:UpdateConnection",
  "serverlessrepo:CreateCloudFormationTemplate",
  "serverlessrepo:GetCloudFormationTemplate",
  "cloudformation:CreateStack",
  "cloudformation:DeleteStack",
  "cloudformation:DescribeStacks",
  "cloudformation:CreateChangeSet",
  "cloudformation:DescribeAccountLimits",
  "cloudformation:CreateStackSet",
  "cloudformation:ValidateTemplate",
  "cloudformation:CreateUploadBucket",
  "cloudformation:DescribeStackDriftDetectionStatus",
  "cloudformation:ListExports",
  "cloudformation:ListStacks",
  "cloudformation:EstimateTemplateCost",
  "cloudformation:ListImports",
  "lambda:InvokeFunction",
  "lambda:GetFunction",
  "lambda:DeleteFunction",
  "lambda:CreateFunction",
  "lambda:TagResource",
  "lambda:ListFunctions",
  "lambda:GetAccountSettings",
  "lambda:ListEventSourceMappings",
  "lambda:ListVersionsByFunction",
  "lambda:GetFunctionConfiguration",
  "lambda:PutFunctionConcurrency",
  "lambda:UpdateFunctionConfiguration",
  "lambda:UpdateFunctionCode",
  "lambda:DeleteFunctionConcurrency",
  "lambda:RemovePermission",
  "lambda:AddPermission",
  "lambda:ListTags",
  "lambda:GetAlias",
  "lambda:GetPolicy",
  "lambda:ListAliases",
  "ec2:DescribeSecurityGroups",
  "ec2:DescribeSubnets",
  "ec2:DescribeVpcs",
  "secretsmanager:ListSecrets",
  "glue:GetCatalogs"
  ],
  "Resource": "*"
  },
  {
  "Effect": "Allow",
  "Action": [
  "iam:AttachRolePolicy",
  "iam:DetachRolePolicy",
  "iam:DeleteRolePolicy",
  "iam:PutRolePolicy",
  "iam:GetRolePolicy",
  "iam:CreateRole",
  "iam:TagRole",
  "iam:DeleteRole",
  "iam:GetRole",
  "iam:PassRole",
  "iam:ListRoles",
  "iam:ListAttachedRolePolicies",
  "iam:ListRolePolicies",
  "iam:GetPolicy",
  "iam:UpdateRole"
  ],
  "Resource": [
  "arn:aws:iam::*:role/RoleName",
  "arn:aws:iam::111122223333:policy/*"
  ]
  }
  ]
  }
```

------

# Athena 페더레이션 쿼리에 대한 액세스 허용: 정책 예제
<a name="federated-query-iam-access"></a>

이 주제의 권한 정책 예제에서는 필요한 허용된 작업과 해당 작업이 허용되는 리소스를 보여줍니다. IAM 자격 증명에 연결하기 전에 이러한 정책을 신중하게 검토하고 요구 사항에 따라 수정합니다.

IAM 자격 증명에 정책을 연결하는 방법에 대한 자세한 내용은 [IAM 사용 설명서](https://docs.aws.amazon.com/IAM/latest/UserGuide/)의 [IAM 자격 증명 권한 추가 및 제거](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)를 참조하세요.
+  [Example policy to allow an IAM principal to run and return results using Athena Federated Query](#fed-using-iam) 
+  [Example Policy to Allow an IAM Principal to Create a Data Source Connector](#fed-creating-iam) 

**Example - IAM 보안 주체가 Athena 연합 쿼리를 사용하여 쿼리를 실행하고 결과를 반환할 수 있도록 허용합니다.**  
다음 자격 증명 기반 권한 정책은 사용자 또는 다른 IAM 보안 주체가 Athena 연합 쿼리를 사용하는 데 필요한 작업을 허용합니다. 이러한 작업을 수행할 수 있는 보안 주체는 연합 데이터 원본과 연결된 Athena 카탈로그를 지정하는 쿼리를 실행할 수 있습니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Athena",
            "Effect": "Allow",
            "Action": [
                "athena:GetDataCatalog",
                "athena:GetQueryExecution",
                "athena:GetQueryResults",
                "athena:GetWorkGroup",
                "athena:StartQueryExecution",
                "athena:StopQueryExecution"
            ],
            "Resource": [
                "arn:aws:athena:*:111122223333:workgroup/WorkgroupName",
                "arn:aws:athena:us-east-1:111122223333:datacatalog/DataCatalogName"
            ]
        },
        {
            "Sid": "ListAthenaWorkGroups",
            "Effect": "Allow",
            "Action": "athena:ListWorkGroups",
            "Resource": "*"
        },
        {
            "Sid": "Lambda",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:OneAthenaLambdaFunction",
                "arn:aws:lambda:*:111122223333:function:AnotherAthenaLambdaFunction"
            ]
        },
        {
            "Sid": "S3",
            "Effect": "Allow",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListMultipartUploadParts",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::MyLambdaSpillBucket",
                "arn:aws:s3:::MyLambdaSpillBucket/*",
                "arn:aws:s3:::MyQueryResultsBucket",
                "arn:aws:s3:::MyQueryResultsBucket/*"
            ]
        }
    ]
}
```


**권한에 대한 설명**  

| 허용된 작업 | 설명 | 
| --- | --- | 
|  <pre> "athena:GetQueryExecution", <br /> "athena:GetQueryResults",<br /> "athena:GetWorkGroup",<br /> "athena:StartQueryExecution",<br /> "athena:StopQueryExecution"</pre>  |  연합 쿼리를 실행하는 데 필요한 Athena 권한입니다.  | 
|  <pre> "athena:GetDataCatalog",<br /> "athena:GetQueryExecution,"<br /> "athena:GetQueryResults",<br /> "athena:GetWorkGroup",<br /> "athena:StartQueryExecution",<br /> "athena:StopQueryExecution"</pre>  |  페더레이션된 보기 쿼리를 실행하는 데 필요한 Athena 권한입니다. 뷰에는 `GetDataCatalog` 작업이 필요합니다.  | 
|  <pre>"lambda:InvokeFunction"</pre>  | 쿼리가 Resource 블록에 지정된 AWS Lambda 함수에 대한 AWS Lambda 함수를 호출할 수 있습니다. arn:aws:lambda:\$1:MyAWSAcctId:function:MyAthenaLambdaFunction을 예로 들 수 있습니다. 여기서 MyAthenaLambdaFunction은 호출되는 Lambda 함수의 이름을 지정합니다. 예제와 같이 여러 함수를 지정할 수 있습니다. | 
|  <pre>"s3:AbortMultipartUpload",<br />"s3:GetBucketLocation",<br />"s3:GetObject",<br />"s3:ListBucket",<br />"s3:ListMultipartUploadParts",<br />"s3:PutObject"</pre>  |  `StartQueryExecution`을 실행하는 IAM 보안 주체에 대한 쿼리 출력 버킷에 액세스하려면 `s3:ListBucket` 및 `s3:GetBucketLocation` 권한이 필요합니다. `s3:PutObject`, `s3:ListMultipartUploadParts` 및 `s3:AbortMultipartUpload`는 `arn:aws:s3:::MyQueryResultsBucket/*` 리소스 식별자에 지정된 대로 쿼리 결과 버킷의 모든 하위 폴더에 쿼리 결과를 작성하도록 허용합니다. 여기서 *MyQueryResultsBucket*은 Athena 쿼리 결과 버킷입니다. 자세한 내용은 [쿼리 결과 및 최근 쿼리 작업](querying.md) 섹션을 참조하세요. `s3:GetObject`는 `arn:aws:s3:::MyQueryResultsBucket`으로 지정된 리소스에 대한 쿼리 결과 및 쿼리 기록을 읽을 수 있도록 허용합니다. 여기서 *MyQueryResultsBucket*은 Athena 쿼리 결과 버킷입니다. 또한 `s3:GetObject`는 `"arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillPrefix*"`로 지정된 리소스에서 읽을 수 있도록 허용합니다. 여기서 *MyLambdaSpillPrefix*는 호출되는 Lambda 함수의 구성에서 지정됩니다.  | 

**Example - IAM 보안 주체가 데이터 원본 커넥터를 생성하도록 허용합니다.**  

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "lambda:ListVersionsByFunction",
                "iam:CreateRole",
                "lambda:GetFunctionConfiguration",
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy",
                "lambda:PutFunctionConcurrency",
                "iam:PassRole",
                "iam:DetachRolePolicy",
                "lambda:ListTags",
                "iam:ListAttachedRolePolicies",
                "iam:DeleteRolePolicy",
                "lambda:DeleteFunction",
                "lambda:GetAlias",
                "iam:ListRolePolicies",
                "iam:GetRole",
                "iam:GetPolicy",
                "lambda:InvokeFunction",
                "lambda:GetFunction",
                "lambda:ListAliases",
                "lambda:UpdateFunctionConfiguration",
                "iam:DeleteRole",
                "lambda:UpdateFunctionCode",
                "s3:GetObject",
                "lambda:AddPermission",
                "iam:UpdateRole",
                "lambda:DeleteFunctionConcurrency",
                "lambda:RemovePermission",
                "iam:GetRolePolicy",
                "lambda:GetPolicy"
            ],
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:MyAthenaLambdaFunctionsPrefix*",
                "arn:aws:s3:::awsserverlessrepo-changesets-1iiv3xa62ln3m/*",
                "arn:aws:iam::*:role/RoleName",
                "arn:aws:iam::111122223333:policy/*"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateUploadBucket",
                "cloudformation:DescribeStackDriftDetectionStatus",
                "cloudformation:ListExports",
                "cloudformation:ListStacks",
                "cloudformation:ListImports",
                "lambda:ListFunctions",
                "iam:ListRoles",
                "lambda:GetAccountSettings",
                "ec2:DescribeSecurityGroups",
                "cloudformation:EstimateTemplateCost",
                "ec2:DescribeVpcs",
                "lambda:ListEventSourceMappings",
                "cloudformation:DescribeAccountLimits",
                "ec2:DescribeSubnets",
                "cloudformation:CreateStackSet",
                "cloudformation:ValidateTemplate"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "cloudformation:*",
            "Resource": [
                "arn:aws:cloudformation:*:111122223333:stack/aws-serverless-repository-MyCFStackPrefix*/*",
                "arn:aws:cloudformation:*:111122223333:stack/serverlessrepo-MyCFStackPrefix*/*",
                "arn:aws:cloudformation:*:*:transform/Serverless-*",
                "arn:aws:cloudformation:*:111122223333:stackset/aws-serverless-repository-MyCFStackPrefix*:*",
                "arn:aws:cloudformation:*:111122223333:stackset/serverlessrepo-MyCFStackPrefix*:*"
            ]
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "serverlessrepo:*",
            "Resource": "arn:aws:serverlessrepo:*:*:applications/*"
        },
        {
            "Sid": "ECR",
            "Effect": "Allow",
            "Action": [
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer"
            ],
            "Resource": "arn:aws:ecr:*:*:repository/*"
        }
    ]
}
```


**권한에 대한 설명**  

| 허용된 작업 | 설명 | 
| --- | --- | 
|  <pre>"lambda:CreateFunction",<br />"lambda:ListVersionsByFunction",<br />"lambda:GetFunctionConfiguration",<br />"lambda:PutFunctionConcurrency",<br />"lambda:ListTags",<br />"lambda:DeleteFunction",<br />"lambda:GetAlias",<br />"lambda:InvokeFunction",<br />"lambda:GetFunction",<br />"lambda:ListAliases",<br />"lambda:UpdateFunctionConfiguration",<br />"lambda:UpdateFunctionCode",<br />"lambda:AddPermission",<br />"lambda:DeleteFunctionConcurrency",<br />"lambda:RemovePermission",<br />"lambda:GetPolicy"<br />"lambda:GetAccountSettings",<br />"lambda:ListFunctions",<br />"lambda:ListEventSourceMappings",<br /></pre>  |  리소스로 나열된 Lambda 함수의 생성 및 관리를 허용합니다. 이 예제에서는 이름 접두사가 리소스 식별자 `arn:aws:lambda:*:MyAWSAcctId:function:MyAthenaLambdaFunctionsPrefix*`에 사용됩니다. 여기서 `MyAthenaLambdaFunctionsPrefix`는 Lambda 함수 그룹의 이름에 사용되는 공유 접두사이므로 리소스로 개별적으로 지정할 필요가 없습니다. 하나 이상의 Lambda 함수 리소스를 지정할 수 있습니다.  | 
|  <pre>"s3:GetObject"</pre>  | 리소스 식별자 arn:aws:s3:::awsserverlessrepo-changesets-1iiv3xa62ln3m/\$1에 지정된 대로 AWS Serverless Application Repository이 요구하는 버킷을 읽을 수 있습니다. 이 버킷은 사용자 계정에만 해당될 수 있습니다. | 
|  <pre>"cloudformation:*"</pre>  |  `MyCFStackPrefix` 리소스에 의해 지정된 CloudFormation 스택의 생성 및 관리를 허용합니다. 이러한 스택 및 스택 세트는 AWS Serverless Application Repository이 커넥터와 UDF를 배포하는 방법입니다.  | 
|  <pre>"serverlessrepo:*"</pre>  | AWS Serverless Application Repository에서 리소스 식별자 arn:aws:serverlessrepo:\$1:\$1:applications/\$1로 지정된 애플리케이션을 검색하고 보고 게시 및 업데이트할 수 있습니다. | 
|  <pre>"ecr:BatchGetImage",<br />"ecr:GetDownloadUrlForLayer"</pre>  |  생성된 Lambda 함수가 페더레이션 커넥터 ECR 이미지에 액세스할 수 있도록 허용합니다.  | 

# Athena UDF에 대한 액세스 허용: 정책 예제
<a name="udf-iam-access"></a>

이 주제의 권한 정책 예제에서는 필요한 허용된 작업과 해당 작업이 허용되는 리소스를 보여줍니다. IAM 자격 증명에 유사한 권한 정책을 연결하기 전에 이러한 정책을 신중하게 검토하고 요구 사항에 따라 수정합니다.
+  [Example Policy to Allow an IAM Principal to Run and Return Queries that Contain an Athena UDF Statement](#udf-using-iam) 
+  [Example Policy to Allow an IAM Principal to Create an Athena UDF](#udf-creating-iam) 

**Example - IAM 보안 주체가 Athena UDF 문을 포함한 쿼리를 실행하고 결과를 반환하도록 허용합니다.**  
다음 자격 증명 기반 권한 정책은 사용자 또는 다른 IAM 보안 주체가 Athena UDF 문을 사용하는 쿼리를 실행하는 데 필요한 작업을 허용합니다.  

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "athena:StartQueryExecution",
                "lambda:InvokeFunction",
                "athena:GetQueryResults",
                "s3:ListMultipartUploadParts",
                "athena:GetWorkGroup",
                "s3:PutObject",
                "s3:GetObject",
                "s3:AbortMultipartUpload",
                "athena:StopQueryExecution",
                "athena:GetQueryExecution",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:athena:*:MyAWSAcctId:workgroup/MyAthenaWorkGroup",
                "arn:aws:s3:::MyQueryResultsBucket/*",
                "arn:aws:lambda:*:MyAWSAcctId:function:OneAthenaLambdaFunction",
                "arn:aws:lambda:*:MyAWSAcctId:function:AnotherAthenaLambdaFunction"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "athena:ListWorkGroups",
            "Resource": "*"
        }
    ]
}
```


**권한에 대한 설명**  

| 허용된 작업 | 설명 | 
| --- | --- | 
|  <pre>"athena:StartQueryExecution",<br /> "athena:GetQueryResults",<br /> "athena:GetWorkGroup",<br /> "athena:StopQueryExecution",<br /> "athena:GetQueryExecution",<br /></pre>  |  `MyAthenaWorkGroup` 작업 그룹에서 쿼리를 실행하는 데 필요한 Athena 권한입니다.  | 
|  <pre>"s3:PutObject",<br />"s3:GetObject",<br />"s3:AbortMultipartUpload"</pre>  |  `s3:PutObject` 및 `s3:AbortMultipartUpload`는 `arn:aws:s3:::MyQueryResultsBucket/*` 리소스 식별자에 지정된 대로 쿼리 결과 버킷의 모든 하위 폴더에 쿼리 결과를 작성하도록 허용합니다. 여기서 *MyQueryResultsBucket*은 Athena 쿼리 결과 버킷입니다. 자세한 내용은 [쿼리 결과 및 최근 쿼리 작업](querying.md) 단원을 참조하세요. `s3:GetObject`는 `arn:aws:s3:::MyQueryResultsBucket`으로 지정된 리소스에 대한 쿼리 결과 및 쿼리 기록을 읽을 수 있도록 허용합니다. 여기서 *MyQueryResultsBucket*은 Athena 쿼리 결과 버킷입니다. 자세한 내용은 [쿼리 결과 및 최근 쿼리 작업](querying.md) 단원을 참조하세요. 또한 `s3:GetObject`는 `"arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillPrefix*"`로 지정된 리소스에서 읽을 수 있도록 허용합니다. 여기서 *MyLambdaSpillPrefix*는 호출되는 Lambda 함수의 구성에서 지정됩니다.  | 
|  <pre>"lambda:InvokeFunction"</pre>  | 쿼리가 Resource 블록에 지정된 AWS Lambda 함수를 호출할 수 있습니다. arn:aws:lambda:\$1:MyAWSAcctId:function:MyAthenaLambdaFunction을 예로 들 수 있습니다. 여기서 MyAthenaLambdaFunction은 호출할 Lambda 함수의 이름을 지정합니다. 예제와 같이 여러 함수를 지정할 수 있습니다. | 

**Example - IAM 보안 주체가 Athena UDF를 생성할 수 있도록 허용합니다.**  

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "lambda:ListVersionsByFunction",
                "iam:CreateRole",
                "lambda:GetFunctionConfiguration",
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy",
                "lambda:PutFunctionConcurrency",
                "iam:PassRole",
                "iam:DetachRolePolicy",
                "lambda:ListTags",
                "iam:ListAttachedRolePolicies",
                "iam:DeleteRolePolicy",
                "lambda:DeleteFunction",
                "lambda:GetAlias",
                "iam:ListRolePolicies",
                "iam:GetRole",
                "iam:GetPolicy",
                "lambda:InvokeFunction",
                "lambda:GetFunction",
                "lambda:ListAliases",
                "lambda:UpdateFunctionConfiguration",
                "iam:DeleteRole",
                "lambda:UpdateFunctionCode",
                "s3:GetObject",
                "lambda:AddPermission",
                "iam:UpdateRole",
                "lambda:DeleteFunctionConcurrency",
                "lambda:RemovePermission",
                "iam:GetRolePolicy",
                "lambda:GetPolicy"
            ],
            "Resource": [
                "arn:aws:lambda:*:111122223333:function:MyAthenaLambdaFunctionsPrefix*",
                "arn:aws:s3:::awsserverlessrepo-changesets-1iiv3xa62ln3m/*",
                "arn:aws:iam::*:role/RoleName",
                "arn:aws:iam::111122223333:policy/*"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateUploadBucket",
                "cloudformation:DescribeStackDriftDetectionStatus",
                "cloudformation:ListExports",
                "cloudformation:ListStacks",
                "cloudformation:ListImports",
                "lambda:ListFunctions",
                "iam:ListRoles",
                "lambda:GetAccountSettings",
                "ec2:DescribeSecurityGroups",
                "cloudformation:EstimateTemplateCost",
                "ec2:DescribeVpcs",
                "lambda:ListEventSourceMappings",
                "cloudformation:DescribeAccountLimits",
                "ec2:DescribeSubnets",
                "cloudformation:CreateStackSet",
                "cloudformation:ValidateTemplate"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "cloudformation:*",
            "Resource": [
                "arn:aws:cloudformation:*:111122223333:stack/aws-serverless-repository-MyCFStackPrefix*/*",
                "arn:aws:cloudformation:*:111122223333:stack/serverlessrepo-MyCFStackPrefix*/*",
                "arn:aws:cloudformation:*:*:transform/Serverless-*",
                "arn:aws:cloudformation:*:111122223333:stackset/aws-serverless-repository-MyCFStackPrefix*:*",
                "arn:aws:cloudformation:*:111122223333:stackset/serverlessrepo-MyCFStackPrefix*:*"
            ]
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "serverlessrepo:*",
            "Resource": "arn:aws:serverlessrepo:*:*:applications/*"
        },
        {
            "Sid": "ECR",
            "Effect": "Allow",
            "Action": [
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer"
            ],
            "Resource": "arn:aws:ecr:*:*:repository/*"
        }
    ]
}
```


**권한에 대한 설명**  

| 허용된 작업 | 설명 | 
| --- | --- | 
|  <pre>"lambda:CreateFunction",<br />"lambda:ListVersionsByFunction",<br />"lambda:GetFunctionConfiguration",<br />"lambda:PutFunctionConcurrency",<br />"lambda:ListTags",<br />"lambda:DeleteFunction",<br />"lambda:GetAlias",<br />"lambda:InvokeFunction",<br />"lambda:GetFunction",<br />"lambda:ListAliases",<br />"lambda:UpdateFunctionConfiguration",<br />"lambda:UpdateFunctionCode",<br />"lambda:AddPermission",<br />"lambda:DeleteFunctionConcurrency",<br />"lambda:RemovePermission",<br />"lambda:GetPolicy"<br />"lambda:GetAccountSettings",<br />"lambda:ListFunctions",<br />"lambda:ListEventSourceMappings",<br /></pre>  |  리소스로 나열된 Lambda 함수의 생성 및 관리를 허용합니다. 이 예제에서는 이름 접두사가 리소스 식별자 `arn:aws:lambda:*:MyAWSAcctId:function:MyAthenaLambdaFunctionsPrefix*`에 사용됩니다. 여기서 *MyAthenaLambdaFunctionsPrefix*는 Lambda 함수 그룹의 이름에 사용되는 공유 접두사이므로 리소스로 개별적으로 지정할 필요가 없습니다. 하나 이상의 Lambda 함수 리소스를 지정할 수 있습니다.  | 
|  <pre>"s3:GetObject"</pre>  | 리소스 식별자 arn:aws:s3:::awsserverlessrepo-changesets-1iiv3xa62ln3m/\$1에 지정된 대로 AWS Serverless Application Repository이 요구하는 버킷을 읽을 수 있습니다. | 
|  <pre>"cloudformation:*"</pre>  |  *MyCFStackPrefix* 리소스에 의해 지정된 CloudFormation 스택의 생성 및 관리를 허용합니다. 이러한 스택 및 스택 세트는 AWS Serverless Application Repository이 커넥터와 UDF를 배포하는 방법입니다.  | 
|  <pre>"serverlessrepo:*"</pre>  | AWS Serverless Application Repository에서 리소스 식별자 arn:aws:serverlessrepo:\$1:\$1:applications/\$1로 지정된 애플리케이션을 검색하고 보고 게시 및 업데이트할 수 있습니다. | 

# Athena를 통한 ML에 액세스 허용
<a name="machine-learning-iam-access"></a>

Athena ML 쿼리를 실행하는 IAM 보안 주체는 자신이 사용하는 Sagemaker 엔드포인트 대한 `sagemaker:invokeEndpoint` 작업을 수행할 수 있어야 합니다. 사용자 자격 증명에 연결된 ID 기반 권한 정책에 다음과 유사한 정책 문을 포함합니다. 또한 Athena 작업에 대한 전체 액세스 권한을 부여하는 [AWS 관리형 정책: AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy), 또는 작업의 하위 집합을 허용하는 수정된 인라인 정책을 연결합니다.

예제에서 `arn:aws:sagemaker:region:AWSAcctID:ModelEndpoint`를 쿼리에 사용할 모델 엔드포인트의 ARN 또는 ARN으로 바꿉니다. 자세한 내용은 *서비스 권한 부여 참조*에서 [SageMaker AI에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonsagemaker.html)를 참조하세요.

```
{
            "Effect": "Allow",
            "Action": [
                "sagemaker:invokeEndpoint"
            ],
            "Resource": "arn:aws:sagemaker:us-west-2:123456789012:workteam/public-crowd/default"
}
```

IAM 정책을 사용할 때마다 IAM 모범 사례를 따라야 합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

# Athena API에 대한 페더레이션 액세스 활성화
<a name="access-federation-saml"></a>

이 단원에서는 조직의 사용자 또는 클라이언트 애플리케이션이 Amazon Athena API 작업을 호출하는 데 사용할 수 있는 연합 액세스에 대해 설명합니다. 이 경우 조직의 사용자는 Athena에 직접 액세스할 수 없습니다. 그 대신, Microsoft Active Directory에서 AWS 외부의 사용자 자격 증명을 관리합니다. Active Directory는 [SAML 2.0](https://wiki.oasis-open.org/security)(Security Assertion Markup Language 2.0)를 지원합니다.

이 시나리오에서 사용자를 인증하려면 Active Directory Federation Services(ADFS) 3.0에 액세스하고 Athena API 작업 호출을 위해 클라이언트 애플리케이션을 활성화하는 SAML.2.0 지원이 포함된 JDBC 또는 ODBC 드라이버를 사용합니다.

AWS에서 SAML 2.0 지원에 대한 자세한 내용은 *IAM 사용 설명서*에서 [SAML 2.0 연합에 대하여](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html)를 참조하세요.

**참고**  
Athena API에 대한 연합 액세스는 특정 유형의 자격 증명 공급자(IdP)인 Active Directory Federation Service(AD FS 3.0)(Windows Server의 일부)에 대해 지원됩니다. 연동 액세스는 IAM Identity Center의 신뢰할 수 있는 ID 전파 기능과 호환되지 않습니다. 액세스는 SAML 2.0을 지원하는 JDBC 또는 ODBC 드라이버 버전을 통해 설정됩니다. 자세한 내용은 [JDBC로 Amazon Athena에 연결](connect-with-jdbc.md) 및 [ODBC로 Amazon Athena에 연결](connect-with-odbc.md) 단원을 참조하세요.

**Topics**
+ [

## 시작하기 전 준비 사항
](#access-federation-before-you-begin)
+ [

## 인증 프로세스 이해
](#access-federation-diagram)
+ [

## 절차: Athena API에 대한 SAML 기반 페더레이션 액세스 활성화
](#access-federation-procedure)

## 시작하기 전 준비 사항
<a name="access-federation-before-you-begin"></a>

 시작하기 전에 다음 필수 조건을 완료합니다.
+ 조직 내부에서 AD FS 3.0을 설치하고 IdP로 구성합니다.
+ Athena 액세스에 사용되는 클라이언트에 JDBC 또는 ODBC 드라이버의 최신 버전을 설치하고 구성합니다. 드라이버는 SAML 2.0과 호환되는 연합 액세스에 대한 지원을 포함해야 합니다. 자세한 내용은 [JDBC로 Amazon Athena에 연결](connect-with-jdbc.md) 및 [ODBC로 Amazon Athena에 연결](connect-with-odbc.md) 단원을 참조하세요.

## 인증 프로세스 이해
<a name="access-federation-diagram"></a>

다음 다이어그램은 Athena API에 대한 페더레이션 액세스의 인증 프로세스를 보여줍니다.

![\[Athena API에 대한 페더레이션 액세스의 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/athena-saml-based-federation.png)


1. 조직 내 사용자는 클라이언트 애플리케이션을 JDBC 또는 ODBC 드라이버와 함께 사용하여 조직의 IdP에게 인증을 요청합니다. IdP는 AD FS 3.0입니다.

1. IdP는 조직의 자격 증명 스토어인 Active Directory에 대해 사용자를 인증합니다.

1. IdP는 사용자에 대한 정보로 SAML 어설션을 구성하여 JDBC 또는 ODBC 드라이버를 통해 클라이언트 애플리케이션에 전송합니다.

1. JDBC 또는 ODBC 드라이버는 AWS Security Token Service [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API 작업을 호출하여 이 작업에 다음 파라미터를 전달합니다.
   + SAML 공급자의 ARN
   + 수임할 역할의 ARN
   + IdP의 SAML 어설션

   자세한 내용은 *AWS Security Token Service API 참조*의 [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html)을 참조하세요.

1. JDBC 또는 ODBC 드라이버를 통해 클라이언트 애플리케이션으로 보내는 API 응답에는 임시 보안 자격 증명이 포함됩니다.

1. 클라이언트 애플리케이션은 사용자가 Athena API 작업에 액세스할 수 있도록 임시 보안 자격 증명을 사용하여 Athena API 작업을 호출합니다.

## 절차: Athena API에 대한 SAML 기반 페더레이션 액세스 활성화
<a name="access-federation-procedure"></a>

이 절차에서는 조직의 IdP와 AWS 계정 간에 신뢰를 확립하여 Amazon Athena API 작업에 대한 SAML 기반 연합 액세스를 활성화합니다.

**Athena API에 대한 연합 액세스를 활성화하려면:**

1. 조직에서 AWS를 IdP의 서비스 공급자(SP)로 등록합니다. 이 프로세스를 *신뢰 당사자 신뢰*라고 합니다. 자세한 내용은 *IAM 사용 설명서*의 [신뢰 당사자 신뢰로 SAML 2.0 IdP 구성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_relying-party.html)을 참조하세요. 이 작업의 일부로 다음 단계를 수행합니다.

   1. 다음 URL에서 샘플 SAML 메타데이터 문서를 가져옵니다. [https://signin.aws.amazon.com/static/saml-metadata.xml](https://signin.aws.amazon.com/static/saml-metadata.xml).

   1. 조직의 IdP(ADFS)에서 IdP를 AWS에 대한 자격 증명 공급자로 설명하는 동등한 메타데이터 XML 파일을 생성합니다. 메타데이터 파일에는 발행자 이름, 생성 날짜, 만료 날짜 및 AWS가 조직에서 오는 인증 응답의 유효성을 검증하는 데 사용할 수 있는 키가 포함되어야 합니다.

1. IAM 콘솔에서 SAML 자격 증명 공급자 개체를 생성합니다. 자세한 내용은 *IAM 사용 설명서*의 [SAML 자격 증명 공급자 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html)을 참조하세요. 이 단계의 일부로 다음을 포함합니다.

   1. IAM 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 엽니다.

   1. 이 절차에서 1단계의 IdP(ADFS)가 생성한 SAML 메타데이터 문서를 업로드합니다.

1. IAM 콘솔에서 IdP에 대해 하나 이상의 IAM 역할을 생성합니다. 자세한 내용은 *IAM 사용 설명서*의 [서드 파티 자격 증명 공급자의 역할 만들기(연합)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp.html)을 참조하세요. 이 단계의 일부로 다음을 포함합니다.
   + 역할의 권한 정책에서 조직의 사용자가 AWS에서 수행할 수 있는 작업을 나열합니다.
   + 역할의 신뢰 정책에서 이 절차의 2단계에서 생성한 SAML 공급자 엔터티를 보안 주체로 설정합니다.

   이렇게 하면 조직과 AWS 사이에 신뢰 관계가 설정됩니다.

1. 조직의 IdP(ADFS)에서 조직 내 사용자 또는 그룹을 IAM 역할에 매핑하는 어설션을 정의합니다. IAM 역할에 대한 사용자와 그룹의 매핑을 *클레임 규칙(claim rule)*이라고 합니다. 조직의 다양한 사용자 및 그룹은 서로 다른 IAM 역할에 매핑될 수 있다는 점에 유의하세요.

   ADFS에서 매핑을 구성하는 방법에 대한 자세한 내용은 [Windows Active Directory, ADFS 및 SAML 2.0을 사용하여 AWS에 대한 연합 활성화](https://aws.amazon.com/blogs/security/enabling-federation-to-aws-using-windows-active-directory-adfs-and-saml-2-0/) 블로그 게시물을 참조하세요.

1. SAML 2.0 지원이 포함된 JDBC 또는 ODBC 드라이버를 설치하고 구성합니다. 자세한 내용은 [JDBC로 Amazon Athena에 연결](connect-with-jdbc.md) 및 [ODBC로 Amazon Athena에 연결](connect-with-odbc.md) 단원을 참조하세요.

1. 애플리케이션에서 JDBC 또는 ODBC 드라이버로 연결을 지정합니다. 애플리케이션에서 사용해야 할 연결 문자열에 대한 자세한 내용은 *JDBC Driver Installation and Configuration Guide*의 *‘Using the Active Directory Federation Services (ADFS) Credentials Provider’* 또는 *ODBC Driver Installation and Configuration Guide*의 비슷한 주제를 참조하세요. [JDBC로 Amazon Athena에 연결](connect-with-jdbc.md) 및 [ODBC로 Amazon Athena에 연결](connect-with-odbc.md) 주제에서 PDF로 다운로드할 수 있습니다.

   다음은 드라이버에 연결 문자열을 구성하는 방법에 대한 개괄적인 요약입니다.

   1. `AwsCredentialsProviderClass configuration`에서 `com.simba.athena.iamsupport.plugin.AdfsCredentialsProvider`를 설정하여 ADFS IdP를 통해 SAML 2.0 기반 인증을 사용합니다.

   1. `idp_host`에 ADFS IdP 서버의 호스트 이름을 입력합니다.

   1. `idp_port`에 ADFS IdP가 SAML 어설션 요청에 대해 수신 대기하는 포트 번호를 입력합니다.

   1. `UID` 및 `PWD`에 AD 도메인 사용자 자격 증명을 제공합니다. Windows에서 드라이버를 사용하는 경우 `UID` 및 `PWD`를 입력하지 않으면 드라이버는 Windows 시스템에 로그인한 사용자의 사용자 자격 증명을 가져오려고 합니다.

   1. 선택적으로 `ssl_insecure`를 `true`로 설정합니다. 이 경우 드라이버는 ADFS IdP 서버에 대한 SSL 인증서의 신뢰성을 확인하지 않습니다. 드라이버에서 신뢰할 수 있도록 ADFS IdP의 SSL 인증서를 구성하지 않은 경우 `true`로 설정해야 합니다.

   1. 하나 이상의 IAM 역할에 대한 Active Directory 도메인 사용자 또는 그룹의 매핑을 활성화하려면(이 절차의 4단계에서 언급함) JDBC 또는 ODBC 연결에 대한 `preferred_role`에서 드라이버 연결을 수임할 IAM 역할(ARN)을 지정합니다. `preferred_role` 지정은 선택 사항이며 역할이 클레임 규칙에 나열된 첫 번째 역할이 아닌 경우에 유용합니다.

   이 절차를 수행하면 다음 작업이 수행됩니다.

   1. JDBC 또는 ODBC 드라이버가 AWS STS [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API를 호출하고 [아키텍처 다이어그램](#access-federation-diagram)의 4단계와 같이 이 API에 어설션을 전달합니다.

   1. AWS는 역할 수임 요청이 SAML 공급자 엔터티에서 참조된 IdP로부터 오는지 확인합니다.

   1. 요청이 성공하면 AWS STS [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API 작업은 일련의 임시 보안 자격 증명을 반환하고 클라이언트 애플리케이션은 이 자격 증명을 사용하여 Athena에 대한 서명된 요청을 생성합니다.

      이제 애플리케이션은 현재 사용자에 대한 정보를 갖추었으며 프로그래밍 방식으로 Athena에 액세스할 수 있습니다.

# Athena 로깅 및 모니터링
<a name="security-logging-monitoring"></a>

인시던트를 탐지하고 인시던트가 발생했을 때 경고를 받고 그에 응답하려면 Amazon Athena 옵션과 함께 다음 옵션을 사용하세요.
+ **AWS CloudTrail을 사용하여 Athena 모니터링** - [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)은 Athena의 사용자, 역할 또는 AWS 서비스가 수행한 작업에 대한 레코드를 제공합니다. 이 서비스는 Athena 콘솔에서 수행한 호출과 Athena API 작업에 대한 코드 호출을 캡처합니다. 이를 통해 Athena에 수행된 요청, 요청이 수행된 IP 주소, 요청을 수행한 사람, 요청이 수행된 시간 및 추가 세부 정보를 확인할 수 있습니다. 자세한 내용은 [AWS CloudTrail을 사용하여 Amazon Athena API 직접 호출 로깅](monitor-with-cloudtrail.md) 섹션을 참조하세요.

  Athena를 사용하여 Athena뿐만 아니라 다른 AWS 서비스에 대해서도 CloudTrail 로그 파일을 쿼리할 수 있습니다. 자세한 내용은 [AWS CloudTrail 로그 쿼리](cloudtrail-logs.md) 섹션을 참조하세요.
+ **CloudTrail 및 Amazon Quick으로 Athena 사용량 모니터링** – [Amazon Quick](https://aws.amazon.com/quicksight/)은 완전관리형의 클라우드 기반 비즈니스 인텔리전스 서비스로서 이를 통해 조직 구성원이 모든 장치에서 액세스할 수 있는 대화형 대시보드를 만들 수 있습니다. CloudTrail과 Amazon Quick을 사용하여 Athena 사용량을 모니터링하는 솔루션의 예는 AWS Big Data Blog 게시물 [How Realtor.com monitors Amazon Athena usage with AWS CloudTrail and Quick](https://aws.amazon.com/blogs/big-data/analyzing-amazon-athena-usage-by-teams-within-a-real-estate-company/)을 참조하세요.
+ **Athena에서 EventBridge 사용** - Amazon EventBridge는 AWS 리소스의 변경 사항을 설명하는 시스템 이벤트의 스트림을 거의 실시간으로 제공합니다. EventBridge는 이러한 운영 변경 발생 시 이를 인지하고 응답하며, 환경에 응답하기 위한 메시지를 전송하고, 함수를 활성화하며, 변경을 수행하고, 상태 정보를 기록하는 등 필요에 따라 교정 조치를 취합니다. 이벤트는 최선의 작업을 기반으로 발생됩니다. 자세한 내용은 *Amazon EventBridge 사용 설명서*의 [Amazon EventBridge 시작하기](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-get-started.html)를 참조하세요.
+ **작업 그룹을 사용하여 사용자, 팀, 애플리케이션 또는 작업 부하를 분리하고 쿼리 제한을 설정하고 쿼리 비용을 통제** - 검색되는 데이터의 양에 대한 제한을 구성하고 임계값과 이러한 임계값이 위반되는 경우에 대해 Amazon SNS 경보와 같은 트리거 조치를 만들어 Amazon CloudWatch의 쿼리 관련 지표를 보고 쿼리 비용을 통제할 수 있습니다. 자세한 내용은 [작업 그룹을 사용하여 쿼리 액세스 및 비용 제어](workgroups-manage-queries-control-costs.md) 섹션을 참조하세요. 리소스 수준 IAM 권한을 사용하여 특정 작업 그룹에 대한 액세스를 제어할 수 있습니다. 자세한 내용은 [IAM 정책을 사용하여 작업 그룹 액세스 제어](workgroups-iam-policy.md) 및 [CloudWatch 및 EventBridge를 사용하여 쿼리 모니터링 및 비용 제어](workgroups-control-limits.md) 단원을 참조하세요.

**Topics**
+ [

# AWS CloudTrail을 사용하여 Amazon Athena API 직접 호출 로깅
](monitor-with-cloudtrail.md)

# AWS CloudTrail을 사용하여 Amazon Athena API 직접 호출 로깅
<a name="monitor-with-cloudtrail"></a>

Athena는 Athena에서 사용자, 역할 또는 AWS 서비스가 수행한 작업에 대한 레코드를 제공하는 서비스인 AWS CloudTrail과 통합됩니다.

CloudTrail은 Athena에 대한 API 호출을 이벤트로 캡처합니다. 캡처되는 호출에는 Athena 콘솔로부터의 호출과 Athena API 작업에 대한 코드 호출이 포함됩니다. 추적을 생성하면 Athena 이벤트를 포함한 CloudTrail 이벤트를 지속적으로 Amazon S3 버킷에 배포할 수 있습니다. 추적을 구성하지 않은 경우에도 **이벤트 기록**에서 CloudTrail 콘솔의 최신 이벤트를 볼 수 있습니다.

CloudTrail에서 수집한 정보를 사용하여 Athena에 수행된 요청, 요청이 수행된 IP 주소, 요청을 수행한 사람, 요청이 수행된 시간 및 추가 세부 정보를 확인할 수 있습니다.

CloudTrail에 대한 자세한 내용은 [AWS CloudTrail 사용 설명서](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)를 참조하세요.

Athena를 사용하여 Athena 자체와 다른 AWS 서비스에서 CloudTrail 로그 파일을 쿼리할 수 있습니다. 자세한 내용은 [AWS CloudTrail 로그 쿼리](cloudtrail-logs.md), [Hive JSON SerDe](hive-json-serde.md), 및 AWS 빅 데이터 블로그 게시물 [Use CTAS statements with Amazon Athena to reduce cost and improve performance](https://aws.amazon.com/blogs/big-data/using-ctas-statements-with-amazon-athena-to-reduce-cost-and-improve-performance/)를 참조하세요. 이 블로그 게시물은 CloudTrail을 사용하여 Athena 사용량에 대한 심도 있는 정보를 제공합니다.

## CloudTrail에서 제공하는 Athena 정보
<a name="athena-info-in-cloudtrail"></a>

CloudTrail은 계정 생성 시 Amazon Web Services 계정에서 활성화됩니다. Athena에서 활동이 수행되면 해당 활동은 **이벤트 기록(Event history)**에서 다른 AWS 서비스 이벤트와 함께 CloudTrail 이벤트에 기록됩니다. Amazon Web Services 계정에서 최신 이벤트를 확인, 검색 및 다운로드할 수 있습니다. 자세한 내용은 [CloudTrail 이벤트 기록을 사용하여 이벤트 보기](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)를 참조하세요.

Athena에 대한 이벤트를 포함하여 Amazon Web Services 계정에 이벤트를 지속적으로 기록하려면 추적을 생성합니다. CloudTrail은 *추적*을 사용하여 Amazon S3 버킷으로 로그 파일을 전송할 수 있습니다. 콘솔에서 트레일을 생성하면 기본적으로 모든 AWS 리전에 트레일이 적용됩니다. 트레일은 AWS 파티션에 있는 모든 리전의 이벤트를 로깅하고 지정된 Amazon S3 버킷으로 로그 파일을 전송합니다. 또는 CloudTrail 로그에서 수집된 이벤트 데이터를 추가 분석 및 처리하도록 다른 AWS 서비스를 구성할 수 있습니다. 자세한 설명은 다음을 참조하세요.
+ [추적 생성 개요](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)
+ [CloudTrail 지원 서비스 및 통합](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-aws-service-specific-topics.html#cloudtrail-aws-service-specific-topics-integrations)
+ [CloudTrail에 대한 Amazon SNS 알림 구성](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/getting_notifications_top_level.html)
+ [여러 리전에서 CloudTrail 로그 파일 받기](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html) 및 [여러 계정에서 CloudTrail 로그 파일 받기](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-receive-logs-from-multiple-accounts.html)

모든 Athena 작업은 CloudTrail에서 로깅되며 [Amazon Athena API 참조](https://docs.aws.amazon.com/athena/latest/APIReference/)에 설명되어 있습니다. 예를 들어 [StartQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html) 및 [GetQueryResults](https://docs.aws.amazon.com/athena/latest/APIReference/API_StartQueryExecution.html) 작업을 호출하면 CloudTrail 로그 파일에 항목이 생성됩니다.

모든 이벤트 또는 로그 항목에는 요청을 생성했던 사용자에 관한 정보가 포함됩니다. ID 정보를 이용하면 다음을 쉽게 판단할 수 있습니다.
+ 요청을 루트로 했는지 아니면 AWS Identity and Access Management(IAM) 사용자 자격 증명으로 했는지 여부입니다.
+ 역할 또는 페더레이션 사용자에 대한 임시 보안 인증 정보를 사용하여 요청이 생성되었는지 여부.
+ 다른 AWS 서비스에서 요청했는지 여부

자세한 내용은 [CloudTrail userIdentity 요소](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-user-identity.html)를 참조하세요.

## Athena 로그 파일 항목 이해
<a name="understanding-ate-log-file-entries"></a>

트레일이란 지정한 S3 버킷에 이벤트를 로그 파일로 입력할 수 있게 하는 구성입니다. CloudTrail 로그 파일에는 하나 이상의 로그 항목이 포함될 수 있습니다. 이벤트는 모든 소스로부터의 단일 요청을 나타내며 요청 작업, 작업 날짜와 시간, 요청 파라미터 등에 대한 정보가 들어 있습니다. CloudTrail 로그 파일은 퍼블릭 API 직접 호출의 주문 스택 트레이스가 아니므로 특정 순서로 표시되지 않습니다.

**참고**  
민감한 정보가 의도치 않게 공개되는 것을 방지하기 위해 `StartQueryExecution` 및 `CreateNamedQuery` 로그의 `queryString` 항목 값은 `***OMITTED***`입니다. 이것은 설계에 따른 것입니다. 실제 쿼리 문자열에 액세스하기 위해 Athena [GetQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetQueryExecution.html) API를 사용하고 CloudTrail 로그에서 `responseElements.queryExecutionId`의 값을 전달할 수 있습니다.

다음 예는 다음에 대한 CloudTrail 로그 항목을 보여줍니다.
+  [StartQueryExecution(성공)](#startqueryexecution-successful) 
+  [StartQueryExecution(실패)](#startqueryexecution-failed) 
+  [CreateNamedQuery](#createnamedquery) 

### StartQueryExecution(성공)
<a name="startqueryexecution-successful"></a>

```
{
 "eventVersion":"1.05",
 "userIdentity":{
    "type":"IAMUser",
    "principalId":"EXAMPLE_PRINCIPAL_ID",
    "arn":"arn:aws:iam::123456789012:user/johndoe",
    "accountId":"123456789012",
    "accessKeyId":"EXAMPLE_KEY_ID",
    "userName":"johndoe"
 },
 "eventTime":"2017-05-04T00:23:55Z",
 "eventSource":"athena.amazonaws.com",
 "eventName":"StartQueryExecution",
 "awsRegion":"us-east-1",
 "sourceIPAddress":"77.88.999.69",
 "userAgent":"aws-internal/3",
 "requestParameters":{
    "clientRequestToken":"16bc6e70-f972-4260-b18a-db1b623cb35c",
    "resultConfiguration":{
       "outputLocation":"s3://amzn-s3-demo-bucket/test/"
    },
    "queryString":"***OMITTED***"
 },
 "responseElements":{
    "queryExecutionId":"b621c254-74e0-48e3-9630-78ed857782f9"
 },
 "requestID":"f5039b01-305f-11e7-b146-c3fc56a7dc7a",
 "eventID":"c97cf8c8-6112-467a-8777-53bb38f83fd5",
 "eventType":"AwsApiCall",
 "recipientAccountId":"123456789012"
}
```

### StartQueryExecution(실패)
<a name="startqueryexecution-failed"></a>

```
{
 "eventVersion":"1.05",
 "userIdentity":{
  "type":"IAMUser",
  "principalId":"EXAMPLE_PRINCIPAL_ID",
  "arn":"arn:aws:iam::123456789012:user/johndoe",
  "accountId":"123456789012",
  "accessKeyId":"EXAMPLE_KEY_ID",
  "userName":"johndoe"
  },
 "eventTime":"2017-05-04T00:21:57Z",
 "eventSource":"athena.amazonaws.com",
 "eventName":"StartQueryExecution",
 "awsRegion":"us-east-1",
 "sourceIPAddress":"77.88.999.69",
 "userAgent":"aws-internal/3",
 "errorCode":"InvalidRequestException",
 "errorMessage":"Invalid result configuration. Should specify either output location or result configuration",
 "requestParameters":{
  "clientRequestToken":"ca0e965f-d6d8-4277-8257-814a57f57446",
  "queryString":"***OMITTED***"
  },
 "responseElements":null,
 "requestID":"aefbc057-305f-11e7-9f39-bbc56d5d161e",
 "eventID":"6e1fc69b-d076-477e-8dec-024ee51488c4",
 "eventType":"AwsApiCall",
 "recipientAccountId":"123456789012"
}
```

### CreateNamedQuery
<a name="createnamedquery"></a>

```
{
  "eventVersion":"1.05",
  "userIdentity":{
     "type":"IAMUser",
     "principalId":"EXAMPLE_PRINCIPAL_ID",
     "arn":"arn:aws:iam::123456789012:user/johndoe",
     "accountId":"123456789012",
     "accessKeyId":"EXAMPLE_KEY_ID",
     "userName":"johndoe"
  },
  "eventTime":"2017-05-16T22:00:58Z",
  "eventSource":"athena.amazonaws.com",
  "eventName":"CreateNamedQuery",
  "awsRegion":"us-west-2",
  "sourceIPAddress":"77.88.999.69",
  "userAgent":"aws-cli/1.11.85 Python/2.7.10 Darwin/16.6.0 botocore/1.5.48",
  "requestParameters":{
     "name":"johndoetest",
     "queryString":"***OMITTED***",
     "database":"default",
     "clientRequestToken":"fc1ad880-69ee-4df0-bb0f-1770d9a539b1"
     },
  "responseElements":{
     "namedQueryId":"cdd0fe29-4787-4263-9188-a9c8db29f2d6"
     },
  "requestID":"2487dd96-3a83-11e7-8f67-c9de5ac76512",
  "eventID":"15e3d3b5-6c3b-4c7c-bc0b-36a8dd95227b",
  "eventType":"AwsApiCall",
  "recipientAccountId":"123456789012"
},
```

# 규정 준수 확인
<a name="security-compliance-validation"></a>

타사 감사자는 여러 AWS 규정 준수 프로그램의 일환으로 보안 및 규정 준수를 평가합니다. 여기에는 SOC, PCI, FedRAMP 등이 포함됩니다.

특정 규정 준수 프로그램 범위에 속하는 AWS 서비스의 목록은 [규정 준수 프로그램 제공 AWS 서비스 범위 내](https://aws.amazon.com/compliance/services-in-scope/)를 참조하세요. 일반 정보는 [AWS 규정 준수 프로그램](https://aws.amazon.com/compliance/programs/)을 참조하세요.

AWS Artifact를 사용하여 제3자 감사 보고서를 다운로드할 수 있습니다. 자세한 내용은 [AWS Artifact의 보고서 다운로드](https://docs.aws.amazon.com/artifact/latest/ug/downloading-documents.html)를 참조하세요.

사용 시 규정 준수 책임은 데이터의 민감도, 회사의 규정 준수 목표 및 관련 법률과 규정에 따라 결정됩니다. AWS는 규정 준수를 지원할 다음과 같은 리소스를 제공합니다.
+ [보안 및 규정 준수 빠른 시작 가이드](https://aws.amazon.com/quickstart/?awsf.quickstart-homepage-filter=categories%23security-identity-compliance) – 이 배포 가이드에서는 아키텍처 고려 사항에 대해 설명하고 보안 및 규정 준수에 중점을 둔 기본 AWS 환경을 배포하기 위한 단계를 제공합니다.
+ [Architecting for HIPAA security and compliance on Amazon Web Services](https://docs.aws.amazon.com/whitepapers/latest/architecting-hipaa-security-and-compliance-on-aws/architecting-hipaa-security-and-compliance-on-aws.html) - 이 백서는 기업에서 AWS를 사용하여 HIPAA를 준수하는 애플리케이션을 생성하는 방법을 설명합니다.
+ [AWS 규정 준수 리소스](https://aws.amazon.com/compliance/resources/) – 사용자의 업계와 위치에 해당할 수 있는 워크북 및 가이드 모음입니다.
+ [AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config.html) – 이 AWS 서비스로 리소스 구성이 내부 관행, 업계 지침 및 규정을 준수하는 정도를 평가할 수 있습니다.
+ [AWS Security Hub CSPM](https://docs.aws.amazon.com/securityhub/latest/userguide/what-is-securityhub.html) - 이 AWS 서비스는 보안 산업 표준 및 모범 사례 규정 준수 여부를 확인하는 데 도움이 되도록 AWS 내 보안 상태를 종합적으로 보여줍니다.

# Athena의 복원성
<a name="security-resilience"></a>

AWS 글로벌 인프라는 AWS 리전 및 가용 영역을 중심으로 구축됩니다. AWS 리전에서는 물리적으로 분리되고 격리된 다수의 가용 영역을 제공하며 이러한 가용 영역은 짧은 대기 시간, 높은 처리량 및 높은 중복성을 갖춘 네트워크에 연결되어 있습니다. 가용 영역을 사용하면 중단 없이 가용 영역 간에 자동으로 장애 조치가 이루어지는 애플리케이션 및 데이터베이스를 설계하고 운영할 수 있습니다. 가용 영역은 기존의 단일 또는 복수 데이터 센터 인프라보다 가용성, 내결함성, 확장성이 뛰어납니다.

AWS 리전 및 가용 영역에 대한 자세한 내용은 [AWS 글로벌 인프라](https://aws.amazon.com/about-aws/global-infrastructure/)를 참조하세요.

AWS 글로벌 인프라뿐만 아니라 데이터 복원력과 백업 요구 사항을 지원하는 다양한 기능을 제공합니다.

Athena는 서버리스 서비스이므로 설정하거나 관리할 인프라가 없습니다. Athena는 가용성이 높으며 여러 가용 영역에서 컴퓨팅 리소스를 사용하여 쿼리를 실행하고 특정 가용 영역에 도달할 수 없는 경우 쿼리를 자동으로 라우팅합니다. Athena는 Amazon S3를 기본 데이터 저장소로 사용하기 때문에 데이터의 가용성과 내구성이 높습니다. Amazon S3는 중요한 데이터를 저장하기 위한 견고한 인프라를 제공하며 객체의 99.999999999%에 달하는 내구도로 설계되었습니다. 데이터가 여러 시설과 각 시설의 여러 디바이스에 중복 저장됩니다.

# Athena의 인프라 보안
<a name="security-infrastructure"></a>

관리형 서비스로서 AWS 글로벌 네트워크 보안으로 보호됩니다. AWS 보안 서비스와 AWS의 인프라 보호 방법에 대한 자세한 내용은 [AWS 클라우드 보안](https://aws.amazon.com/security/)을 참조하세요. 인프라 보안에 대한 모범 사례를 사용하여 AWS 환경을 설계하려면 *보안 원칙 AWS Well‐Architected Framework*의 [인프라 보호](https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/infrastructure-protection.html)를 참조하세요.

AWS 에서 게시한 API 직접 호출을 사용하여 네트워크를 통해 액세스합니다. 클라이언트는 다음을 지원해야 합니다.
+ Transport Layer Security(TLS). TLS 1.2는 필수이며 TLS 1.3을 권장합니다.
+ DHE(Ephemeral Diffie-Hellman) 또는 ECDHE(Elliptic Curve Ephemeral Diffie-Hellman)와 같은 완전 전송 보안(PFS)이 포함된 암호 제품군. Java 7 이상의 최신 시스템은 대부분 이러한 모드를 지원합니다.

IAM 정책을 사용해 Athena 작업에 대한 액세스를 제한합니다. IAM 정책을 사용할 때는 항상 IAM 모범 사례를 따라야 합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

Athena [관리형 정책](security-iam-awsmanpol.md)은 사용하기 쉽고, 서비스가 향상됨에 따라 필요한 작업으로 자동 업데이트됩니다. 고객 관리형 및 인라인 정책을 사용하면 정책 내에서 보다 세분화된 Athena 작업을 지정하여 액세스를 세부 조정할 수 있습니다. 데이터의 Amazon S3 위치에 대한 적절한 권한을 부여합니다. Amazon S3 액세스 권한을 부여하는 방법에 대한 자세한 내용과 시나리오는 *Amazon Simple Storage Service 개발자 안내서*의 [예제 안내: 액세스 관리](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access.html)를 참조하세요. 허용할 Amazon S3 작업에 대한 자세한 내용과 예는 [계정 간 액세스](cross-account-permissions.md)의 버킷 정책 예제를 참조하세요.

**Topics**
+ [

# 인터페이스 VPC 엔드포인트를 사용하여 Amazon Athena에 연결
](interface-vpc-endpoint.md)

# 인터페이스 VPC 엔드포인트를 사용하여 Amazon Athena에 연결
<a name="interface-vpc-endpoint"></a>

Virtual Private Cloud(VPC)의 [인터페이스 VPC 엔드드포인트(AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html)와 [AWS Glue VPC 엔드포인트](https://docs.aws.amazon.com/glue/latest/dg/vpc-endpoint.html)를 사용하여 VPC의 보안 태세를 개선할 수 있습니다. 인터페이스 VPC 엔드포인트에서는 VPC 내부에서 도달할 수 있는 대상을 제어하는 기능을 제공하여 보안을 개선합니다. 각 VPC 엔드포인트는 하나 이상의 [탄력적 네트워크 인터페이스](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html)(ENI) 및 VPC 서브넷의 프라이빗 IP 주소로 표현됩니다.

인터페이스 VPC 엔드포인트는 인터넷 게이트웨이, NAT 디바이스, VPN 연결 또는 Direct Connect 연결 없이 VPC를 Athena에 직접 연결합니다. VPC에 있는 인스턴스는 퍼블릭 IP 주소가 없어도 Athena API와 통신할 수 있습니다.

VPC를 통해 Athena를 사용하려면 VPC 내부에 있는 인스턴스에서 연결하거나 Amazon Virtual Private Network(VPN) 또는 Direct Connect를 사용하여 프라이빗 네트워크를 VPC에 연결해야 합니다. Amazon VPN에 대한 내용은 *Amazon Virtual Private Cloud 사용 설명서*의 [VPN 연결](https://docs.aws.amazon.com/vpc/latest/userguide/vpn-connections.html)을 참조하세요. AWS Direct Connect에 대한 자세한 내용은 *Direct Connect 사용 설명서*의 [연결 생성](https://docs.aws.amazon.com/directconnect/latest/UserGuide/create-connection.html)을 참조하세요.

Athena는 [Amazon VPC](https://docs.aws.amazon.com/general/latest/gr/rande.html#vpc_region)와 [Athena](https://docs.aws.amazon.com/general/latest/gr/rande.html#athena)를 모두 이용할 수 있는 모든 AWS 리전에서 VPC 엔드포인트를 지원합니다.

AWS Management Console 또는 AWS Command Line Interface(AWS CLI) 명령을 사용하여 Athena에 연결할 인터페이스 VPC 엔드포인트를 생성할 수 있습니다. 자세한 내용은 [인터페이스 엔드포인트 생성](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#create-interface-endpoint)을 참조하세요.

인터페이스 VPC 엔드포인트를 생성한 후 엔드포인트에 대해 [프라이빗 DNS](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#vpce-private-dns) 호스트 이름을 활성화하는 경우 기본 Athena 엔드포인트(https://athena.*리전*.amazonaws.com)는 VPC 엔드포인트로 귀결됩니다.

프라이빗 DNS 호스트 이름을 활성화하지 않은 경우, Amazon VPC는 다음 형식으로 사용할 수 있는 DNS 엔드포인트를 제공합니다.

```
VPC_Endpoint_ID.athena.Region.vpce.amazonaws.com
```

자세한 내용은 *Amazon VPC 사용 설명서*에서 [인터페이스 VPC 종단점(AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html)을 참조하세요.

Athena는 VPC 내부에 있는 모든 [API 작업](https://docs.aws.amazon.com/athena/latest/APIReference/API_Operations.html)에 대한 호출 수행을 지원합니다.

## Athena에 대한 VPC 엔드포인트 정책 생성
<a name="api-private-link-policy"></a>

Athena에 대한 Amazon VPC 엔드포인트 정책을 생성하여 다음과 같은 제한 사항을 지정할 수 있습니다.
+ **보안 주체** - 작업을 수행할 수 있는 보안 주체.
+ **작업** - 수행할 수 있는 작업.
+ **리소스** - 작업을 수행할 있는 리소스.
+ **신뢰할 수 있는 ID만** - `aws:PrincipalOrgId` 조건을 사용하여 AWS 조직의 일부인 보안 인증으로만 액세스를 제한합니다. 이렇게 하면 의도하지 않은 보안 주체의 액세스를 방지할 수 있습니다.
+ **신뢰할 수 있는 리소스만** - `aws:ResourceOrgId` 조건을 사용하여 의도하지 않은 리소스에 대한 액세스를 방지합니다.
+ **신뢰할 수 있는 ID 및 리소스만** - 의도하지 않은 보안 주체 및 리소스에 대한 액세스를 방지할 수 있는 VPC 엔드포인트에 대한 결합된 정책을 생성합니다.

자세한 내용은 *Amazon VPC 사용 설명서*의 [엔드포인트 정책을 사용하여 VPC 엔드포인트에 대한 액세스 제어](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-access.html) 및 AWS 백서 *Building a data perimeter on AWS*의 [Appendix 2 – VPC endpoint policy examples](https://docs.aws.amazon.com/whitepapers/latest/building-a-data-perimeter-on-aws/appendix-2-vpc-endpoint-policy-examples.html)를 참조하세요.

**Example - VPC 엔드포인트 정책**  
다음 예제에서는 조직 ID로 조직 리소스에 대한 요청을 허용하고 AWS 서비스 보안 주체의 요청을 허용합니다.    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowRequestsByOrgsIdentitiesToOrgsResources",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgID": "my-org-id",
                    "aws:ResourceOrgID": "my-org-id"
                }
            }
        },
        {
            "Sid": "AllowRequestsByAWSServicePrincipals",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "aws:PrincipalIsAWSService": "true"
                }
            }
        }
    ]
}
```

IAM 정책을 사용할 때마다 IAM 모범 사례를 따라야 합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

## 공유 서브넷의 VPC 엔드포인트
<a name="interface-vpc-endpoint-shared-subnets"></a>

공유하는 서브넷의 VPC 엔드포인트는 생성, 설명, 수정 또는 삭제할 수 없습니다. 그러나 공유하는 서브넷의 VPC 엔드포인트를 사용할 수는 있습니다. VPC 공유에 관한 자세한 내용은 *Amazon VPC 사용 설명서*의 [다른 계정과 VPC 공유](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-sharing.html)를 참조하십시오.

# Athena의 구성 및 취약성 분석
<a name="security-vulnerability-management"></a>

Athena는 서버가 없으므로 설정이나 관리의 대상이 되는 인프라가 없습니다. AWS가 게스트 운영 체제(OS), 데이터베이스 패치, 방화벽 구성, 재해 복구 등의 기본 보안 작업을 처리합니다. 적합한 제3자가 이 절차를 검토하고 인증하였습니다. 자세한 내용은 다음 AWS 리소스를 참조하세요.
+  [공동 책임 모델](https://aws.amazon.com/compliance/shared-responsibility-model/) 
+ [보안, 자격 증명 및 규정 준수를 위한 모범 사례](https://aws.amazon.com/architecture/security-identity-compliance/)

# Athena를 사용하여 AWS Lake Formation에 등록된 데이터 쿼리
<a name="security-athena-lake-formation"></a>

[AWS Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html)을 사용하면 Amazon S3에 저장된 데이터 또는 페더레이션된 데이터 소스를 통해 액세스하는 데이터를 읽는 Athena 쿼리를 사용할 때 데이터베이스, 테이블 및 열 수준 액세스 정책을 정의하고 적용할 수 있습니다. Lake Formation은 Amazon S3에 저장된 데이터 또는 페더레이션된 데이터 카탈로그에 대한 권한 및 거버넌스 계층을 제공합니다. Lake Formation의 권한 계층을 사용하여 데이터베이스, 테이블, 열과 같은 데이터 카탈로그 객체를 읽을 수 있는 권한을 부여하거나 취소할 수 있습니다. Lake Formation은 권한 관리를 단순화하며, 이를 통해 데이터에 대한 세분화된 액세스 제어를 구현할 수 있습니다.

Athena를 사용하여 Lake Formation에 등록된 데이터와 Lake Formation에 등록되지 않은 데이터를 모두 쿼리할 수 있습니다.

Lake Formation 권한은 Athena를 사용하여 Lake Formation에 등록된 Amazon S3 위치 또는 데이터 카탈로그에서 원본 데이터를 쿼리할 때 적용됩니다. Lake Formation 권한은 등록된 Amazon S3 데이터 위치 또는 데이터 카탈로그를 가리키는 데이터베이스 및 테이블을 생성할 때도 적용됩니다.

Lake Formation 권한은 객체를 쓸 때 적용되지 않으며 Lake Formation에 등록되지 않은 데이터나 메타데이터를 쿼리할 때도 적용되지 않습니다. Lake Formation에 등록되지 않은 원본 데이터와 메타데이터의 경우 액세스 권한이 IAM 권한 정책 및 AWS Glue 작업에 따라 결정됩니다. Amazon S3의 Athena 쿼리 결과 위치는 Lake Formation에 등록할 수 없으며, Amazon S3에 대한 IAM 권한 정책이 액세스 권한을 제어합니다. 또한 Lake Formation 권한은 Athena 쿼리 기록에 적용되지 않습니다. Athena 작업 그룹을 사용하여 쿼리 기록에 대한 액세스를 제어할 수 있습니다.

Lake Formation에 대한 자세한 내용은 [Lake Formation FAQ](https://aws.amazon.com/lake-formation/faqs/) 및 [AWS Lake Formation 개발자 안내서](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html)를 참조하세요.

## 기존 데이터베이스 및 테이블에 Lake Formation 권한 적용
<a name="lf-athena-apply-lf-permissions-to-existing-databases-and-tables"></a>

Athena를 처음 사용하고 Lake Formation을 사용하여 쿼리 데이터에 대한 액세스를 구성하는 경우 사용자가 데이터를 읽고 메타데이터를 생성할 수 있도록 IAM 정책을 구성할 필요가 없습니다. Lake Formation을 사용하여 권한을 관리할 수 있습니다.

Lake Formation에 데이터를 등록하고 IAM 권한 정책을 업데이트할 필요는 없습니다. 데이터가 Lake Formation에 등록되지 않은 경우에도 적절한 권한을 가진 Athena 사용자는 Lake Formation에 등록되지 않은 데이터를 계속 쿼리할 수 있습니다.

Lake Formation에 등록되지 않은 Amazon S3 데이터를 쿼리하는 기존 Athena 사용자가 있는 경우 Amazon S3(해당되는 경우 AWS Glue Data Catalog)에 대한 IAM 권한을 업데이트할 수 있으며 Lake Formation 권한을 사용하여 중앙에서 사용자 액세스를 관리할 수 있습니다. Amazon S3 데이터 위치 읽기 권한의 경우, 리소스 기반 정책 및 자격 증명 기반 정책을 업데이트하여 Amazon S3 권한을 수정할 수 있습니다. 메타데이터 액세스의 경우, AWS Glue를 사용하여 세분화된 액세스 제어를 위해 리소스 수준 정책을 구성하면 Lake Formation 권한을 사용하여 대신 액세스를 관리할 수 있습니다.

자세한 내용은 *AWS Lake Formation 개발자 안내서*의 [AWS Glue Data Catalog의 데이터베이스 및 테이블에 대한 액세스 구성](fine-grained-access-to-glue-resources.md) 및 [AWS Lake Formation 모델로 AWS Glue 데이터 권한 업그레이드](https://docs.aws.amazon.com/lake-formation/latest/dg/upgrade-glue-lake-formation.html)를 참조하세요.

**Topics**
+ [

## 기존 데이터베이스 및 테이블에 Lake Formation 권한 적용
](#lf-athena-apply-lf-permissions-to-existing-databases-and-tables)
+ [데이터 액세스 작동 방식](lf-athena-access.md)
+ [고려 사항 및 제한 사항](lf-athena-limitations.md)
+ [크로스 계정 액세스](lf-athena-limitations-cross-account.md)
+ [사용자 권한 관리](lf-athena-user-permissions.md)
+ [페더레이션 액세스를 위해 Lake Formation과 JDBC 또는 ODBC 사용](security-athena-lake-formation-jdbc.md)

# Athena가 Lake Formation에 등록된 데이터에 액세스하는 방식
<a name="lf-athena-access"></a>

이 단원에서 설명하는 액세스 워크플로는 Lake Formation에 등록된 Amazon S3 위치, 데이터 카탈로그 또는 메타데이터 객체에 대해 Athena 쿼리를 실행할 때 적용됩니다. 자세한 내용은 *AWS Lake Formation 개발자 안내서*의 [데이터 레이크 등록](https://docs.aws.amazon.com/lake-formation/latest/dg/register-data-lake.html)을 참조하세요. Lake Formation 관리자는 데이터 등록 이외에도 데이터 카탈로그의 메타데이터, AWS Glue Data Catalog 또는 Amazon S3의 데이터 위치에 대한 액세스 권한을 부여하거나 취소하는 Lake Formation 권한을 적용합니다. 자세한 내용은 *AWS Lake Formation 개발자 안내서*의 [메타데이터 및 데이터에 대한 보안 및 액세스 제어](https://docs.aws.amazon.com/lake-formation/latest/dg/security-data-access.html#security-data-access-permissions)를 참조하세요.

Athena 보안 주체(사용자, 그룹 또는 역할)가 Lake Formation을 사용하여 등록된 데이터에 대해 쿼리를 실행할 때마다 Lake Formation은 해당 보안 주체가 쿼리에 적합한 데이터베이스, 테이블, 데이터 소스 위치에 대한 적절한 Lake Formation 권한을 가지고 있는지 확인합니다. 보안 주체에 액세스 권한이 있으면 Lake Formation이 일시적인 자격 증명을 Athena에 *발급(vend)*하고 쿼리가 실행됩니다.

다음 다이어그램은 Lake Formation에 등록된 Amazon S3 위치 또는 데이터 카탈로그가 있는 테이블에서 Athena의 자격 증명 발급이 가상 `SELECT` 쿼리에 대해 쿼리별로 작동하는 방식을 보여줍니다.

![\[Athena 테이블의 쿼리를 위한 보안 인증 벤딩 워크플로.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/lake-formation-athena-security.png)


1. 보안 주체가 Athena에서 `SELECT` 쿼리를 실행합니다.

1. Athena는 쿼리를 분석하고 Lake Formation 권한을 검사하여 보안 주체에게 테이블 및 테이블 열에 대한 액세스 권한이 부여되었는지 확인합니다.

1. 보안 주체에게 액세스 권한이 있는 경우 Athena는 Lake Formation으로부터 자격 증명을 요청합니다. 보안 주체에게 액세스 권한이 *없는* 경우 Athena에서 액세스 거부 오류가 발생합니다.

1. Lake Formation은 Amazon S3 또는 카탈로그에서 데이터를 읽을 때 사용할 자격 증명을, 허용된 열 목록과 함께 Athena에게 발급합니다.

1. Athena는 Lake Formation 임시 자격 증명을 사용하여 Amazon S3 또는 카탈로그에서 데이터를 쿼리합니다. 쿼리가 완료되면 Athena가 자격 증명을 삭제합니다.

# Lake Formation에 등록된 데이터를 쿼리할 때의 고려 사항 및 제한 사항
<a name="lf-athena-limitations"></a>

Athena를 사용하여 Lake Formation에 등록된 데이터를 쿼리할 때는 다음을 고려하세요. 추가 정보는 *AWS Lake Formation 개발자 안내서*의 [AWS Lake Formation의 알려진 문제](https://docs.aws.amazon.com/lake-formation/latest/dg/limitations.html)를 참조하세요.

**Topics**
+ [일부 상황에서 열에 대한 데이터 권한이 없는 사용자에게 표시되는 열 메타데이터](#lf-athena-limitations-column-metadata)
+ [뷰에 대한 Lake Formation 권한 작업](#lf-athena-limitations-permissions-to-views)
+ [

## Iceberg DDL 지원
](#lf-athena-limitations-iceberg-ddl-operations)
+ [

## Lake Formation 세분화된 액세스 제어 및 Athena 작업 그룹
](#lf-athena-limitations-fine-grained-access-control)
+ [Lake Formation에 등록되지 않은 Amazon S3의 Athena 쿼리 결과 위치](#lf-athena-limitations-query-results-location)
+ [Athena 작업 그룹을 사용하여 쿼리 기록에 대한 액세스 제한](#lf-athena-limitations-use-workgroups-to-limit-access-to-query-history)
+ [Lake Formation에 등록된 CSE-KMS Amazon S3 위치를 Athena에서 쿼리할 수 없음](#lf-athena-limitations-cse-kms)
+ [Lake Formation에 등록된 분할된 데이터 위치는 테이블 하위 디렉터리에 있어야 함](#lf-athena-limitations-partioned-data-locations)
+ [CTAS(Create Table As Select) 쿼리에 Amazon S3 쓰기 권한 필요](#lf-athena-limitations-ctas-queries)
+ [

## 기본 데이터베이스에 대해 DESCRIBE 권한 필요
](#lf-athena-limitations-describe-default)

## Avro 및 Custom SerDe를 사용하여 일부 상황에서 권한이 없는 사용자에게 표시되는 열 메타데이터
<a name="lf-athena-limitations-column-metadata"></a>

Lake Formation 열 수준 권한 부여를 통해 사용자가 Lake Formation 권한이 없는 열의 데이터에 액세스하는 것을 방지할 수 있습니다. 그러나 특정 상황에서 사용자는 데이터에 대한 권한이 없는 열을 포함하여 테이블의 모든 열을 설명하는 메타데이터에 액세스할 수 있습니다.

이 현상은 열 메타데이터가 Apache Avro 스토리지 형식을 사용하거나 테이블 스키마가 SerDe(Serializer/Deserializer) 정의와 함께 테이블 속성에 정의된 사용자 지정 SerDe를 사용하는 테이블의 테이블 속성에 저장될 때 발생합니다. Lake Formation과 함께 Athena를 사용할 때는 Lake Formation에 등록한 테이블 속성의 콘텐츠를 검토하고, 가능한 경우 테이블 속성에 저장된 정보를 제한하여 민감한 메타데이터가 사용자에게 표시되지 않도록 하는 것이 좋습니다.

## Lake Formation 및 뷰 이해
<a name="lf-athena-limitations-permissions-to-views"></a>

Lake Formation에 등록된 데이터의 경우 Athena 사용자는 `VIEW`가 기반으로 하는 테이블, 열 및 소스 Amazon S3 데이터 위치에 대한 Lake Formation 권한이 있는 경우에만 `VIEW`를 생성할 수 있습니다. Athena에서 `VIEW`를 생성한 후 Lake Formation 권한을 `VIEW`에 적용할 수 있습니다. `VIEW`에는 열 수준 권한을 사용할 수 없습니다. `VIEW`에 대한 Lake Formation 권한은 있지만 뷰의 기반이 되는 테이블 및 열에 대한 권한이 없는 사용자는 `VIEW`를 사용하여 데이터를 쿼리할 수 없습니다. 그러나 이러한 혼합 권한이 있는 사용자는 `DESCRIBE VIEW`, `SHOW CREATE VIEW` 및 `SHOW COLUMNS`와 같은 문을 사용하여 `VIEW` 메타데이터를 볼 수 있습니다. 그러므로 각 `VIEW`에 대한 Lake Formation 권한을 기본 테이블 권한에 맞춰야 합니다. 테이블에 정의된 셀 필터는 해당 테이블의 `VIEW`에 적용되지 않습니다. 리소스 링크 이름이 원래 계정의 리소스와 같아야 합니다. 크로스 계정 설정에서 뷰 작업을 수행할 때 추가 제한 사항이 있습니다. 계정 간에 공유되는 뷰에 대한 권한 설정에 대한 자세한 내용은 [크로스 계정 데이터 카탈로그 액세스 구성](lf-athena-limitations-cross-account.md)을 참조하세요.

## Iceberg DDL 지원
<a name="lf-athena-limitations-iceberg-ddl-operations"></a>

Athena는 현재 Lake Formation에 위치가 등록된 Iceberg 테이블에 대한 DDL 작업을 지원하지 않습니다. 이러한 Iceberg 테이블 중 하나에서 DDL 쿼리를 실행하려고 하면 Amazon S3 액세스 거부 오류가 반환되거나 쿼리 시간 초과로 실패할 수 있습니다. Iceberg 테이블에서 DDL 작업을 수행하려면 사용자가 Iceberg 테이블 위치에 직접 액세스할 수 있는 Amazon S3 권한이 있어야 합니다.

## Lake Formation 세분화된 액세스 제어 및 Athena 작업 그룹
<a name="lf-athena-limitations-fine-grained-access-control"></a>

동일한 Athena 작업 그룹의 사용자는 Lake Formation 세분화된 액세스 제어를 통해 작업 그룹에 액세스할 수 있도록 구성한 데이터를 볼 수 있습니다. Lake Formation에서 세분화된 액세스 제어를 사용하는 방법에 대한 자세한 내용은 *AWS 빅 데이터 블로그*의 [AWS Lake Formation을 사용하여 세분화된 액세스 제어 관리](https://aws.amazon.com/blogs/big-data/manage-fine-grained-access-control-using-aws-lake-formation/)를 참조하세요.

## Lake Formation에 등록되지 않은 Amazon S3의 Athena 쿼리 결과 위치
<a name="lf-athena-limitations-query-results-location"></a>

Amazon S3의 Athena 쿼리 결과 위치는 Lake Formation에 등록할 수 없습니다. Lake Formation 권한은 이러한 위치에 대한 액세스를 제한하지 않습니다. 액세스를 제한하지 않는 한 Athena 사용자는 데이터에 대한 Lake Formation 권한이 없어도 쿼리 결과 파일과 메타데이터에 액세스할 수 있습니다. 이를 방지하려면 작업 그룹을 사용하여 쿼리 결과의 위치를 지정하고 작업 그룹 구성원에 맞게 Lake Formation 권한을 조정하는 것이 좋습니다. 그런 다음 IAM 권한 정책을 사용하여 쿼리 결과 위치에 대한 액세스를 제한할 수 있습니다. 쿼리 결과에 대한 자세한 내용은 [쿼리 결과 및 최근 쿼리 작업](querying.md) 단원을 참조하세요.

## Athena 작업 그룹을 사용하여 쿼리 기록에 대한 액세스 제한
<a name="lf-athena-limitations-use-workgroups-to-limit-access-to-query-history"></a>

Athena 쿼리 기록은 저장된 쿼리 및 전체 쿼리 문자열 목록을 드러냅니다. 작업 그룹을 사용하여 쿼리 기록에 대한 액세스를 분리하지 않으면 Lake Formation에서 데이터를 쿼리할 권한이 없는 Athena 사용자가 열 이름, 선택 기준 등을 비롯해 해당 데이터에 대해 실행되는 쿼리 문자열을 볼 수 있습니다. 작업 그룹을 사용하여 쿼리 기록을 분리하고 Athena 작업 그룹 구성원에 맞게 Lake Formation 권한을 조정하여 액세스를 제한하는 것이 좋습니다. 자세한 내용은 [작업 그룹을 사용하여 쿼리 액세스 및 비용 제어](workgroups-manage-queries-control-costs.md) 섹션을 참조하세요.

## Lake Formation에 등록된 CSE\$1KMS 암호화 테이블 쿼리
<a name="lf-athena-limitations-cse-kms"></a>

다음과 같은 특성을 가진 Apache Iceberg와 같은 OTF(오픈 테이블 형식) 테이블은 Athena로 쿼리할 수 없습니다.
+ 테이블은 Lake Formation에 등록된 Amazon S3 데이터 위치를 기반으로 합니다.
+ Amazon S3의 객체가 CSE(클라이언트 측 암호화)를 사용하여 암호화됩니다.
+ 암호화에서는 AWS KMS 고객 관리형 키(`CSE_KMS`)를 사용합니다.

`CSE_KMS` 키로 암호화된 OTF가 아닌 테이블을 쿼리하려면 CSE 암호화에 사용하는 AWS KMS 키의 정책에 다음 블록을 추가하세요. *<KMS\$1KEY\$1ARN>*은 데이터를 암호화하는 AWS KMS 키의 ARN입니다. *<IAM-ROLE-ARN>*은 Lake Formation에 Amazon S3 위치를 등록하는 IAM 역할의 ARN입니다.

```
{
    "Sid": "Allow use of the key",
    "Effect": "Allow",
    "Principal": {
        "AWS": "*"
    },
    "Action": "kms:Decrypt",
    "Resource": "<KMS-KEY-ARN>",
    "Condition": {
        "ArnLike": {
            "aws:PrincipalArn": "<IAM-ROLE-ARN>"
        }
    }
}
```

## Lake Formation에 등록된 분할된 데이터 위치는 테이블 하위 디렉터리에 있어야 함
<a name="lf-athena-limitations-partioned-data-locations"></a>

Lake Formation에 등록된 분할된 테이블은 Amazon S3 테이블의 하위 디렉터리인 디렉터리에 분할된 데이터가 있어야 합니다. 예를 들어, 위치가 `s3://amzn-s3-demo-bucket/mytable`이고 파티션이 `s3://amzn-s3-demo-bucket/mytable/dt=2019-07-11`, `s3://amzn-s3-demo-bucket/mytable/dt=2019-07-12` 등인 테이블은 Lake Formation에 등록하고 Athena를 사용하여 쿼리할 수 있습니다. 반면, 위치가 `s3://amzn-s3-demo-bucket/mytable`이고 파티션이 `s3://amzn-s3-demo-bucket/dt=2019-07-11`, `s3://amzn-s3-demo-bucket/dt=2019-07-12` 등인 테이블은 Lake Formation에 등록할 수 없습니다. 이러한 파티션은 `s3://amzn-s3-demo-bucket/mytable`의 하위 디렉토리가 아니기 때문에 Athena에서 읽을 수도 없습니다.

## CTAS(Create Table As Select) 쿼리에 Amazon S3 쓰기 권한 필요
<a name="lf-athena-limitations-ctas-queries"></a>

CTAS(Create Table As Statements)에는 테이블의 Amazon S3 위치에 대한 쓰기 액세스 권한이 필요합니다. Lake Formation에 등록된 데이터에 대해 CTAS 쿼리를 실행하려면 Athena 사용자는 데이터 위치를 읽을 수 있는 적절한 Lake Fomation 권한과 더불어 테이블의 Amazon S3 위치에 쓸 수 있는 IAM 권한이 있어야 합니다. 자세한 내용은 [쿼리 결과에서 테이블 생성(CTAS)](ctas.md) 단원을 참조하세요.

## 기본 데이터베이스에 대해 DESCRIBE 권한 필요
<a name="lf-athena-limitations-describe-default"></a>

Lake Formation에서 볼 수 있으려면 `default` 데이터베이스에 대한 Lake Formation `DESCRIBE` 권한이 필요합니다. 다음 예제에서는 AWS CLI 명령으로 AWS 계정 `111122223333`의 `datalake_user1` 사용자에게 `default` 데이터베이스에 대한 `DESCRIBE` 권한을 부여합니다.

```
aws lakeformation grant-permissions --principal DataLakePrincipalIdentifier=arn:aws:iam::111122223333:user/datalake_user1 --permissions "DESCRIBE" --resource '{ "Database": {"Name":"default"}}
```

자세한 내용은 *AWS Lake Formation 개발자 안내서*의 [DESCRIBE](https://docs.aws.amazon.com/lake-formation/latest/dg/lf-permissions-reference.html#perm-describe)를 참조하세요.

# 크로스 계정 데이터 카탈로그 액세스 구성
<a name="lf-athena-limitations-cross-account"></a>

다른 계정의 데이터 카탈로그에 액세스하기 위해 Athena의 계정 간 AWS Glue 기능을 사용하거나 또는 Lake Formation에서 계정 간 액세스를 설정할 수 있습니다.

## 옵션 A: Athena에서 크로스 계정 데이터 카탈로그 액세스 구성
<a name="lf-athena-limitations-cross-account-glue"></a>

Athena의 계정 간 AWS Glue 카탈로그 기능을 사용해 자신의 계정에 카탈로그를 등록할 수 있습니다. 이 기능은 Athena 엔진 버전 2 이상 버전에서만 사용할 수 있으며 계정 간 동일한 리전 사용으로 제한됩니다. 자세한 내용은 [다른 계정의 데이터 카탈로그 등록](data-sources-glue-cross-account.md) 섹션을 참조하세요.

공유할 Data Catalog에 AWS Glue에서 구성된 리소스 정책이 있는 경우 AWS Resource Access Manager에 액세스할 수 있도록 업데이트해야 하고 계정 A의 Data Catalog를 사용할 수 있는 권한을 계정 B에 부여해야 합니다.

자세한 내용은 [AWS Glue 데이터 카탈로그에 대한 크로스 계정 액세스 구성](security-iam-cross-account-glue-catalog-access.md) 섹션을 참조하세요.

## 옵션 B: Lake Formation에서 크로스 계정 액세스 구성
<a name="lf-athena-limitations-cross-account-glue-lf-xacct"></a>

AWS Lake Formation에서는 하나의 계정을 사용하여 중앙 데이터 카탈로그를 관리할 수 있습니다. 이 기능을 사용해 [계정 간 액세스](https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-cross-account.html)를 데이터 카탈로그 메타데이터 및 기본 데이터에 구현할 수 있습니다. 예를 들어 소유자 계정은 다른 (수신자) 계정에게 테이블에 대한 `SELECT` 권한을 부여할 수 있습니다.

Athena 쿼리 편집기에 표시되는 공유 데이터베이스 또는 테이블의 경우 Lake Formation에서 공유 데이터베이스 또는 테이블에 연결되는 [리소스 링크를 생성](https://docs.aws.amazon.com/lake-formation/latest/dg/resource-links-about.html)합니다. Lake Formation의 수신자 계정이 소유자의 테이블을 쿼리하면 [CloudTrail](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-logging.html)은 수신자 계정과 소유자 계정의 로그에 데이터 액세스 이벤트를 추가합니다.

공유된 뷰의 경우 다음 사항에 유의하십시오.
+ 쿼리는 소스 테이블이나 뷰가 아닌 대상 리소스 링크에서 실행되며 출력이 대상 계정에 공유됩니다.
+ 뷰만 공유하는 것으로는 충분하지 않습니다. 뷰 생성과 관련된 모든 테이블은 계정 간 공유의 일부여야 합니다.
+ 공유된 리소스에 생성된 리소스 링크의 이름이 소유자 계정의 리소스 이름과 일치해야 합니다. 이름이 일치하지 않으면 Failed analyzing stored view 'awsdatacatalog.*my-lf-resource-link*.*my-lf-view*': line 3:3: Schema *schema\$1name* does not exist와 같은 오류 메시지가 표시됩니다.

Lake Formation에서 계정 간 액세스에 대한 자세한 내용은 *AWS Lake Formation 개발자 안내서*의 다음 리소스를 참조하세요.

 [교차 계정 액세스](https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-cross-account.html) 

 [Lake Formation에서 리소스 링크가 작동하는 방식](https://docs.aws.amazon.com/lake-formation/latest/dg/resource-links-about.html) 

 [계정 간 CloudTrail 로깅](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-logging.html) 

# Lake Formation 및 Athena 사용자 권한 관리
<a name="lf-athena-user-permissions"></a>

Lake Formation은 Lake Formation에 등록된 Amazon S3 데이터 스토어 또는 페더레이션된 카탈로그를 쿼리할 수 있도록 자격 증명을 공급합니다. 이전에 IAM 정책을 사용하여 Amazon S3에서 카탈로그 또는 데이터 위치를 읽을 수 있는 권한을 허용하거나 거부한 경우 Lake Formation 권한을 대신 사용할 수 있습니다. 그러나 다른 IAM 권한이 여전히 필요합니다.

IAM 정책을 사용할 때마다 IAM 모범 사례를 따라야 합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

다음 단원에서는 Athena를 사용하여 Lake Formation에 등록된 데이터를 쿼리하는 데 필요한 권한을 요약합니다. 자세한 정보는 *AWS Lake Formation 개발자 안내서*의 [AWS Lake Formation의 보안](https://docs.aws.amazon.com/lake-formation/latest/dg/security.html)을 참조하세요.

**Topics**
+ [

## Lake Formation 및 Athena에 대한 자격 증명 기반 권한
](#lf-athena-user-permissions-identity-based)
+ [

## Athena 쿼리 결과 위치에 대한 Amazon S3 권한
](#lf-athena-user-permissions-query-results-locations)
+ [

## 쿼리 기록에 대한 Athena 작업 그룹 멤버십
](#lf-athena-user-permissions-workgroup-memberships-query-history)
+ [

## 데이터에 대한 Lake Formation 권한
](#lf-athena-user-permissions-data)
+ [

## Amazon S3 위치에 쓸 수 있는 IAM 권한
](#lf-athena-user-permissions-s3-write)
+ [

## 암호화된 데이터, 메타데이터 및 Athena 쿼리 결과에 대한 권한
](#lf-athena-user-permissions-encrypted)
+ [

## 외부 계정의 Amazon S3 버킷에 대한 리소스 기반 권한(선택 사항)
](#lf-athena-user-permissions-s3-cross-account)

## Lake Formation 및 Athena에 대한 자격 증명 기반 권한
<a name="lf-athena-user-permissions-identity-based"></a>

Athena를 사용하여 Lake Formation에 등록된 데이터를 쿼리하는 사용자는 `lakeformation:GetDataAccess` 작업을 허용하는 IAM 권한 정책이 있어야 합니다. 이 작업을 허용하는 정책은 [AWS 관리형 정책: AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)입니다. 인라인 정책을 사용하는 경우 이 작업을 허용하도록 권한 정책을 업데이트하세요.

Lake Formation에서 *데이터 레이크 관리자*는 데이터베이스 및 테이블과 같은 메타데이터 객체를 생성하고, 다른 사용자에게 Lake Formation 권한을 부여하며, 새로운 Amazon S3 위치 또는 데이터 카탈로그를 등록할 수 있는 권한이 있습니다. 새 위치를 등록하려면 Lake Formation의 서비스 연결 역할에 대한 권한이 필요합니다. 자세한 내용은 *AWS Lake Formation 개발자 안내서*의 [데이터 레이크 관리자 생성](https://docs.aws.amazon.com/lake-formation/latest/dg/getting-started-setup.html#create-data-lake-admin) 및 [Lake Formation의 서비스 연결 역할 권한](https://docs.aws.amazon.com/lake-formation/latest/dg/service-linked-roles.html#service-linked-role-permissions)을 참조하세요.

Lake Formation 사용자는 Athena를 사용하여 데이터 레이크 관리자가 부여한 Lake Formation 권한에 따라 데이터베이스, 테이블, 테이블 열, 기본 Amazon S3 데이터 스토어 또는 카탈로그를 쿼리할 수 있습니다. 사용자는 데이터베이스나 테이블을 만들거나 Lake Formation에 새 Amazon S3 위치를 등록할 수 없습니다. 자세한 내용은 *AWS Lake Formation 개발자 안내서*의 [데이터 레이크 사용자 생성](https://docs.aws.amazon.com/lake-formation/latest/dg/cloudtrail-tut-create-lf-user.html)을 참조하세요.

Athena에서 Athena 작업 그룹에 대한 권한을 포함하여 자격 증명 기반 권한 정책은 여전히 Amazon Web Services 계정 사용자의 Athena 작업에 대한 액세스를 제어합니다. 또한 Athena 드라이버에서 사용할 수 있는 SAML 기반 인증을 통해 연합 액세스가 제공될 수 있습니다. 자세한 내용은 [작업 그룹을 사용하여 쿼리 액세스 및 비용 제어](workgroups-manage-queries-control-costs.md), [IAM 정책을 사용하여 작업 그룹 액세스 제어](workgroups-iam-policy.md), [Athena API에 대한 페더레이션 액세스 활성화](access-federation-saml.md) 단원을 참조하세요.

자세한 내용은 *AWS Lake Formation 개발자 안내서*의 [Lake Formation 권한 부여](https://docs.aws.amazon.com/lake-formation/latest/dg/lake-formation-permissions.html)를 참조하세요.

## Athena 쿼리 결과 위치에 대한 Amazon S3 권한
<a name="lf-athena-user-permissions-query-results-locations"></a>

Amazon S3의 Athena 쿼리 결과 위치는 Lake Formation에 등록할 수 없습니다. Lake Formation 권한은 이러한 위치에 대한 액세스를 제한하지 않습니다. 액세스를 제한하지 않는 한 Athena 사용자는 데이터에 대한 Lake Formation 권한이 없어도 쿼리 결과 파일과 메타데이터에 액세스할 수 있습니다. 이를 방지하려면 작업 그룹을 사용하여 쿼리 결과의 위치를 지정하고 작업 그룹 구성원에 맞게 Lake Formation 권한을 조정하는 것이 좋습니다. 그런 다음 IAM 권한 정책을 사용하여 쿼리 결과 위치에 대한 액세스를 제한할 수 있습니다. 쿼리 결과에 대한 자세한 내용은 [쿼리 결과 및 최근 쿼리 작업](querying.md) 단원을 참조하세요.

## 쿼리 기록에 대한 Athena 작업 그룹 멤버십
<a name="lf-athena-user-permissions-workgroup-memberships-query-history"></a>

Athena 쿼리 기록은 저장된 쿼리 및 전체 쿼리 문자열 목록을 드러냅니다. 작업 그룹을 사용하여 쿼리 기록에 대한 액세스를 분리하지 않으면 Lake Formation에서 데이터를 쿼리할 권한이 없는 Athena 사용자가 열 이름, 선택 기준 등을 비롯해 해당 데이터에 대해 실행되는 쿼리 문자열을 볼 수 있습니다. 작업 그룹을 사용하여 쿼리 기록을 분리하고 Athena 작업 그룹 구성원에 맞게 Lake Formation 권한을 조정하여 액세스를 제한하는 것이 좋습니다. 자세한 내용은 [작업 그룹을 사용하여 쿼리 액세스 및 비용 제어](workgroups-manage-queries-control-costs.md) 섹션을 참조하세요.

## 데이터에 대한 Lake Formation 권한
<a name="lf-athena-user-permissions-data"></a>

Lake Formation을 사용할 수 있는 기본 권한 외에도 Athena 사용자는 쿼리하는 리소스에 액세스할 수 있는 Lake Formation 권한이 있어야 합니다. 이러한 권한은 Lake Formation 관리자가 부여하고 관리합니다. 자세한 내용은 *AWS Lake Formation 개발자 안내서*의 [메타데이터 및 데이터에 대한 보안 및 액세스 제어](https://docs.aws.amazon.com/lake-formation/latest/dg/security-data-access.html#security-data-access-permissions)를 참조하세요.

## Amazon S3 위치에 쓸 수 있는 IAM 권한
<a name="lf-athena-user-permissions-s3-write"></a>

Amazon S3에 대한 Lake Formation 권한에는 Amazon S3에 쓸 수 있는 권한이 포함되어 있지 않습니다. CTAS(Create Table As Statements)에는 테이블의 Amazon S3 위치에 대한 쓰기 액세스 권한이 필요합니다. Lake Formation에 등록된 데이터에 대해 CTAS 쿼리를 실행하려면 Athena 사용자는 데이터 위치를 읽을 수 있는 적절한 Lake Fomation 권한과 더불어 테이블의 Amazon S3 위치에 쓸 수 있는 IAM 권한이 있어야 합니다. 자세한 내용은 [쿼리 결과에서 테이블 생성(CTAS)](ctas.md) 단원을 참조하세요.

## 암호화된 데이터, 메타데이터 및 Athena 쿼리 결과에 대한 권한
<a name="lf-athena-user-permissions-encrypted"></a>

Amazon S3의 기본 소스 데이터와 Lake Formation에 등록된 카탈로그의 메타데이터를 암호화할 수 있습니다. Athena를 사용하여 Lake Formation에 등록된 데이터를 쿼리할 때 Athena가 쿼리 결과의 암호화를 처리하는 방식에는 변화가 없습니다. 자세한 내용은 [Amazon S3에 저장된 Athena 쿼리 결과 암호화](encrypting-query-results-stored-in-s3.md) 섹션을 참조하세요.
+ **소스 데이터 암호화** – Amazon S3 데이터 위치 소스 데이터의 암호화가 지원됩니다. Lake Formation에 등록된 암호화 Amazon S3 위치를 쿼리하는 Athena 사용자는 데이터를 암호화하고 해독할 수 있는 권한이 필요합니다. 요구 사항에 대한 자세한 내용은 [지원되는 Amazon S3 암호화 옵션](encryption.md#encryption-options-S3-and-Athena) 및 [Amazon S3의 암호화 데이터 권한](encryption.md#permissions-for-encrypting-and-decrypting-data) 섹션을 참조하세요.
+ **메타데이터 암호화** - AWS Glue Data Catalog의 메타데이터를 암호화할 수 있습니다. Athena를 사용하는 보안 주체의 경우, 자격 증명 기반 정책에서 메타데이터 암호화에 사용된 키에 대한 `"kms:GenerateDataKey"`, `"kms:Decrypt"` 및 `"kms:Encrypt"` 작업을 허용해야 합니다. 자세한 내용은 *AWS Glue 개발자 안내서*의 [데이터 카탈로그 암호화](https://docs.aws.amazon.com/glue/latest/dg/encrypt-glue-data-catalog.html)와 [Athena에서 AWS Glue Data Catalog의 암호화된 메타데이터에 대한 액세스 구성](access-encrypted-data-glue-data-catalog.md) 단원을 참조하세요.

## 외부 계정의 Amazon S3 버킷에 대한 리소스 기반 권한(선택 사항)
<a name="lf-athena-user-permissions-s3-cross-account"></a>

다른 계정에서 Amazon S3 데이터 위치를 쿼리하려면 리소스 기반 IAM 정책(버킷 정책)이 해당 위치에 대한 액세스를 허용해야 합니다. 자세한 내용은 [Athena에서 Amazon S3 버킷에 대한 크로스 계정 액세스 구성](cross-account-permissions.md) 섹션을 참조하세요.

다른 계정의 카탈로그에 액세스하는 방법에 대한 자세한 내용은 [옵션 A: Athena에서 크로스 계정 데이터 카탈로그 액세스 구성](lf-athena-limitations-cross-account.md#lf-athena-limitations-cross-account-glue) 섹션을 참조하세요.

# Athena에 대한 페더레이션 액세스를 위해 Lake Formation과 JDBC 또는 ODBC 드라이버 사용
<a name="security-athena-lake-formation-jdbc"></a>

Athena JDBC 및 ODBC 드라이버는 Okta 및 Microsoft Active Directory Federation Services(AD FS) 자격 증명 공급자를 사용하여 Athena에 SAML 2.0 연합을 지원합니다. Amazon Athena와 AWS Lake Formation이(가) 통합되면서 기업 자격 증명으로 Athena에 대한 SAML 기반 인증이 가능해졌습니다. Lake Formation과 AWS Identity and Access Management(IAM)을(를) 사용하면 SAML 사용자가 사용할 수 있는 데이터에 대해 세분화된 열 수준 액세스 제어를 유지할 수 있습니다. Athena JDBC 및 ODBC 드라이버가 있으면 도구 또는 프로그래밍 방식 액세스에 연합 액세스를 이용할 수 있습니다.

Athena 사용하여 Lake Formation에서 제어하는 데이터 원본에 액세스하려면 자격 증명 공급자(IdP)와 AWS Identity and Access Management(IAM) 역할을 구성하여 SAML 2.0 연합을 활성화해야 합니다. 자세한 단계는 [자습서: Lake Formation 및 JDBC를 사용하여 Athena에 대한 Okta 사용자의 페더레이션 액세스 구성](security-athena-lake-formation-jdbc-okta-tutorial.md) 단원을 참조하세요.

## 사전 조건
<a name="security-athena-lake-formation-jdbc-prerequisites"></a>

연합 액세스를 위해 Amazon Athena 및 Lake Formation을 사용하려면 다음 요구 사항을 충족해야 합니다.
+ Okta 또는 Microsoft AD FS(Active Directory Federation Services) 등의 기존 SAML 기반 자격 증명 공급자를 이용하여 회사 자격 증명을 관리합니다.
+ AWS Glue Data Catalog를 메타데이터 스토어로 사용합니다.
+ AWS Glue Data Catalog의 데이터베이스, 테이블 및 열에 액세스할 수 있는 권한을 Lake Formation에서 정의하고 관리합니다. 자세한 내용은 [AWS Lake Formation 개발자 안내서](https://docs.aws.amazon.com/lake-formation/latest/dg/)를 참조하세요.
+ [Athena JDBC 드라이버](https://docs.aws.amazon.com/athena/latest/ug/connect-with-jdbc.html) 버전 2.0.14 이상 또는 [Athena ODBC 드라이버](connect-with-odbc.md) 버전 1.1.3 이상을 사용합니다.

## 고려 사항 및 제한 사항
<a name="security-athena-lake-formation-jdbc-considerations-and-limitations"></a>

Athena JDBC 또는 ODBC 드라이버와 Lake Formation을 사용하여 Athena 대한 연합 액세스를 구성할 때는 다음 사항에 유의해야 합니다.
+ 현재 Athena JDBC 및 ODBC 드라이버는 Okta, Microsoft Active Directory Federation Services(AD FS) 및 Azure AD ID 제공업체를 지원합니다. Athena JDBC 드라이버에는 다른 자격 증명 공급자를 사용할 수 있게 확장 가능한 일반 SAML 클래스가 있지만 Athena에 사용할 다른 자격 증명 공급자(IdP)를 활성화하는 사용자 지정 익스텐션에 대한 지원이 제한될 수 있습니다.
+ JDBC 및 ODBC 드라이버를 사용한 연동 액세스는 IAM Identity Center의 신뢰할 수 있는 ID 전파 기능과 호환되지 않습니다.
+ 현재는 Athena 콘솔을 사용하여 Athena에서의 IdP 및 SAML 사용 지원을 구성할 수 없습니다. 이 지원을 구성하려면 서드 파티 자격 증명 공급자, Lake Formation 및 IAM 관리 콘솔, JDBC 또는 ODBC 드라이버 클라이언트를 사용합니다.
+ 개발자는 Lake Formation 및 Athena에 사용할 자격 증명 공급자 및 SAML을 구성하기 전에 [SAML 2.0 사양](https://www.oasis-open.org/standards#samlv2.0)을 이해하고 자신의 자격 증명 공급자에서 어떻게 작동하는지 파악해야 합니다.
+ SAML 공급자와 Athena JDBC 및 ODBC 드라이버는 서드 파티에서 제공하므로 그 사용과 관련된 문제에 대해 AWS를 통한 지원은 제한될 수 있습니다.

**Topics**
+ [

## 사전 조건
](#security-athena-lake-formation-jdbc-prerequisites)
+ [

## 고려 사항 및 제한 사항
](#security-athena-lake-formation-jdbc-considerations-and-limitations)
+ [

# 자습서: Lake Formation 및 JDBC를 사용하여 Athena에 대한 Okta 사용자의 페더레이션 액세스 구성
](security-athena-lake-formation-jdbc-okta-tutorial.md)

# 자습서: Lake Formation 및 JDBC를 사용하여 Athena에 대한 Okta 사용자의 페더레이션 액세스 구성
<a name="security-athena-lake-formation-jdbc-okta-tutorial"></a>

이 자습서에서는 Athena의 SAML 기반 연합 사용을 활성화하기 위해 Okta, AWS Lake Formation, AWS Identity and Access Management 권한 및 Athena JDBC 드라이버를 구성하는 방법을 보여줍니다 Lake Formation은 SAML 기반 사용자에게 Athena에서 사용 가능한 데이터에 대해 세분화된 액세스 제어를 제공합니다. 이 구성을 설정하기 위해 자습서에서는 Okta 개발자 콘솔, AWS IAM 및 Lake Formation 콘솔, SQL Workbench/J tool을 사용합니다.
<a name="security-athena-lake-formation-jdbc-okta-tutorial-prerequisites"></a>
**사전 조건**  
이 자습서는 다음을 이미 완료했다고 가정합니다.
+ Amazon Web Services 계정을 생성했습니다. 계정을 만들려면 [Amazon Web Services 홈페이지](https://aws.amazon.com/)를 방문하세요.
+ Amazon S3에서 Athena에 대한 [쿼리 결과 위치를 설정](query-results-specify-location.md)했습니다.
+ Lake Formation에 [Amazon S3 데이터 버킷 위치를 등록](https://docs.aws.amazon.com/lake-formation/latest/dg/register-data-lake.html)했습니다.
+ Amazon S3의 데이터를 가리키는 [AWS Glue 데이터 카탈로그](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html)의 [데이터베이스](https://docs.aws.amazon.com/glue/latest/dg/define-database.html) 및 [테이블](https://docs.aws.amazon.com/glue/latest/dg/tables-described.html)을 정의했습니다.
  + 테이블을 아직 정의하지 않았다면 [AWS Glue 크롤러를 실행](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html)하거나 Athena를 사용해 액세스하려는 데이터에 대해 [하나의 데이터베이스와 하나 이상의 테이블을 정의](work-with-data.md)합니다.
  + 이 자습서는 [뉴욕시 택시 이동 데이터 집합](https://registry.opendata.aws/nyc-tlc-trip-records-pds/)에 기반한 테이블을 사용합니다. 이 테이블은 [Registry of Open Data on AWS](https://registry.opendata.aws/)에 제공되어 있습니다. 이 자습서에서는 데이터베이스 이름 `tripdb`와 테이블 이름 `nyctaxi`를 사용합니다.

**Topics**
+ [

## 1단계: Okta 계정 생성
](#security-athena-lake-formation-jdbc-okta-tutorial-step-1-create-an-okta-account)
+ [

## 2단계: Okta에 사용자 및 그룹 추가
](#security-athena-lake-formation-jdbc-okta-tutorial-step-2-set-up-an-okta-application-for-saml-authentication)
+ [

## 3단계: SAML 인증을 위한 Okta 애플리케이션 설정
](#security-athena-lake-formation-jdbc-okta-tutorial-step-3-set-up-an-okta-application-for-saml-authentication)
+ [

## 4단계: AWS SAML 자격 증명 공급자 및 Lake Formation 액세스 IAM 역할 생성
](#security-athena-lake-formation-jdbc-okta-tutorial-step-4-create-an-aws-saml-identity-provider-and-lake-formation-access-IAM-role)
+ [

## 5단계: Okta 애플리케이션에 IAM 역할 및 SAML 자격 증명 공급자 추가
](#security-athena-lake-formation-jdbc-okta-tutorial-step-5-update-the-okta-application-with-the-aws-role-and-saml-identity-provider)
+ [

## 6단계: AWS Lake Formation을(를) 통해 사용자 및 그룹 권한 부여
](#security-athena-lake-formation-jdbc-okta-tutorial-step-6-grant-permissions-through-aws-lake-formation)
+ [

## 7단계: Athena JDBC 클라이언트를 통해 액세스 권한 확인
](#security-athena-lake-formation-jdbc-okta-tutorial-step-7-verify-access-through-athena-jdbc-client)
+ [

## 결론
](#security-athena-lake-formation-jdbc-okta-tutorial-conclusion)
+ [

## 관련 리소스
](#security-athena-lake-formation-jdbc-okta-tutorial-related-resources)

## 1단계: Okta 계정 생성
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-1-create-an-okta-account"></a>

이 자습서는 Okta를 SAML 기반 자격 증명 공급자로 사용합니다. 아직 Okta 계정이 없다면 무료로 계정을 생성할 수 있습니다. SAML 인증을 위한 Okta 애플리케이션을 만들려면 Okta 계정이 필요합니다.

**Okta 계정을 생성하려면**

1. Okta를 사용하려면 [Okta 개발자 가입 페이지](https://developer.okta.com/signup/)를 탐색해 무료 Okta 평가판 계정을 만듭니다. 개발자 에디션 서비스는 Okta가 [developer.okta.com/pricing](https://developer.okta.com/pricing)에 지정한 한도까지 무료입니다.

1. 활성화 이메일을 받으면 계정을 활성화하세요.

   Okta 도메인 이름이 할당됩니다. 참조용으로 도메인 이름을 저장합니다. 나중에 Athena에 연결하는 JDBC 문자열에 이 도메인 이름(*<okta-idp-domain>*)을 사용합니다.

## 2단계: Okta에 사용자 및 그룹 추가
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-2-set-up-an-okta-application-for-saml-authentication"></a>

이 단계에서는 Okta 콘솔을 사용하여 다음 작업을 수행합니다.
+ 2개의 Okta 사용자를 만듭니다.
+ 2개의 Okta 그룹을 만듭니다.
+ 각 Okta 그룹에 1개의 Okta 사용자를 추가합니다.

**Okta에 사용자를 추가하려면**

1. Okta 계정을 활성화한 후 할당된 Okta 도메인에 관리 사용자로 로그인합니다.

1. 왼쪽 탐색 창에서 **디렉터리(Directory)**와 **사람(People)**을 차례로 선택합니다.

1. **사람 추가(Add Person)**를 선택해 JDBC 드라이버를 통해 Athena에 액세스할 새 사용자를 추가합니다.  
![\[사람 추가(Add Person)를 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-3.png)

1. **사람 추가(Add Person)** 대화 상자에 필수 정보를 입력합니다.
   + **이름(First name)**과 **성(Last name)**에 값을 입력합니다. 이 자습서에서는 *athena-okta-user*를 사용합니다.
   + **사용자 이름(Username)**과 **기본 이메일(Primary email)**을 입력합니다. 이 자습서에서는 *athena-okta-user@anycompany.com*을 사용합니다.
   + **암호(Password)**에서 **관리자별 설정(Set by admin)**을 선택한 다음 암호를 제공합니다. 이 자습서에서는 **사용자가 첫 로그인할 때 암호를 변경해야 함(User must change password on first login)** 옵션을 선택 취소했습니다. 각자의 보안 요구 사항은 다를 수 있습니다.  
![\[Okta 애플리케이션에 사용자 추가\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4.png)

1. **다른 사용자 저장 및 추가(Save and Add Another)**를 선택합니다.

1. 다른 사용자에 대한 정보를 입력합니다. 이 예제에서는 비즈니스 분석가 사용자 *athena-ba-user@anycompany.com*를 추가합니다.  
![\[Okta 애플리케이션에 사용자 추가\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4a.png)

1. **저장(Save)**을 선택합니다.

다음 절차에서는 “비즈니스 분석가” 그룹과 “개발자” 그룹을 추가하여 Athena JDBC 드라이버를 통해 두 Okta 그룹에 대한 액세스를 제공합니다.

**Okta 그룹을 추가하려면**

1. Okta 탐색 창에서 **디렉터리(Directory)**와 **그룹(Groups)**을 차례로 선택합니다.

1. **그룹(Groups)** 페이지에서 **그룹 추가(Add Group)**를 선택합니다.  
![\[Add Group(그룹 추가)을 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4c.png)

1. **그룹 추가(Add Group)** 대화 상자에 필수 정보를 입력합니다.
   + **이름(Name)**에 *lf-business-analyst*를 입력합니다.
   + **그룹 설명(Group Description)**에 *비즈니스 분석가*를 입력합니다.  
![\[Okta 그룹 추가\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4d.png)

1. **Add Group(그룹 추가)**을 선택합니다.

1. **그룹(Groups)** 페이지에서 **그룹 추가(Add Group)**를 다시 선택합니다. 이번에는 개발자 그룹에 대한 정보를 입력합니다.

1. 필요한 정보를 입력합니다.
   + **이름(Name)**에 *lf-developer*를 입력합니다.
   + **그룹 설명(Group Description)**에 *개발자*를 입력합니다.

1. **Add Group(그룹 추가)**을 선택합니다.

이제 두 사용자와 두 그룹이 있으므로 각 그룹에 사용자를 추가할 준비가 되었습니다.

**그룹에 사용자를 추가하려면**

1. **그룹(Groups)** 페이지에서 방금 생성한 **lf-developer** 그룹을 선택합니다. 개발자로 생성한 Okta 사용자 중 하나를 이 그룹에 추가합니다.  
![\[lf-developer를 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4f.png)

1. **사람 관리(Manage People)**를 선택합니다.  
![\[사람 관리(Manage People)를 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4g.png)

1. **구성원 아님(Not Members)** 목록에서 **athena-okta-user**를 선택합니다.  
![\[구성원 목록에 추가할 사용자를 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4h.png)

   사용자에 대한 항목이 왼쪽에 있는 **구성원 아님(Not Members)** 목록에서 오른쪽의 **구성원(Members)** 목록으로 이동합니다.  
![\[Okta 사용자가 Okta 그룹에 추가되었습니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4i.png)

1. **저장**을 선택합니다.

1. **그룹으로 돌아가기(Back to Group)**를 선택하거나 **디렉터리(Directory)**를 선택한 다음 **그룹(Groups)**을 선택합니다.

1. **lf-business-analyst** 그룹을 선택합니다.

1. **사람 관리(Manage People)**를 선택합니다.

1. **athena-ba-user**를 **lf-business-analyst** 그룹의 **구성원** 목록에 추가한 다음 **저장(Save)**을 선택합니다.

1. **그룹으로 돌아가기(Back to Group)**를 선택하거나 **디렉터리(Directory)**, **그룹(Groups)**을 선택합니다.

   이제 **그룹(Groups)** 페이지에서 각 그룹에 한 명의 Okta 사용자가 있는 것을 볼 수 있습니다.  
![\[Okta 콘솔의 각 Okta 그룹에 한 명의 사용자가 추가되었습니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-4j.png)

## 3단계: SAML 인증을 위한 Okta 애플리케이션 설정
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-3-set-up-an-okta-application-for-saml-authentication"></a>

이 단계에서는 Okta 개발자 콘솔을 사용하여 다음 작업을 수행합니다.
+ AWS에 사용할 SAML 애플리케이션을 추가합니다.
+ Okta 사용자에게 애플리케이션을 할당합니다.
+ Okta 그룹에게 애플리케이션을 할당합니다.
+ 나중에 AWS에 사용할 수 있도록 최종적인 자격 증명 공급자 메타데이터를 다운로드합니다.

**SAML 인증을 위한 애플리케이션을 추가하려면**

1. Okta 탐색 창에서 **애플리케이션(Applications)**, **애플리케이션(Applications)**을 선택하여 Athena에 대한 SAML 인증용 Okta 애플리케이션을 구성할 수 있습니다.

1. **앱 카탈로그 찾아보기(Browse App Catalog)**를 클릭합니다.

1. 검색 상자에 **Redshift**을(를) 입력합니다.

1. **Amazon Web Services Redshift**를 선택합니다. 이 자습서의 Okta 애플리케이션은 Amazon Redshift를 위한 기존의 SAML 통합을 사용합니다.  
![\[Amazon Web Services Redshift를 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-7.png)

1. **Amazon Web Services Redshift** 페이지에서 **추가(Add)**를 선택해 Amazon Redshift용 SAML 기반 애플리케이션을 생성합니다.  
![\[추가(Add)를 선택해 SAML 기반 애플리케이션을 생성합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-8.png)

1. **애플리케이션 레이블(Application label)**에 `Athena-LakeFormation-Okta`를 입력하고 **완료(Done)**를 선택합니다.  
![\[Okta 애플리케이션의 이름을 입력합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-9.png)

이제 Okta 애플리케이션을 생성되었고, 생성한 사용자 및 그룹에 이 애플리케이션을 할당할 수 있습니다.

**애플리케이션을 사용자 및 그룹에 할당하려면**

1. **애플리케이션(Applications)** 페이지에서 **Athena-LakeFormation-Okta** 애플리케이션을 선택합니다.

1. **할당(Assignments)** 탭에서 **할당(Assign)**, **사람에게 할당(Assign to People)**을 차례로 선택합니다.  
![\[할당(Assign), 사람에게 할당(Assign to People)을 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-10.png)

1. **Athena-LakeFormation-Okta를 사람에게 할당(Assign Athena-LakeFormation-Okta to People)** 대화 상자에서 이전에 생성했던 **athena-okta-user** 사용자를 찾습니다.

1. **할당(Assign)**을 선택해 사용자를 애플리케이션에 할당합니다.  
![\[할당을 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-11.png)

1. **저장하고 돌아가기(Save and Go Back)**를 선택합니다.

1. **완료**를 선택합니다.

1. **Athena-LakeFormation-Okta** 애플리케이션에 대한 **할당(Assignments)** 탭에서 **할당(Assign)**, **그룹에게 할당(Assign to Groups)**을 차례로 선택합니다.

1. **lf-business-analyst**에서 **할당(Assign)**을 선택해 **Athena-LakeFormation-Okta** 애플리케이션을 **lf-business-analyst** 그룹에 할당한 다음 **완료(Done)**를 선택합니다.  
![\[Okta 사용자 그룹에 Okta 애플리케이션 할당\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-12b.png)

   해당 그룹이 애플리케이션의 그룹 목록에 나타납니다.  
![\[Okta 애플리케이션이 Okta 그룹에 할당됩니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-12c.png)

이제 AWS에 사용할 자격 증명 공급자 애플리케이션 메타데이터를 다운로드할 준비가 되었습니다..

**애플리케이션 메타데이터를 다운로드하려면**

1. Okta 애플리케이션 **로그인(Sign On)** 탭을 선택한 다음 **자격 증명 공급자 메타데이터(Identity Provider metadata)**를 마우스 오른쪽 버튼으로 클릭합니다.  
![\[자격 증명 공급자 메타데이터(Identity Provider metadata)를 마우스 오른쪽 버튼으로 클릭합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-13.png)

1. **다른 이름으로 링크 저장(Save Link As)**을 선택해 XML 형식의 자격 증명 공급자 메타데이터를 파일에 저장합니다. 알아볼 수 있는 이름을 지정합니다(예:`Athena-LakeFormation-idp-metadata.xml`).  
![\[자격 증명 공급자 메타데이터 저장\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-14.png)

## 4단계: AWS SAML 자격 증명 공급자 및 Lake Formation 액세스 IAM 역할 생성
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-4-create-an-aws-saml-identity-provider-and-lake-formation-access-IAM-role"></a>

이 단계에서는 AWS Identity and Access Management(IAM) 콘솔을 사용하여 다음 작업을 수행합니다.
+ AWS에 대한 자격 증명 공급자를 생성합니다.
+ Lake Formation 액세스를 위한 IAM 역할을 생성합니다.
+ AmazonAthenaFullAccess 관리형 정책을 역할에 추가합니다.
+ Lake Formation 및 AWS Glue에 대한 정책을 역할에 축가합니다.
+ Athena 쿼리 결과에 대한 정책을 역할에 추가합니다.

**AWS SAML 자격 증명 공급자를 생성하려면**

1. **Amazon Web Services 계정** **콘솔**에 **Amazon Web Services 계정 관리자**로 로그인하고 **IAM** 콘솔([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))을 탐색합니다.

1. 탐색 창에서 **자격 증명 공급자(Identity providers)**를 선택한 다음 **공급자 추가(Add provider)**를 클릭합니다.

1. **공급자 구성(Configure provider)** 화면에 다음 정보를 입력합니다.
   + **공급자 유형(Provider type)**에 **SAML**을 선택합니다.
   + **공급자 이름(Provider name)**에 `AthenaLakeFormationOkta`를 입력합니다.
   + **메타데이터 문서(Metadata document)**에서 **파일 선택(Choose file)** 옵션을 사용하여 다운로드한 자격 증명 공급자(IdP) 메타데이터 XML 파일을 업로드합니다.

1. **공급자 추가(Add Provider)**를 선택합니다.

다음으로 AWS Lake Formation 액세스를 위한 IAM 역할을 생성합니다. 역할에 두 개의 인라인 정책을 추가합니다. 한 정책은 Lake Formation 및 AWS Glue API에 액세스할 수 있는 권한을 제공합니다. 다른 정책은 Athena와 Amazon S3의 Athena 쿼리 결과 위치에 대한 액세스 권한을 제공합니다.

**AWS Lake Formation 액세스를 위한 IAM 역할을 생성하려면**

1. IAM 콘솔의 탐색 창에서 **역할(Roles)**을 선택하고 **역할 생성(Create role)**을 선택합니다.

1. **역할 생성(Create role)** 페이지에서 다음 단계를 수행합니다.  
![\[SAML 2.0을 사용하기 위한 IAM 역할을 구성합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-20.png)

   1. **신뢰할 수 있는 엔터티 유형 선택(Select type of trusted entity)**에서 **SAML 2.0 연합(SAML 2.0 Federation)**을 선택합니다.

   1. **SAML 공급자(SAML provider)**에서 **AthenaLakeFormationOkta**를 선택합니다.

   1. **SAML 공급자**에서 **프로그래밍 방식 및 AWS Management Console 액세스 허용** 옵션을 선택합니다.

   1. **다음: 권한**을 선택합니다.

1. **권한 정책 연결(Attach Permissions policies)** 페이지에서 **필터 정책(Filter policies)**에 **Athena**를 입력합니다.

1. **AmazonAthenaFullAccess** 관리형 정책을 선택하고 **다음: 태그(Next: Tags)**를 선택합니다.  
![\[AmazonAthenaFullAccess 관리형 정책을 IAM 역할에 연결\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-21.png)

1. **Add tags(태그 추가)** 페이지에서 **Next: Review(다음: 검토)**를 선택합니다.

1. **검토(Review)** 페이지에서 **역할 이름(Role name)**에 역할의 이름(예: *Athena-LakeFormation-OktaRole*)을 입력한 다음 **역할 생성(Create role)**을 선택합니다.  
![\[IAM 역할의 이름을 입력합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-22.png)

그런 다음 Lake Formation에 대한 액세스를 허용하는 인라인 정책, AWS Glue API, Amazon S3의 Athena 쿼리 결과를 추가합니다.

IAM 정책을 사용할 때마다 IAM 모범 사례를 따라야 합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

**Lake Formation 및 AWS Glue에 대한 역할에 인라인 정책을 추가하려면**

1. IAM 콘솔의 역할 목록에서 새로 생성된 `Athena-LakeFormation-OktaRole`을 선택합니다.

1. 역할에 대한 **요약(Summary)** 페이지의 **권한(Permissions)** 탭에서 **인라인 정책 추가(Add inline policy)**를 선택합니다.

1. **정책 생성** 페이지에서 **JSON**을 선택합니다.

1. Lake Formation 및 AWS Glue API에 대한 액세스 권한을 제공하는 다음과 같은 인라인 정책을 추가합니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Action": [
               "lakeformation:GetDataAccess",
               "glue:GetTable",
               "glue:GetTables",
               "glue:GetDatabase",
               "glue:GetDatabases",
               "glue:CreateDatabase",
               "glue:GetUserDefinedFunction",
               "glue:GetUserDefinedFunctions"
           ],
           "Resource": "*"
       }
   }
   ```

------

1. **정책 검토**를 선택합니다.

1. **이름(Name)**에 정책의 이름을 입력합니다(예: **LakeFormationGlueInlinePolicy**).

1. **정책 생성(Create policy)**을 선택합니다.

**Athena 쿼리 결과 위치에 대한 역할에 인라인 정책을 추가하려면**

1. `Athena-LakeFormation-OktaRole` 역할에 대한 **요약(Summary)** 페이지의 **권한(Permissions)** 탭에서 **인라인 정책 추가(Add inline policy)**를 선택합니다.

1. **정책 생성** 페이지에서 **JSON**을 선택합니다.

1. Athena 쿼리 결과 위치에 대한 역할 액세스를 허용하는 다음과 같은 인라인 정책을 추가합니다. 예제의 *<athena-query-results-bucket>* 자리 표시자를 해당 Amazon S3 버킷의 이름으로 바꿉니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AthenaQueryResultsPermissionsForS3",
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket",
                   "s3:PutObject",
                   "s3:GetObject"
               ],
               "Resource": [
                   "arn:aws:s3:::<athena-query-results-bucket>",
                   "arn:aws:s3:::<athena-query-results-bucket>/*"
               ]
           }
       ]
   }
   ```

------

1. **정책 검토**를 선택합니다.

1. **이름(Name)**에 정책의 이름을 입력합니다(예: **AthenaQueryResultsInlinePolicy**).

1. **정책 생성(Create policy)**을 선택합니다.

그런 다음 Lake Formation 액세스 역할의 ARN과 생성한 SAML 공급자의 ARN을 복사합니다. 이 정보는 자습서의 다음 단원에서 Okta SAML 애플리케이션을 구성할 때 필요합니다.

**역할 ARN 및 SAML 자격 증명 공급자 ARN을 복사하려면**

1. IAM 콘솔의 **요약(Summary)** 페이지에서 `Athena-LakeFormation-OktaRole` 역할에 대해 **역할 ARN(Role ARN)** 옆에 있는 **클립보드로 복사(Copy to clipboard)**를 선택합니다. ARN의 형식은 다음과 같습니다.

   ```
   arn:aws:iam::<account-id>:role/Athena-LakeFormation-OktaRole
   ```

1. 나중에 참조할 수 있도록 전체 ARN을 안전하게 저장합니다.

1. IAM 콘솔 탐색 창에서 **자격 증명 공급자(Identity providers)**를 선택합니다.

1. **AthenaLakeFormationOkta** 공급자를 선택합니다.

1. **요약(Summary)** 페이지에서 **공급자 ARN(Provider ARN)** 옆의 **클립보드로 복사(Copy to clipboard)** 아이콘을 선택합니다. ARN은 다음과 같은 양식이어야 합니다.

   ```
   arn:aws:iam::<account-id>:saml-provider/AthenaLakeFormationOkta
   ```

1. 나중에 참조할 수 있도록 전체 ARN을 안전하게 저장합니다.

## 5단계: Okta 애플리케이션에 IAM 역할 및 SAML 자격 증명 공급자 추가
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-5-update-the-okta-application-with-the-aws-role-and-saml-identity-provider"></a>

이 단계에서는 Okta 개발자 콘솔로 돌아가서 다음 작업을 수행합니다.
+ Okta 애플리케이션에 사용자 및 그룹 Lake Formation URL 속성을 추가합니다.
+ 자격 증명 공급자의 ARN과 IAM 역할의 ARN을 Okta 애플리케이션에 추가합니다.
+ Okta 애플리케이션 ID를 복사합니다. Okta 애플리케이션 ID는 Athena에 연결하는 JDBC 프로파일에 필요합니다.

**Okta 애플리케이션에 사용자 및 그룹 Lake Formation URL 속성을 추가하려면**

1. Okta 개발자 콘솔에 로그인합니다.

1. **애플리케이션(Applications)** 탭을 선택한 다음 `Athena-LakeFormation-Okta` 애플리케이션을 선택합니다.

1. 애플리케이션에 대한 **로그인(Sign On)** 탭을 선택한 다음 **편집(Edit)**을 선택합니다.  
![\[Okta 애플리케이션을 편집합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-24.png)

1. **속성(선택 사항)(Attributes (optional))**을 클릭하여 확장합니다.  
![\[Okta 애플리케이션에 사용자 Lake Formation URL 속성을 추가합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-25.png)

1. **속성 문(선택 사항)(Attribute Statements (optional))**에 다음 속성을 추가합니다.
   + **이름**에 **https://lakeformation.amazon.com/SAML/Attributes/Username**를 입력합니다.
   + [**값(Value)**]에 **user.login**을 입력합니다.

1. **그룹 속성 문(선택 사항)(Group Attribute Statements (optional))**에 다음 속성을 추가합니다.
   + **이름**에 **https://lakeformation.amazon.com/SAML/Attributes/Groups**를 입력합니다.
   + **이름 형식(Name format)**에 **Basic**을 입력합니다.
   + **필터(Filter)**에서 **정규식 일치(Matches regex)**를 선택한 다음 필터 상자에 **.\$1**을 입력합니다.  
![\[Okta 애플리케이션에 그룹 Lake Formation URL 속성을 추가합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-25a.png)

1. **고급 로그인 설정(Advanced Sign-On Settings)** 섹션까지 아래로 스크롤하고, 여기서 자격 증명 공급자 및 IAM 역할 ARN을 Okta 애플리케이션에 추가합니다.

**자격 증명 공급자 및 IAM 역할의 ARN을 Okta 애플리케이션에 추가하려면**

1. **Idp ARN 및 역할 ARN(Idp ARN and Role ARN)**에 AWS 자격 증명 공급자 ARN과 역할 ARN을 *<saml-arn>*,*<role-arn>* 형식의 쉼표로 구분된 값으로 입력합니다. 결합된 문자열은 다음과 같아야 합니다.

   ```
   arn:aws:iam::<account-id>:saml-provider/AthenaLakeFormationOkta,arn:aws:iam::<account-id>:role/Athena-LakeFormation-OktaRole
   ```  
![\[Okta 애플리케이션에서 자격 증명 공급자 ARN 및 IAM 역할 ARN을 입력합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-26.png)

1. **저장**을 선택합니다.

다음으로 Okta 애플리케이션 ID를 복사합니다. 나중에 Athena에 연결하는 JDBC 문자열에 이 정보가 필요합니다.

**Okta 애플리케이션 ID를 찾고 복사하려면**

1. Okta 애플리케이션의 **일반(General)** 탭을 선택합니다.  
![\[Okta 애플리케이션의 일반(General) 탭을 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-27.png)

1. 아래로 스크롤하여 **앱 포함 링크(App Embed Link)** 섹션으로 이동합니다.

1. **포함 링크(Embed Link)**에서 URL의 Okta 애플리케이션 ID 부분을 복사하고 안전하게 저장합니다. Okta 애플리케이션 ID는 URL에서 `amazon_aws_redshift/` 뒤부터 다음 슬래시 앞까지의 부분입니다. 예를 들어, URL에 `amazon_aws_redshift/aaa/bbb`가 포함된 경우 애플리케이션 ID는 `aaa`입니다.  
![\[Okta 애플리케이션의 ID를 복사합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-28.png)

**참고**  
포함 링크(Embed link)를 사용하여 Athena 콘솔에 직접 로그인하여 데이터베이스를 볼 수 없습니다. SAML 사용자 및 그룹에 대한 Lake Formation 권한은 JDBC 또는 ODBC 드라이버를 사용하여 Athena 쿼리를 제출할 때만 인식됩니다. JDBC 드라이버를 사용하여 Athena에 연결하는 SQL Workbench/J 도구를 사용하여 데이터베이스를 볼 수 있습니다. SQL Workbench/J 도구는 [7단계: Athena JDBC 클라이언트를 통해 액세스 권한 확인](#security-athena-lake-formation-jdbc-okta-tutorial-step-7-verify-access-through-athena-jdbc-client)에서 다룹니다.

## 6단계: AWS Lake Formation을(를) 통해 사용자 및 그룹 권한 부여
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-6-grant-permissions-through-aws-lake-formation"></a>

이 단계에서는 Lake Fomation 콘솔을 사용하여 SAML 사용자 및 그룹에게 테이블에 대한 권한을 부여합니다. 다음 작업을 수행할 수 있습니다.
+ Okta SAML 사용자의 ARN 및 테이블에 대한 연결된 사용자 권한을 지정합니다.
+ Okta SAML 사용자의 ARN 및 테이블에 대한 연결된 사용자 권한을 지정합니다.
+ 부여한 권한을 확인합니다.

**Lake Formation에서 Okta 사용자에 대해 권한을 부여하려면**

1. 데이터 레이크 관리자로 AWS Management Console에 로그인합니다.

1. Lake Formation 콘솔([https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/))을 엽니다.

1. 탐색 창에서 **테이블(Tables)**을 선택한 다음 권한을 부여할 테이블을 선택합니다. 이 자습서에서는 `tripdb` 데이터베이스의 `nyctaxi` 테이블을 사용합니다.  
![\[권한을 부여할 테이블을 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-29.png)

1. **작업(Actions)**에서 **권한 부여(Grant)**를 선택합니다.  
![\[권한 부여(Grant)를 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-30.png)

1. **권한 부여(Grant permissions)** 대화 상자에 다음 정보를 입력합니다.

   1. **SAML 및 Amazon Quick 사용자 및 그룹**에 다음 형식으로 Okta SAML 사용자 ARN을 입력합니다.

      ```
      arn:aws:iam::<account-id>:saml-provider/AthenaLakeFormationOkta:user/<athena-okta-user>@<anycompany.com>       
      ```

   1. **열(Columns)**에서 **필터 유형을 선택**하고, **열 포함(Include columns)** 또는 **열 제외(Exclude columns)** 옵션을 선택합니다.

   1. 필터 아래의 **하나 이상의 열 선택(Choose one or more columns)** 드롭다운을 사용하여 사용자에 대해 포함하거나 제외할 열을 지정합니다.

   1. **테이블 권한(Table permissions)**에서 **선택(Select)**을 선택합니다. 이 자습서에서는 `SELECT` 권한만 부여하며, 각자의 요구 사항은 다를 수 있습니다.  
![\[Okta 사용자에게 테이블 및 열 수준 권한을 부여합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-31.png)

1. **권한 부여(Grant)**를 선택합니다.

이제 Okta 그룹에 대해 비슷한 단계를 수행합니다.

**Lake Formation에서 Okta 사용자에 대해 권한을 부여하려면**

1. Lake Formation 콘솔의 **테이블(Tables)** 페이지에서 **nyctaxi** 테이블이 계속 선택되어 있는지 확인합니다. 

1. **작업(Actions)**에서 **권한 부여(Grant)**를 선택합니다.

1. **권한 부여(Grant permissions)** 대화 상자에 다음 정보를 입력합니다.

   1. **SAML 및 Amazon Quick 사용자 및 그룹**에 다음 형식으로 Okta SAML 그룹 ARN을 입력합니다.

      ```
      arn:aws:iam::<account-id>:saml-provider/AthenaLakeFormationOkta:group/lf-business-analyst
      ```

   1. **열(Columns)**에서 **필터 유형을 선택**하고, **열 포함(Include columns)**을 선택합니다.

   1. **하나 이상의 열 선택(Choose one or more columns)**에서 테이블의 첫 3개 열을 선택합니다.

   1. **테이블 권한(Table permissions)**에서 부여할 특정 액세스 권한을 선택합니다. 이 자습서에서는 `SELECT` 권한만 부여하며, 각자의 요구 사항은 다를 수 있습니다.  
![\[Okta 그룹에 테이블 권한 부여\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-31b.png)

1. **권한 부여(Grant)**를 선택합니다.

1. 부여한 권한을 확인하려면 **작업(Actions)**, **권한 보기(View permissions)**를 선택합니다.  
![\[부여한 권한을 확인하려면 [권한 보기(View permissions)]를 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-32.png)

   `nyctaxi` 테이블에 대한 **데이터 권한** 페이지에 **athena-okta-user** 및 **lf-business-analyst** 그룹에 대한 권한이 표시됩니다.  
![\[Okta 사용자 및 그룹에 부여된 권한 보기\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-33.png)

## 7단계: Athena JDBC 클라이언트를 통해 액세스 권한 확인
<a name="security-athena-lake-formation-jdbc-okta-tutorial-step-7-verify-access-through-athena-jdbc-client"></a>

이제 Okta SAML 사용자로서 Athena 테스트 연결을 수행하기 위해 JDBC 클라이언트를 사용할 준비가 되었습니다.

이 단원에서는 다음 작업을 수행합니다.
+ 테스트 클라이언트 준비 - Athena JDBC 드라이버를 다운로드하고 SQL 워크벤치를 설치한 다음 드라이버를 워크벤치에 추가합니다. 이 자습서에서는 SQL 워크벤치를 사용하여 Okta 인증을 통해 Athena 액세스하고 Lake Formation 권한을 확인합니다.
+ SQL Workbench에서:
  + Athena Okta 사용자에 대한 연결을 만듭니다.
  + Athena Okta 사용자로 테스트 쿼리를 실행합니다.
  + 비즈니스 분석가 사용자에 대한 연결을 만들고 테스트합니다.
+ Okta 콘솔에서 비즈니스 분석가 사용자를 개발자 그룹에 추가합니다.
+ Lake Formation 콘솔에서 개발자 그룹에 대한 테이블 권한을 구성합니다.
+ SQL 워크벤치에서 비즈니스 분석가 사용자로 테스트 쿼리를 실행하고 권한 변경이 결과에 어떤 영향을 미치는지 확인합니다.

**테스트 클라이언트를 준비하려면**

1. Lake Formation 호환 Athena JDBC 드라이버(버전 2.0.14 이상)를 다운로드하고 [JDBC로 Amazon Athena에 연결](connect-with-jdbc.md)에서 추출합니다.

1. 수정된 Apache 2.0 라이선스에 따라 제공되는 무료 [SQL Workbench/J](https://www.sql-workbench.eu/index.html) SQL 쿼리 도구를 다운로드하고 설치합니다.

1. SQL Workbench에서 **파일(File)**을 선택한 후 **드라이버 관리(Manage Drivers)**를 선택합니다.  
![\[Manage Drivers를 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-1.png)

1. **드라이버 관리(Manage Drivers)** 대화 상자에서 다음 단계를 수행합니다.

   1. 새 드라이버 아이콘을 선택합니다.

   1. **이름**에 **Athena**를 입력합니다.

   1. **라이브러리(Library)**에서 방금 다운로드한 Simba Athena JDBC `.jar` 파일을 찾아서 선택합니다.

   1. **확인**을 선택합니다.  
![\[Athena JDBC 드라이버를 SQL Workbench에 추가합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-2.png)

이제 Athena Okta 사용자에 대한 연결을 생성하고 테스트할 준비가 되었습니다.

**Okta 사용자에 대한 연결을 만들려면**

1. **파일(File)**, **연결 창(Connect window)**을 선택합니다.  
![\[연결 창(Connect window)을 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-3.png)

1. **연결 프로파일(Connection profile)** 대화 상자에서 다음 정보를 입력하여 연결을 생성합니다.
   + 이름 상자에 **Athena\$1Okta\$1User\$1Connection**을 입력합니다.
   + **드라이버(Driver)**에서 Simba Athena JDBC 드라이버를 선택합니다.
   + **VPC**에 대해 다음 중 하나를 수행합니다.
     + 연결 URL을 사용하려면 단일 행의 연결 문자열을 입력합니다. 다음 예제에서는 가독성을 위해 줄 바꿈이 추가되었습니다.

       ```
       jdbc:awsathena://AwsRegion=region-id;
       S3OutputLocation=s3://amzn-s3-demo-bucket/athena_results;
       AwsCredentialsProviderClass=com.simba.athena.iamsupport.plugin.OktaCredentialsProvider;
       user=athena-okta-user@anycompany.com;
       password=password;
       idp_host=okta-idp-domain;
       App_ID=okta-app-id;
       SSL_Insecure=true;
       LakeFormationEnabled=true;
       ```
     + AWS 프로파일 기반 URL을 사용하려면 다음 단계를 수행합니다.

       1. 다음 예제처럼 AWS 자격 증명 파일이 있는 [AWS 프로파일](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html)을 구성합니다.

          ```
          [athena_lf_dev]
          plugin_name=com.simba.athena.iamsupport.plugin.OktaCredentialsProvider
          idp_host=okta-idp-domain
          app_id=okta-app-id
          uid=athena-okta-user@anycompany.com
          pwd=password
          ```

       1. 다음 예제와 같이 **URL**에 단일 행의 연결 문자열을 입력합니다. 예제에는 가독성을 위해 줄 바꿈이 추가되었습니다.

          ```
          jdbc:awsathena://AwsRegion=region-id;
          S3OutputLocation=s3://amzn-s3-demo-bucket/athena_results;
          profile=athena_lf_dev;
          SSL_Insecure=true;
          LakeFormationEnabled=true;
          ```

     이 예제는 Athena 연결하는 데 필요한 URL의 기본 표현입니다. URL에서 지원되는 파라미터의 전체 목록은 [JDBC 설명서](connect-with-jdbc.md)를 참조하세요.

   다음 이미지는 연결 URL을 사용하는 SQL 워크벤치 연결 프로파일을 보여 줍니다.  
![\[SQL 워크벤치의 연결 프로파일.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-4.png)

이제 Okta 사용자에 대한 연결을 설정했으므로 일부 데이터를 검색하여 테스트할 수 있습니다.

**Okta 사용자에 대한 연결을 테스트하려면**

1. **테스트(Test)**를 선택한 다음 연결이 성공하는지 확인합니다.

1. SQL 워크벤치의 **문(Statement)** 창에서 다음 SQL `DESCRIBE` 명령을 실행합니다. 모든 열이 표시되는지 확인합니다.

   ```
   DESCRIBE "tripdb"."nyctaxi"
   ```  
![\[모든 열이 표시됩니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-5.png)

1. SQL 워크벤치의 **문(Statement)** 창에서 다음 SQL `SELECT` 명령을 실행합니다. 모든 열이 표시되는지 확인합니다.

   ```
   SELECT * FROM tripdb.nyctaxi LIMIT 5
   ```  
![\[모든 열이 표시되는지 확인합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-6.png)

다음으로 **lf-business-analyst** 그룹의 구성원인 **athena-ba-user**가 앞서 Lake Formation에서 지정한 테이블의 첫 3개 열에 대해서만 액세스 권한을 갖는지 확인합니다.

****athena-ba-user**의 액세스 권한을 확인하려면**

1. SQL 워크벤치의 **연결 프로파일(Connection profile)** 대화 상자에서 다른 연결 프로파일을 만듭니다.
   + 연결 프로파일 이름에 ** Athena\$1Okta\$1Group\$1Connection**을 입력합니다.
   + **드라이버(Driver)**에서 Simba Athena JDBC 드라이버를 선택합니다.
   + **VPC**에 대해 다음 중 하나를 수행합니다.
     + 연결 URL을 사용하려면 단일 행의 연결 문자열을 입력합니다. 다음 예제에서는 가독성을 위해 줄 바꿈이 추가되었습니다.

       ```
       jdbc:awsathena://AwsRegion=region-id;
       S3OutputLocation=s3://amzn-s3-demo-bucket/athena_results;
       AwsCredentialsProviderClass=com.simba.athena.iamsupport.plugin.OktaCredentialsProvider;
       user=athena-ba-user@anycompany.com;
       password=password;
       idp_host=okta-idp-domain;
       App_ID=okta-application-id;
       SSL_Insecure=true;
       LakeFormationEnabled=true;
       ```
     + AWS 프로파일 기반 URL을 사용하려면 다음 단계를 수행합니다.

       1. 다음 예제처럼 자격 증명 파일이 있는 AWS 프로파일을 구성합니다.

          ```
          [athena_lf_ba]
          plugin_name=com.simba.athena.iamsupport.plugin.OktaCredentialsProvider
          idp_host=okta-idp-domain
          app_id=okta-application-id
          uid=athena-ba-user@anycompany.com
          pwd=password
          ```

       1. 다음과 같이 **URL**에 단일 행의 연결 문자열을 입력합니다. 예제에는 가독성을 위해 줄 바꿈이 추가되었습니다.

          ```
          jdbc:awsathena://AwsRegion=region-id;
          S3OutputLocation=s3://amzn-s3-demo-bucket/athena_results;
          profile=athena_lf_ba;
          SSL_Insecure=true;
          LakeFormationEnabled=true;
          ```

1. **테스트(Test)**를 선택해 연결이 성공적인지 확인합니다.

1. **SQL 문(SQL Statement)** 창에서 전에 수행했던 것과 동일한 `DESCRIBE` 및 `SELECT` SQL 명령을 실행하고 결과를 조사합니다.

   **athena-ba-user**는 **lf-business-analyst** 그룹의 구성원이기 때문에 Lake Formation 콘솔에서 지정한 첫 3개의 열만 반환됩니다.  
![\[첫 3개의 열만 반환됩니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-7.png)  
![\[첫 3개 열의 데이터.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-8.png)

다음으로 Okta 콘솔로 돌아가 `athena-ba-user`를 `lf-developer` Okta 그룹에 추가합니다.

**lf-developer 그룹에 athena-ba-user를 추가하려면**

1. 할당된 Okta 도메인의 관리 사용자로 Okta 콘솔에 로그인합니다.

1. **디렉터리(Directory)**를 선택한 후 **그룹(Groups)**을 선택합니다.

1. 그룹(Groups) 페이지에서 **lf-developer** 그룹을 선택합니다.  
![\[lf-developer 그룹을 선택합니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-9.png)

1. **사람 관리(Manage People)**를 선택합니다.

1. **구성원 아님(Not Members)** 목록에서 **athena-ba-user**를 선택해 **lf-developer group**에 추가합니다.

1. **저장**을 선택합니다.

이제 Lake Formation 콘솔로 돌아가 **lf-developer** 그룹에 대한 테이블 권한을 구성합니다.

**lf-developer-group에 대한 테이블 권한을 구성하려면**

1. Lake Formation 콘솔에 데이터 레이크 관리자로 로그인합니다.

1. 탐색 창에서 **테이블**을 선택합니다.

1. **nyctaxi** 테이블을 선택합니다.

1. **작업(Actions)**, **권한 부여(Grant)**를 선택합니다.

1. **권한 부여(Grant Permissions)** 대화 상자에 다음 정보를 입력합니다.
   + **SAML 및 Amazon Quick의 사용자 및 그룹**에 다음 형식으로 Okta SAML lf-developer 그룹 ARN을 입력합니다.
   + **열(Columns)**에서 **필터 유형을 선택**하고, **열 포함(Include columns)**을 선택합니다.
   + **trip\$1type** 열을 선택합니다.
   + **테이블 권한(Table permissions)**에 **SELECT**를 선택합니다.

1. **권한 부여(Grant)**를 선택합니다.

이제 SQL 워크벤치를 사용하여 **lf-developer** 그룹에 대한 권한 변경을 확인할 수 있습니다. **athena-ba-user**는 이제 **lf-developer** 그룹의 구성원이므로 사용 가능한 데이터에 변경이 반영되어야 합니다.

**athena-ba-user에 대한 권한 변경을 확인하려면**

1. SQL 워크벤치 프로그램을 닫은 다음 다시 엽니다.

1. **athena-ba-user**의 프로파일에 연결합니다.

1. **문(Statement)** 창에서 이전에 실행한 것과 동일한 SQL 문을 실행합니다.

   이번에는 **trip\$1type** 열이 표시됩니다.  
![\[네 번째 열을 쿼리에 사용할 수 있습니다.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-10.png)

   **athena-ba-user**가 이제 **lf-developer** 및 **lf-business-analyst** 그룹 모두의 구성원이므로 이 그룹들에 대한 Lake Formation 권한 조합이 반환되는 열을 결정합니다.  
![\[데이터 결과의 네 번째 열.\]](http://docs.aws.amazon.com/ko_kr/athena/latest/ug/images/security-athena-lake-formation-jdbc-okta-tutorial-verify-access-11.png)

## 결론
<a name="security-athena-lake-formation-jdbc-okta-tutorial-conclusion"></a>

이 자습서에서는 Okta를 SAML 공급자로 사용해 Athena와 AWS Lake Formation의 통합을 구성했습니다. 데이터 레이크 AWS Glue 데이터 카탈로그에서 SAML 사용자가 사용 가능한 리소스를 제어하는 데에는 Lake Formation 및 IAM이 사용되었습니다. 

## 관련 리소스
<a name="security-athena-lake-formation-jdbc-okta-tutorial-related-resources"></a>

관련 내용은 다음 리소스를 참조하세요.
+ [JDBC로 Amazon Athena에 연결](connect-with-jdbc.md)
+ [Athena API에 대한 페더레이션 액세스 활성화](access-federation-saml.md)
+ [AWS Lake Formation 개발자 안내서](https://docs.aws.amazon.com/lake-formation/latest/dg/)
+ *AWS Lake Formation 개발자 안내서*의 [데이터 카탈로그 권한 부여 및 취소](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html).
+ *IAM 사용 설명서*의 [자격 증명 공급자 및 연동](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers.html).
+ *IAM 사용 설명서*의 [IAM SAML 자격 증명 공급자 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html).
+ *AWS 보안 블로그*의 [Enabling Federation to AWS Using Windows Active Directory, ADFS, and SAML 2.0](https://aws.amazon.com/blogs/security/enabling-federation-to-aws-using-windows-active-directory-adfs-and-saml-2-0/).