Dataproc 安全配置

创建 Dataproc 集群时,您可以通过 Kerberos 启用 Hadoop 安全模式,以通过 Dataproc 集群内的用户身份验证、隔离和加密提供多租户。

用户身份验证和其他 Google Cloud Platform 服务。 通过 Kerberos 对用户进行身份验证仅适用于集群。 与其他 Google Cloud 服务(如 Cloud Storage)的交互将继续作为集群的服务账号进行身份验证。

通过 Kerberos 启用 Hadoop 安全模式

为集群启用 Kerberos 和 Hadoop 安全模式将包含 MIT Kerberos 分发功能,并将 Apache Hadoop YARNHDFSHiveSpark 及相关组件配置为使用它来执行身份验证。

启用 Kerberos 将创建集群上的密钥分发中心 (KDC),而 KDC 由服务主账号和 root 主账号组成。root 主账号是具有集群上 KDC 的管理员权限的账号。它也可以包含标准用户主账号,或通过跨域信任连接至另一包含用户主账号的 KDC。

创建 Kerberos 集群

您可以使用 Google Cloud CLI、Dataproc API 或 Google Cloud 控制台在使用 Dataproc 映像版本 1.3 及更高版本的集群上启用 Kerberos。

gcloud 命令

如需自动配置新的 Kerberos Dataproc 集群(映像版本 1.3 及更高版本),请使用 gcloud dataproc clusters create 命令。

gcloud dataproc clusters create cluster-name \
    --image-version=2.0 \
    --enable-kerberos

集群属性:您可以通过将 --properties "dataproc:kerberos.beta.automatic-config.enable=true" 标志传递给 clusters create 命令来自动配置 Kerberos,而不是使用上述 --enable-kerberos 标志(请参阅 Dataproc 服务属性)。

REST API

可以通过作为 clusters.create 请求一部分的 ClusterConfig.SecurityConfig.KerberosConfig 创建 Kerberos 集群。您必须将 enableKerberos 设置为 true

控制台

您可以在 Google Cloud 控制台的 Dataproc 创建集群页面上,从“管理安全”面板的“Kerberos 和 Hadoop 安全模式”部分中选择“启用”,从而在新集群上自动配置 Kerberos。

创建使用您自己的 root 主账号密码的 Kerberos 集群

按照以下步骤设置使用 root 主账号密码的 Kerberos 集群。

设置您的 Kerberos root 主账号密码

Kerberos Root 主账号是具有集群上 KDC 的管理员权限的账号。要安全地为 Kerberos Root 主账号提供密码,用户可以使用密钥管理服务 (KMS) 密钥对密码进行加密,然后存储在集群服务账号有权访问的 Google Cloud Storage 存储桶。集群服务账号必须拥有 cloudkms.cryptoKeyDecrypter IAM 角色

  1. 将 Cloud KMS CryptoKey Encrypter/Decrypter 角色授予集群服务账号

    gcloud projects add-iam-policy-binding project-id \
        --member serviceAccount:project-number-compute@developer.gserviceaccount.com \
        --role roles/cloudkms.cryptoKeyDecrypter
    

  2. 创建密钥环:

    gcloud kms keyrings create my-keyring --location global
    

  3. 在密钥环中创建密钥:

    gcloud kms keys create my-key \
        --location global \
        --keyring my-keyring \
        --purpose encryption
    

  4. 加密 Kerberos root 主账号密码:

    echo "my-password" | \
      gcloud kms encrypt \
        --location=global \
        --keyring=my-keyring \
        --key=my-key \
        --plaintext-file=- \
        --ciphertext-file=kerberos-root-principal-password.encrypted
    

    1. 将加密密码上传到项目中的 Cloud Storage 存储桶
      1. 示例
        gsutil cp kerberos-root-principal-password.encrypted gs://my-bucket
        

创建集群

您可以使用 gcloud 命令或 Dataproc API 在使用您自己的 root 主账号密码的集群上启用 Kerberos。

gcloud 命令

如需创建 kerberos Dataproc 集群(映像版本 1.3 及更高版本),请使用 gcloud dataproc clusters create 命令。

gcloud dataproc clusters create cluster-name \
    --region=region \
    --image-version=2.0 \
    --kerberos-root-principal-password-uri=gs://my-bucket/kerberos-root-principal-password.encrypted \
    --kerberos-kms-key=projects/project-id/locations/global/keyRings/my-keyring/cryptoKeys/my-key

