Amazon EMR
管理指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

创建安全配置

本主题介绍使用 EMR 控制台和 AWS CLI 创建安全配置的一般过程,并介绍有关加密、身份验证和 EMRFS 的 IAM 角色的参数的参考信息。有关这些功能的更多信息,请参阅以下主题:

使用控制台创建安全配置

  1. Open the Amazon EMR console at https://console.amazonaws.cn/elasticmapreduce/.

  2. 在导航窗格中,选择 Security ConfigurationsCreate security configuration

  3. 键入安全配置的 Name

  4. 按照以下部分中所述选择 EncryptionAuthentication 的选项,然后选择 Create

使用 AWS CLI 创建安全配置

  1. 按照以下语法使用 create-security-configuration 命令:

    aws emr create-security-configuration --name "SecConfigName" --security-configuration SecConfigDef

    对于 SecConfigName,指定安全配置的名称。这是您在创建使用此安全配置的集群时指定的名称。

  2. 对于 SecConfigDef,指定内联 JSON 结构或 Amazon S3 中的 JSON 文件的路径 (如 s3://mybucket/MySecConfig.json) 或本地文件 (如 file://MySecConfig.json)。JSON 参数定义 Encryption (加密)、IAM Roles for EMRFS access to Amazon S3 (用于处理 EMRFS 对 Amazon S3 的访问的 IAM 角色) 和 Authentication (身份验证) 的选项,如下面几节所述。

配置数据加密

在配置安全配置中的加密之前,创建用于加密的密钥和证书。有关更多信息,请参阅 通过 Amazon EMR 提供静态数据加密密钥通过 Amazon EMR 加密为传输中的数据加密提供证书

在创建安全配置时,需要指定两组加密选项:静态数据加密和传输中数据加密。静态数据加密选项包括带有 EMRFS 的 Amazon S3 和本地磁盘加密。传输中加密选项为支持传输层安全性 (TLS) 的某些应用程序启用开源加密功能。静态选项和传输中选项可以同时启用或分别启用。有关更多信息,请参阅 加密传输中的数据和静态数据

使用控制台指定加密选项

根据以下准则选择 Encryption 下的选项。

  • 选择 At rest encryption 以加密存储在文件系统中的数据。这样做还将支持 Hadoop 分布式文件系统 (HDFS) 块传输加密和 RPC 加密,无需其他配置。

  • S3 data encryption 下,为 Encryption mode 选择一个值以确定 Amazon EMR 如何使用 EMRFS 加密 Amazon S3 数据。

    下一步取决于所选的加密模式:

  • Local disk encryption 下,为 Key provider type 选择一个值。Amazon EMR 会将此密钥用于挂载到您的集群节点的本地卷 (启动卷除外) 的 Linux Unified Key System (LUKS) 加密。

    • AWS KMS

      选择此选项可指定 AWS KMS 客户主密钥 (CMK)。对于 AWS KMS Key,选择一个密钥。该密钥必须与您的 Amazon EMR 集群同在一个区域中。有关密钥要求的更多信息,请参阅使用 AWS KMS 客户主密钥 (CMK) 进行加密

    • 自定义

      选择此选项可指定自定义密钥提供商。对于 S3 object,输入您的自定义密钥提供商 JAR 文件在 Amazon S3 中的位置或 Amazon S3 ARN。对于 Key provider class,输入在实现 EncryptionMaterialsProvider 接口的应用程序中声明的类的完整类名。这里提供的类名必需与为 CSE-Custom 提供的类名不同。

  • 选择 In-transit encryption 为传输中的数据启用开源 TLS 加密功能。根据以下指南选择 Certificate provider type

    • PEM

      选择此选项将使用您在 zip 文件中提供的 PEM 文件。zip 文件中需要有两个项目:privateKey.pem 和 certificateChain.pem。第三个文件 trustedCertificates.pem 是可选文件。有关更多信息,请参阅 通过 Amazon EMR 加密为传输中的数据加密提供证书。对于 S3 object,指定 zip 文件字段在 Amazon S3 中的位置或 Amazon S3 ARN。

    • 自定义

      选择此选项可指定一个自定义证书提供商,然后在 S3 object 中输入您的自定义证书提供商 JAR 文件在 Amazon S3 中的位置或 Amazon S3 ARN。对于 Key provider class,输入在实现 TLSArtifactsProvider 接口的应用程序中声明的类的完整类名。

使用 AWS CLI 指定加密选项

下面几节使用示例方案,说明对不同配置和密钥提供商的正确 --security-configuration JSON 格式,再提供 JSON 参数和相应值的参考信息。

传输中数据加密选项示例

下面的示例将说明以下情景:

aws emr create-security-configuration --name "MySecConfig" --security-configuration '{ "EncryptionConfiguration": { "EnableInTransitEncryption" : true, "EnableAtRestEncryption" : false, "InTransitEncryptionConfiguration" : { "TLSCertificateConfiguration" : { "CertificateProviderType" : "PEM", "S3Object" : "s3://MyConfigStore/artifacts/MyCerts.zip" } } } }'

下面的示例将说明以下情景:

aws emr create-security-configuration --name "MySecConfig" --security-configuration '{ "EncryptionConfiguration": { "EnableInTransitEncryption" : true, "EnableAtRestEncryption" : false, "InTransitEncryptionConfiguration" : { "TLSCertificateConfiguration" : { "CertificateProviderType" : "Custom", "S3Object" : "s3://MyConfig/artifacts/MyCerts.jar", "CertificateProviderClass" : "com.mycompany.MyCertProvider" } } } }'

静态数据加密选项示例

下面的示例将说明以下情景:

  • 传输中的数据加密已禁用,静态数据加密已启用

  • SSE-S3 已用于 Amazon S3 加密

  • 本地磁盘加密使用 AWS KMS 作为密钥提供商

aws emr create-security-configuration --name "MySecConfig" --security-configuration '{ "EncryptionConfiguration": { "EnableInTransitEncryption" : false, "EnableAtRestEncryption" : true, "AtRestEncryptionConfiguration" : { "S3EncryptionConfiguration" : { "EncryptionMode" : "SSE-S3" }, "LocalDiskEncryptionConfiguration" : { "EncryptionKeyProviderType" : "AwsKms", "AwsKmsKey" : "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012" } } } }'

下面的示例将说明以下情景:

  • 传输中的数据加密已启用且使用 ARN 引用了 Amazon S3 中包含 PEM 证书的 ZIP 文件

  • SSE-KMS 已用于 Amazon S3 加密

  • 本地磁盘加密使用 AWS KMS 作为密钥提供商

aws emr create-security-configuration --name "MySecConfig" --security-configuration '{ "EncryptionConfiguration": { "EnableInTransitEncryption" : true, "EnableAtRestEncryption" : true, "InTransitEncryptionConfiguration" : { "TLSCertificateConfiguration" : { "CertificateProviderType" : "PEM", "S3Object" : "arn:aws:s3:::MyConfigStore/artifacts/MyCerts.zip" } }, "AtRestEncryptionConfiguration" : { "S3EncryptionConfiguration" : { "EncryptionMode" : "SSE-KMS", "AwsKmsKey" : "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012" }, "LocalDiskEncryptionConfiguration" : { "EncryptionKeyProviderType" : "AwsKms", "AwsKmsKey" : "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012" } } } }'

下面的示例将说明以下情景:

  • 传输中的数据加密已禁用且引用了 Amazon S3 中包含 PEM 证书的 ZIP 文件

  • CSE-KMS 已用于 Amazon S3 加密

  • 本地磁盘加密使用了某个 ARN 引用的自定义密钥提供商

aws emr create-security-configuration --name "MySecConfig" --security-configuration '{ "EncryptionConfiguration": { "EnableInTransitEncryption" : true, "EnableAtRestEncryption" : true, "InTransitEncryptionConfiguration" : { "TLSCertificateConfiguration" : { "CertificateProviderType" : "PEM", "S3Object" : "s3://MyConfigStore/artifacts/MyCerts.zip" } }, "AtRestEncryptionConfiguration" : { "S3EncryptionConfiguration" : { "EncryptionMode" : "CSE-KMS", "AwsKmsKey" : "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012" }, "LocalDiskEncryptionConfiguration" : { "EncryptionKeyProviderType" : "Custom", "S3Object" : "arn:aws:s3:::artifacts/MyKeyProvider.jar", "EncryptionKeyProviderClass" : "com.mycompany.MyKeyProvider.jar" } } } }'

下面的示例将说明以下情景:

  • 利用自定义密钥提供商启用了传输中的数据加密

  • CSE-Custom 已用于 Amazon S3 数据

  • 本地磁盘加密使用了自定义密钥提供商

aws emr create-security-configuration --name "MySecConfig" --security-configuration '{ "EncryptionConfiguration": { "EnableInTransitEncryption" : "true", "EnableAtRestEncryption" : "true", "InTransitEncryptionConfiguration" : { "TLSCertificateConfiguration" : { "CertificateProviderType" : "Custom", "S3Object" : "s3://MyConfig/artifacts/MyCerts.jar", "CertificateProviderClass" : "com.mycompany.MyCertProvider" } }, "AtRestEncryptionConfiguration" : { "S3EncryptionConfiguration" : { "EncryptionMode" : "CSE-Custom", "S3Object" : "s3://MyConfig/artifacts/MyCerts.jar", "EncryptionKeyProviderClass" : "com.mycompany.MyKeyProvider" }, "LocalDiskEncryptionConfiguration" : { "EncryptionKeyProviderType" : "Custom", "S3Object" : "s3://MyConfig/artifacts/MyCerts.jar", "EncryptionKeyProviderClass" : "com.mycompany.MyKeyProvider" } } } }'

加密设置的 JSON 引用

下表列出了用于加密设置的 JSON 参数并提供了每个参数的可接受值描述。

参数 说明
"EnableInTransitEncryption" : true | false 指定 true 可启用传输中加密,指定 false 则禁用。如果省略,则假定是 false,传输中加密禁用。
"EnableAtRestEncryption" : true | false 指定 true 可启用静态加密,指定 false 则禁用。如果省略,则假定是 false,静态加密禁用。
传输中加密参数
"InTransitEncryptionConfiguration" : 指定当 EnableInTransitEncryptiontrue 时用于配置传输中加密的值的集合。
"CertificateProviderType" : "PEM" | "Custom" 指定是使用通过压缩文件引用的 PEM 证书还是使用 Custom 证书提供商。如果指定 PEM,则 S3Object 必须是对包含证书的 zip 文件在 Amazon S3 中的位置的引用。如果指定“Custom”,则 S3Object 必须是对 JAR 文件在 Amazon S3 中的位置的引用,后跟一个 CertificateProviderClass 条目。
"S3Object" : "ZipLocation" | "JarLocation" 如果指定 PEM,则提供 zip 文件在 Amazon S3 中的位置,如果指定 Custom,则提供 JAR 文件的位置。格式可以是路径 (例如,s3://MyConfig/articfacts/CertFiles.zip) 或 ARN (例如,arn:aws:s3:::Code/MyCertProvider.jar)。如果指定 zip 文件,则其中必须包含名为 privateKey.pemcertificateChain.pem 的文件。名为 trustedCertificates.pem 的文件是可选的。
"CertificateProviderClass" : "MyClassID" 仅当为 CertificateProviderType 指定了 Custom 时才是必需的。MyClassID 指定在实现 TLSArtifactsProvider 接口的 JAR 文件中声明的完整类名。例如:com.mycompany.MyCertProvider
静态加密参数
"AtRestEncryptionConfiguration" : 指定当 EnableAtRestEncryptiontrue 时用于配置静态加密 (包括 Amazon S3 加密和本地磁盘加密) 的值的集合。
Amazon S3 加密参数
"S3EncryptionConfiguration" : 指定用于 EMR 文件系统 (EMRFS) Amazon S3 加密的值的集合。
"EncryptionMode" : "SSE-S3" | "SSE-KMS" | "CSE-KMS" | "CSE-Custom" 指定要使用的 Amazon S3 加密类型。如果指定 SSE-S3,则无需再提供 Amazon S3 加密值。如果指定 SSE-KMSCSE-KMS ,则必需指定 AWS KMS 客户主密钥 (CMK) ARN 作为 AwsKmsKey 值。如果指定 CSE-Custom,则必需指定 S3ObjectEncryptionKeyProviderClass 值。
"AwsKmsKey" : "MyKeyARN" 仅当为 EncryptionMode 指定 SSE-KMSCSE-KMS 时才是必需的。MyKeyARN 必须是密钥的完全指定 ARN (例如,arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012)。
"S3Object" : "JarLocation" 仅当为 CertificateProviderType 指定 CSE-Custom 时才是必需的。JarLocation 提供 JAR 文件在 Amazon S3 中的位置。格式可以是路径 (例如,s3://MyConfig/articfacts/MyKeyProvider.jar) 或 ARN (例如,arn:aws:s3:::Code/MyKeyProvider.jar)
"EncryptionKeyProviderClass" : "MyS3KeyClassID" 仅当为 EncryptionMode 指定 CSE-Custom 时才是必需的。MyS3KeyClassID 指定在实现 EncryptionMaterialsProvider 接口的应用程序中声明的类的完整类名,例如,com.mycompany.MyS3KeyProvider
本地磁盘加密参数
"LocalDiskEncryptionKeyProvider" 指定要用于本地磁盘加密的密钥提供商和相应的值。
"Type" : "AwsKms" | "Custom" 指定密钥提供商。如果指定 AwsKms,则必须指定 AWS KMS CMK ARN 作为 AwsKmsKey 值。如果指定 Custom,则必须指定 S3ObjectEncryptionKeyProviderClass 值。
"AwsKmsKey : "MyKeyARN" 仅当为 Type 指定 AwsKms 时才是必需的。MyKeyARN 必须是密钥的完全指定 ARN (例如, arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-456789012123)。
"S3Object" : "JarLocation" 仅当为 CertificateProviderType 指定 CSE-Custom 时才是必需的。JarLocation 提供 JAR 文件在 Amazon S3 中的位置。格式可以是路径 (例如,s3://MyConfig/articfacts/MyKeyProvider.jar) 或 ARN (例如,arn:aws:s3:::Code/MyKeyProvider.jar)

"EncryptionKeyProviderClass" : "MyLocalDiskKeyClassID"

仅当为 Type 指定 Custom 时才是必需的。MyLocalDiskKeyClassID 指定在实现 EncryptionMaterialsProvider 接口的应用程序中声明的类的完整类名,例如,com.mycompany.MyLocalDiskKeyProvider

配置 Kerberos 身份验证

包含 Kerberos 设置的安全配置只能由使用 Kerberos 属性创建的集群使用,否则会发生错误。有关更多信息,请参阅 配置 Kerberos。仅在 Amazon EMR 发布版 5.10.0 及更高版本中提供了 Kerberos。

使用控制台指定 Kerberos 设置

根据以下准则选择 Kerberos authentication 下的选项。

参数 说明

启用 Kerberos

指定对使用此安全配置的群集启用 Kerberos。如果群集使用此安全配置,则群集还必须指定 Kerberos 设置,否则会发生错误。

票证使用期限

指定由群集专用的 KDC 颁发的 Kerberos 票证有效的期间。出于安全考虑,限制票证生命周期。群集应用程序和服务在过期后自动续订票证。使用 Kerberos 凭证通过 SSH 连接到群集的用户在票证过期后需要从主节点命令行运行 kinit 来续订。

跨领域信任

如果您提供了跨领域信任配置,则来自另一个领域的委托人 (通常是用户) 将对使用此配置的群集进行身份验证。还需要其他 Kerberos 领域中的其他配置。有关更多信息,请参阅 配置跨领域信任

领域

指定信任关系中其他领域的 Kerberos 领域名称。可以使用任何字符串,但按照惯例,这通常与域相同,但全部为大写字母。

指定信任关系中其他领域的域名。

管理服务器

指定信任关系的其他领域中的管理服务器的完全限定域名 (FQDN)。管理服务器和 KDC 服务器通常运行在具有相同 FQDN 的同一台计算机上,但通过不同的端口进行通信。如果未指定端口,则使用端口 749,这是 Kerberos 默认值。另外,您还可以指定端口 (例如,domain.example.com:749)。

KDC 服务器

指定信任关系的其他领域中的 KDC 服务器的完全限定域名 (FQDN)。KDC 服务器和管理服务器通常运行在具有相同 FQDN 的同一台计算机上,但通过不同的端口进行通信。如果未指定端口,则使用端口 88,这是 Kerberos 默认值。另外,您还可以指定端口 (例如,domain.example.com:88)。

使用 AWS CLI 指定 Kerberos 设置

以下示例说明 Kerberos 配置的 JSON 参数,并提供参数和值的参考信息。

{ "AuthenticationConfiguration": { "KerberosConfiguration": { "Provider": "ClusterDedicatedKdc", "ClusterDedicatedKdcConfiguration": { "TicketLifeTimeInHours": number, "CrossRealmTrustConfiguration": { "Realm": "DOMAIN.EXAMPLE.COM", "Domain": "domain.example.com", "AdminServer": "domain.example.com", "KdcServer": "domain.example.com" } } } } }
参数 说明
"AuthenticationConfiguration" : 必需。包含 Kerberos 配置参数。
"KerberosConfiguration" : 必需。包含 Kerberos 配置参数。
"Provider": "ClusterDedicatedKdc" 必需。指定在主节点上创建集群专用的 KDC。
"ClusterDedicatedKdcConfiguration" 必需。包含主节点上集群专用的 KDC 的配置参数。
"TicketLifeTimeInHours": number 可选。如果省略,默认为 24。指定由群集专用的 KDC 颁发的 Kerberos 票证有效的期间。出于安全考虑,限制票证生命周期。群集应用程序和服务在过期后自动续订票证。使用 Kerberos 凭证通过 SSH 连接到群集的用户在票证过期后需要从主节点命令行运行 kinit 来续订。
"CrossRealmTrustConfiguration": 可选。包含定义跨领域信任配置的参数。如果您提供了跨领域信任配置,则来自另一个领域的委托人 (通常是用户) 将对使用此配置的群集进行身份验证。还需要其他 Kerberos 领域中的其他配置。有关更多信息,请参阅 配置跨领域信任
"Realm": "DOMAIN.EXAMPLE.COM" 指定信任关系中其他领域的 Kerberos 领域名称。可以使用任何字符串,但按照惯例,这通常与域相同,但全部为大写字母。
"Domain": "domain.example.com"

指定信任关系中其他领域的域名。

"AdminServer": "domain.example.com" 指定信任关系的其他领域中的管理服务器的完全限定域名 (FQDN)。管理服务器和 KDC 服务器通常运行在具有相同 FQDN 的同一台计算机上,但通过不同的端口进行通信。如果未指定端口,则使用端口 749,这是 Kerberos 默认值。另外,您还可以指定端口 (例如,domain.example.com:749)。
"KdcServer": "domain.example.com" 指定信任关系的其他领域中的 KDC 服务器的完全限定域名 (FQDN)。KDC 服务器和管理服务器通常运行在具有相同 FQDN 的同一台计算机上,但通过不同的端口进行通信。如果未指定端口,则使用端口 88,这是 Kerberos 默认值。另外,您还可以指定端口 (例如,domain.example.com:88)。

为处理 EMRFS 对 Amazon S3 的请求配置 IAM 角色

EMRFS 的 IAM 角色让您能够为 Amazon S3 中的 EMRFS 数据提供不同权限。您可以创建角色映射,来指定在访问请求包含您指定的标识符时用来获得权限的 IAM 角色。标识符可以是 Hadoop 用户或角色,或 Amazon S3 前缀。

有关更多信息,请参阅 为处理 EMRFS 对 Amazon S3 的请求配置 IAM 角色

使用 AWS CLI 指定 EMRFS 的 IAM 角色

下面是在安全配置中为 EMRFS 指定自定义 IAM 角色的 JSON 代码段示例。它演示三个不同标识符类型的角色映射,后跟参数引用。

{ "AuthorizationConfiguration": { "EmrFsConfiguration": { "RoleMappings": [{ "Role": "arn:aws:iam::123456789101:role/allow_EMRFS_access_for_user1", "IdentifierType": "User", "Identifiers": [ "user1" ] },{ "Role": "arn:aws:iam::123456789101:role/allow_EMRFS_access_to_MyBuckets", "IdentifierType": "Prefix", "Identifiers": [ "s3://MyBucket/","s3://MyOtherBucket/" ] },{ "Role": "arn:aws:iam::123456789101:role/allow_EMRFS_access_for_AdminGroup", "IdentifierType": "Group", "Identifiers": [ "AdminGroup" ] }] } } }
参数 说明

"AuthorizationConfiguration":

必需。

"EmrFsConfiguration":

必需。包含角色映射。

  "RoleMappings":

必需。包含一个或多个角色映射定义。角色映射按它们出现的自上而下顺序进行计算。如果针对 Amazon S3 中的数据发出 EMRFS 调用时,某个角色映射的评估结果为 true,则不会评估其他角色映射,并且 EMRFS 将对该请求使用指定的 IAM 角色。角色映射包括以下必需参数:

   "Role":

arn:aws:iam::account-id:role/role-name 格式指定 IAM 角色的 ARN 标识符。这是在对 Amazon S3 的 EMRFS 请求与任何指定的 Identifiers 匹配时 Amazon EMR 会采用的 IAM 角色。

   "IdentifierType":

可以是以下值之一:

  • "User" 指定标识符是一个或多个可以是 Linux 账户用户或 Kerberos 委托人的 Hadoop 用户。当 EMRFS 请求源自指定的一个或多个用户时,将会采用 IAM 角色。

  • "Prefix" 指定标识符是 Amazon S3 位置。对于对具有指定前缀的一个或多个位置的调用,将会采用 IAM 角色。例如,前缀 s3://mybucket/ s3://mybucket/mydir s3://mybucket/yetanotherdir 匹配。

  • "Group" 指定标识符是一个或多个 Hadoop 组。如果请求源自一个或多个指定组中的用户,将会采用 IAM 角色。

   "Identifiers":

指定相应标识符类型的一个或多个标识符。用逗号分隔多个标识符,不带空格。