

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# EMR Serverless를 사용하는 데이터 보호를 위한 Secrets Manager
<a name="secrets-manager"></a>

AWS Secrets Manager 는 데이터베이스 자격 증명, API 키 및 기타 보안 암호 정보를 보호하기 위한 보안 암호 스토리지 서비스입니다. 그런 다음, 코드에서 하드코딩된 자격 증명를 Secrets Manager에 대한 API 직접 호출로 교체할 수 있습니다. 그러면 보안 암호가 해당 위치에 있지 않기 때문에 여러분의 코드를 검사하는 누군가에 의해 보안 암호가 손상되지 않도록 방지할 수 있습니다. 개요는 [AWS Secrets Manager 사용 설명서](https://docs.aws.amazon.com/secretsmanager/latest/userguide)를 참조하세요.

Secrets Manager는 AWS Key Management Service 키를 사용하여 보안 암호를 암호화합니다. 자세한 내용은 **AWS Secrets Manager 사용 설명서의 [보안 암호 암호화 및 복호화](https://docs.aws.amazon.com/secretsmanager/latest/userguide/security-encryption.html)를 참조하세요.

사용자가 지정한 일정에 따라 Secrets Manager가 자동으로 보안 암호를 교체하도록 구성할 수 있습니다. 따라서 단기 보안 암호로 장기 보안 암호를 교체할 수 있어 손상 위험이 크게 줄어듭니다. 자세한 내용은 *AWS Secrets Manager 사용 설명서*에서 [AWS Secrets Manager 보안 암호 교체](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)를 참조하세요.

Amazon EMR Serverless는와 통합되어 Secrets Manager에 데이터를 저장하고 구성에서 보안 암호 ID를 사용할 AWS Secrets Manager 수 있습니다.

## EMR Serverless에서 보안 암호를 사용하는 방법
<a name="secrets-manager-how"></a>

Secrets Manager에 데이터를 저장하고 EMR Serverless에 대한 구성에서 보안 암호 ID를 사용하는 경우 민감한 구성 데이터를 일반 텍스트로 EMR Serverless에 전달하지 않고 외부 API에 노출하지 않습니다. 키-값 페어가 Secrets Manager에 저장한 보안 암호의 보안 암호 ID를 포함함을 나타내는 경우 EMR Serverless는 작업을 실행하기 위해 작업자로 구성 데이터를 전송할 때 보안 암호를 검색합니다.

구성의 키-값 페어가 Secrets Manager에 저장된 보안 암호에 대한 참조를 포함함을 나타내려면 구성 값에 `EMR.secret@` 주석을 추가합니다. 보안 암호 ID 주석이 있는 구성 속성의 경우 EMR Serverless는 Secrets Manager를 직접 호출하고 작업 실행 시 보안 암호를 확인합니다.

## 보안 암호 생성 방법
<a name="secrets-manager-create"></a>

보안 암호를 생성하려면 *AWS Secrets Manager 사용 설명서*의 [AWS Secrets Manager 보안 암호 생성](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html) 단계를 따르세요. **3단계**에서 **일반 텍스트** 필드를 선택하여 민감한 값을 입력합니다.

## 구성 분류에서 보안 암호 제공
<a name="secrets-manager-examples"></a>

다음 예제에서는 `StartJobRun`의 구성 분류에서 보안 암호을 제공하는 방법을 보여줍니다. 애플리케이션 수준에서 Secrets Manager에 대한 분류를 구성하려면 [EMR Serverless에 대한 기본 애플리케이션 구성](default-configs.md) 섹션을 참조하세요.

예제에서 `{{SecretName}}`을 검색할 보안 암호의 이름으로 바꿉니다. 자세한 정보는 [보안 암호 생성 방법](#secrets-manager-create) 섹션을 참조하세요.

**Topics**
+ [보안 암호 참조 지정 - Spark](#secrets-manager-examples-spark)
+ [보안 암호 참조 지정 - Hive](#secrets-manager-examples-hive)

### 보안 암호 참조 지정 - Spark
<a name="secrets-manager-examples-spark"></a>

**Example - Spark에 대한 외부 Hive 메타스토어 구성에서 보안 암호 참조 지정**  

```
aws emr-serverless start-job-run \
  --application-id "{{application-id}}" \
  --execution-role-arn "{{job-role-arn}}" \
  --job-driver '{
        "sparkSubmit": {
            "entryPoint": "s3://{{amzn-s3-demo-bucket}}/scripts/spark-jdbc.py",
            "sparkSubmitParameters": "--jars s3://{{amzn-s3-demo-bucket}}/mariadb-connector-java.jar 
            --conf spark.hadoop.javax.jdo.option.ConnectionDriverName=org.mariadb.jdbc.Driver 
            --conf spark.hadoop.javax.jdo.option.ConnectionUserName={{connection-user-name}} 
            --conf spark.hadoop.javax.jdo.option.ConnectionPassword=EMR.secret@{{SecretName}}
            --conf spark.hadoop.javax.jdo.option.ConnectionURL=jdbc:mysql://{{db-host:db-port/db-name}} 
            --conf spark.driver.cores=2
            --conf spark.executor.memory=10G 
            --conf spark.driver.memory=6G 
            --conf spark.executor.cores=4"
        }
    }' \
    --configuration-overrides '{
        "monitoringConfiguration": {
        "s3MonitoringConfiguration": {
            "logUri": "s3://{{amzn-s3-demo-bucket}}/spark/logs/"
        }
    }
}'
```

**Example - `spark-defaults` 분류에서 외부 Hive 메타스토어 구성에 대한 보안 암호 참조 지정**  

```
{
        "classification": "spark-defaults",
        "properties": {
            "spark.hadoop.javax.jdo.option.ConnectionDriverName":"org.mariadb.jdbc.Driver"
            "spark.hadoop.javax.jdo.option.ConnectionURL":"jdbc:mysql://{{db-host:db-port/db-name}}"
            "spark.hadoop.javax.jdo.option.ConnectionUserName":"{{connection-user-name}}"  
            "spark.hadoop.javax.jdo.option.ConnectionPassword": "EMR.secret@{{SecretName}}",
        }
    }
```

### 보안 암호 참조 지정 - Hive
<a name="secrets-manager-examples-hive"></a>

**Example - Hive에 대한 외부 Hive 메타스토어 구성에서 보안 암호 참조 지정**  

```
aws emr-serverless start-job-run \
  --application-id "{{application-id}}" \
  --execution-role-arn "{{job-role-arn}}" \
    --job-driver '{
        "hive": {
        "query": "s3://{{amzn-s3-demo-bucket}}/emr-serverless-hive/query/hive-query.ql",
        "parameters": "--hiveconf hive.exec.scratchdir=s3://{{amzn-s3-demo-bucket}}/emr-serverless-hive/hive/scratch 
                    --hiveconf hive.metastore.warehouse.dir=s3://{{amzn-s3-demo-bucket}}/emr-serverless-hive/hive/warehouse  
                    --hiveconf javax.jdo.option.ConnectionUserName={{username}}
                    --hiveconf javax.jdo.option.ConnectionPassword=EMR.secret@{{SecretName}} 
                    --hiveconf hive.metastore.client.factory.class=org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientFactory 
                    --hiveconf javax.jdo.option.ConnectionDriverName=org.mariadb.jdbc.Driver 
                    --hiveconf javax.jdo.option.ConnectionURL=jdbc:mysql://{{db-host:db-port/db-name}}"
        }
    }' \
    --configuration-overrides '{
        "monitoringConfiguration": {
        "s3MonitoringConfiguration": {
            "logUri": "s3://{{amzn-s3-demo-bucket}}"
        }
    }
}'
```

**Example - `hive-site` 분류에서 외부 Hive 메타스토어 구성에 대한 보안 암호 참조 지정**  

```
{
    "classification": "hive-site",
    "properties": {
        "hive.metastore.client.factory.class": "org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClientFactory",
        "javax.jdo.option.ConnectionDriverName": "org.mariadb.jdbc.Driver",
        "javax.jdo.option.ConnectionURL": "jdbc:mysql://{{db-host:db-port/db-name}}",
        "javax.jdo.option.ConnectionUserName": "username",
        "javax.jdo.option.ConnectionPassword": "EMR.secret@{{SecretName}}"
    }
}
```

## EMR Serverless에서 보안 암호를 검색할 액세스 권한 부여
<a name="secrets-manager-permission"></a>

EMR Serverless가 Secrets Manager로부터 보안 암호 값을 검색할 수 있도록 하려면 생성 시 보안 암호에 다음 정책 명령문을 추가합니다. EMR Serverless가 보안 암호 값을 읽으려면 고객 관리형 KMS 키를 사용하여 보안 암호를 생성해야 합니다. 자세한 내용은 *AWS Secrets Manager 사용 설명서*의 [KMS 키에 대한 권한](https://docs.aws.amazon.com/secretsmanager/latest/userguide/security-encryption.html#security-encryption-authz)을 참조하세요.

다음 정책에서 `{{applicationId}}`를 애플리케이션의 ID로 바꿉니다.

**보안 암호에 대한 리소스 정책**

EMR Serverless에서 보안 암호 값을 검색할 수 있도록 AWS Secrets Manager 에서 보안 암호에 대한 리소스 정책에 다음 권한을 포함해야 합니다. 특정 애플리케이션만 이 보안 암호를 검색할 수 있도록 하려면 선택적으로 정책의 조건으로 EMR Serverless 애플리케이션 ID를 지정할 수 있습니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowSECRETSMANAGERGetsecretvalue",
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "emr-serverless.amazonaws.com"
        ]
      },
      "Action": [
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:SourceArn": "arn:aws:emr-serverless:*:123456789012:/applications/*"
        }
      }
    }
  ]
}
```

------

고객 관리형 AWS Key Management Service (AWS KMS) 키에 대해 다음 정책을 사용하여 보안 암호를 생성합니다.

**고객 관리형 AWS KMS 키에 대한 정책**

```
{
    "Sid": "Allow EMR Serverless to use the key for decrypting secrets",
    "Effect": "Allow",
    "Principal": {
        "Service": [
            "emr-serverless.amazonaws.com"
        ]
    },
    "Action": [
        "kms:Decrypt",
        "kms:DescribeKey"
    ],
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "kms:ViaService": "secretsmanager.{{AWS 리전}}.amazonaws.com"
        }
    }
}
```

## 보안 암호 교체
<a name="secrets-manager-rotate"></a>

*교체*는 보안 암호를 주기적으로 업데이트하는 것입니다. 사용자가 지정한 일정에 따라 자동으로 보안 암호를 교체하도록 AWS Secrets Manager 를 구성할 수 있습니다. 그러면 장기 보안 암호를 단기 보안 암호로 교체할 수 있습니다. 이를 통해 침해 위험을 줄일 수 있습니다. EMR Serverless는 작업이 실행 중 상태로 전환될 때 주석이 달린 구성에서 보안 암호 값을 검색합니다. 사용자 또는 프로세스가 Secrets Manager에서 보안 암호 값을 업데이트하는 경우 작업이 업데이트된 값을 가져올 수 있도록 새 작업을 제출해야 합니다.

**참고**  
이미 실행 중 상태인 작업은 업데이트된 보안 암호 값을 가져올 수 없습니다. 이로 인해 작업이 실패할 수 있습니다.