使用 YAML(或 JSON)配置文件。您可以将 Kerberos 设置放入 YAML(或 JSON)配置文件中,然后引用配置文件以创建 Kerberos 集群,而不是如上所示将 kerberos-* 标志传递给 gcloud 命令。

  1. 创建配置文件(请参阅 SSL 证书其他 Kerberos 设置跨域信任,了解可包含在文件中的其他配置设置):
    root_principal_password_uri: gs://my-bucket/kerberos-root-principal-password.encrypted
    kms_key_uri: projects/project-id/locations/global/keyRings/mykeyring/cryptoKeys/my-key
    
  2. 使用以下 gcloud 命令创建 Kerberos 集群:
    gcloud dataproc clusters create cluster-name \
        --region=region \
        --kerberos-config-file=local path to config-file \
        --image-version=2.0
    

安全注意事项。在将 root 主账号添加到 KDC 之后,Dataproc 会删除解密形式的密码。出于安全考虑,在创建集群之后,您可以删除密码文件以及用来对密码进行解密的密钥,然后从 kmsKeyDecrypter 角色中移除服务账号。如果您计划将集群纵向扩容,则不要执行此操作,因为纵向扩容操作需要密码文件和密钥以及服务账号角色。

REST API

可以通过作为 clusters.create 请求一部分的 ClusterConfig.SecurityConfig.KerberosConfig 创建 Kerberos 集群。将 enableKerberos 设置为 true,并设置 rootPrincipalPasswordUrikmsKeyUri 字段。

控制台

在使用 1.3 及更高版本的映像创建集群时,在 Google Cloud 控制台的 Dataproc 创建集群页面上的“管理”安全面板中,选择“Kerberos 和 Hadoop 安全模式”部分中的“启用”,然后完成安全选项(将在接下来的部分中讨论)。

OS Login

通过 kadmin 命令使用 Kerberos root 用户主账号或 sudo kadmin.local 来执行集群上 KDC 管理。启用操作系统登录功能,以控制哪些用户可以运行超级用户命令。

SSL 证书

在启用 Hadoop 安全模式时,Dataproc 会创建一个自签名证书以启用集群 SSL 加密。作为替代方案,您可以提供进行集群 SSL 加密的证书,方法是在创建 kerberos 集群时将以下设置添加到配置文件

  • ssl:keystore_password_uri:包含密钥库文件密码的 KMS 加密文件在 Cloud Storage 中的位置。
  • ssl:key_password_uri:包含密钥库文件中密钥的密码的 KMS 加密文件在 Cloud Storage 中的位置。
  • ssl:keystore_uri:包含集群节点所使用的通配符证书和私钥的密钥库文件在 Cloud Storage 中的位置。
  • ssl:truststore_password_uri:包含信任库文件密码的 KMS 加密文件在 Cloud Storage 中的位置。
  • ssl:truststore_uri:包含受信证书的信任库文件在 Cloud Storage 中的位置。

配置文件示例:

root_principal_password_uri: gs://my-bucket/kerberos-root-principal-password.encrypted
kms_key_uri: projects/project-id/locations/global/keyRings/mykeyring/cryptoKeys/my-key
ssl:
  key_password_uri: gs://bucket/key_password.encrypted
  keystore_password_uri: gs://bucket/keystore_password.encrypted
  keystore_uri: gs://bucket/keystore.jks
  truststore_password_uri: gs://bucket/truststore_password.encrypted
  truststore_uri: gs://bucket/truststore.jks

其他 Kerberos 设置

如需指定 Kerberos 领域,请创建 Kerberos 集群,并在 Kerberos 的配置文件中添加以下属性:

  • realm:集群上的 Kerberos 大区的名称。

如果未设置此属性,则主机名的网域(以大写字母表示)将成为网域。

如需指定 KDC 数据库的主密钥,请创建 Kerberos 集群,并在 Kerberos 的配置文件中添加以下属性:

  • kdc_db_key_uri:包含 KDC 数据库主密钥的 KMS 加密文件在 Cloud Storage 中的位置。

如果未设置此属性,Dataproc 将生成主密钥。

如需指定票证授予票证的最长生存时间(以小时为单位),请创建一个 kberberos 集群,并在 Kerberos 的配置文件中添加以下属性:

  • tgt_lifetime_hours:票证授予票证的最长生存时间(以小时为单位)。

如果未设置此属性,Dataproc 会将票证授予票证的生存时间设置为 10 小时。

跨域信任

集群上的 KDC 最初只含 root 管理员主体和服务主体。您可以手动添加用户主体,或者与拥有用户主体的外部 KDC 或 Active Directory 服务器建立跨域信任。 建议使用 Cloud VPNCloud Interconnect 连接到内部部署的 KDC/Active Directory。

要创建支持跨域信任的 Kerberos 集群,请在创建 Kerberos 集群时将下面列出的设置添加到 Kerberos 配置文件。使用 KMS 加密共享密码,并将其存储在集群服务账号可以访问的 Cloud Storage 存储桶中。

  • cross_realm_trust:admin_server:远程管理服务器的主机名/地址。
  • cross_realm_trust:kdc:远程 KDC 的主机名/地址。
  • cross_realm_trust:realm:受信任的远程大区的名称。
  • cross_realm_trust:shared_password_uri:KMS 加密共享密码在 Cloud Storage 中的位置。

配置文件示例:

root_principal_password_uri: gs://my-bucket/kerberos-root-principal-password.encrypted
kms_key_uri: projects/project-id/locations/global/keyRings/mykeyring/cryptoKeys/my-key
cross_realm_trust:
  admin_server: admin.remote.realm
  kdc: kdc.remote.realm
  realm: REMOTE.REALM
  shared_password_uri: gs://bucket/shared_password.encrypted

要启用对远程 KDC 的跨域信任:

  1. 在远程 KDC 的 /etc/krb5.conf 文件中添加以下内容:

    [realms]
    DATAPROC.REALM = {
      kdc = MASTER-NAME-OR-ADDRESS
      admin_server = MASTER-NAME-OR-ADDRESS
    }
    

  2. 创建信任用户:

    kadmin -q "addprinc krbtgt/DATAPROC.REALM@REMOTE.REALM"
    

  3. 在出现提示时,输入用户密码。密码应与加密的共享密码文件的内容一致

要启用与 Active Directory 的跨域信任,请在 PowerShell 中以管理员身份运行以下命令:

  1. 在 Active Directory 中创建 KDC 定义。

    ksetup /addkdc DATAPROC.REALM DATAPROC-CLUSTER-MASTER-NAME-OR-ADDRESS
    

  2. 在 Active Directory 中创建信任。

    netdom trust DATAPROC.REALM /Domain AD.REALM /add /realm /passwordt:TRUST-PASSWORD
    
    密码应与加密的共享密码文件的内容一致。

dataproc 主账号

当您通过 Dataproc jobs API向 Dataproc Kerberos 集群提交作业时,它会从集群的 kerberos 领域作为 dataproc kerberos 主账号运行。

如果您向 Dataproc kerberos 集群直接提交作业(例如通过 SSH 进行提交),则该集群支持多租户。但是,如果作业对其他 Google Cloud 服务(例如 Cloud Storage)执行读写操作,则作业将充当集群的服务账号

默认和自定义的集群属性

Hadoop 安全模式使用配置文件中的属性进行配置。 Dataproc 将设置这些属性的默认值。

您可以通过以下方式替换默认属性:在创建集群时使用 gcloud dataproc clusters create --properties 标志,或者调用 clusters.create API 并设置 SoftwareConfig 属性(请参阅集群属性示例)。

高可用性模式

高可用性 (HA) 模式下,kerberos 集群将拥有 3 个 KDC:每个主节点一个。在“第一个”主节点 ($CLUSTER_NAME-m-0) 上运行的 KDC 将作为主 KDC,同时也充当管理服务器。主 KDC 的数据库将通过 Cron 作业每 5 分钟同步到两个副 KDC 一次,同时 3 个 KDC 还将提供读取流量。

如果主 KDC 关闭,Kerberos 本身不支持实时复制或自动故障切换。要执行手动故障切换:

  1. 在所有 KDC 机器的 /etc/krb5.conf 中,将 admin_server 更改为新的主 KDC 的 FQDN(完全限定域名)。从 KDC 列表中移除旧的主 KDC。
  2. 在新的主 KDC 上,设置一个 Cron 作业来传播数据库。
  3. 在新的主 KDC 上,重启 admin_server 进程 (krb5-admin-server)。
  4. 在所有 KDC 机器上,重启 KDC 进程 (krb5-kdc)。

网络配置

如需确保工作器节点能够与主实例上运行的 KDC 和 Kerberos 管理服务器通信,请验证 VPC 防火墙规则是否允许端口上的入站 TCP 和 UDP 流量主实例上的端口 749 上的 88 和入站 TCP 流量。在高可用性模式下,请确保 VPC 防火墙规则允许主实例的端口 754 上的入站 TCP 流量,从而允许传播对主实例 KDC 所做的更改。 Kerberos 需要正确设置反向 DNS。 此外,对于基于主机的服务主规范化,请确保为集群网络正确设置反向 DNS。

了解详情

请参阅 MIT Kerberos 文档