为服务配置 Kerberos

Kerberos 是一种网络身份验证协议,旨在通过使用 Secret 密钥加密为客户端/服务器应用提供强身份验证。它通常用于整个软件生态系统中的身份验证 Hadoop 堆栈。

Dataproc Metastore 通过客户托管的密钥分发中心 (KDC) 支持 Kerberos。支持 Kerberos 的 API 要求包括 keytab 文件、主帐号和 krb5.conf 文件。

本页面介绍如何为 Dataproc Metastore Hive Metastore 服务启用和配置 Kerberos。

准备工作

  • 如果要为 Hive Metastore 实例启用 Kerberos,您必须设置以下各项:

    • 您自己的托管式 Kerberos KDC。

      KDC 是发出 Kerberos 票据的应用。它负责在使用 Kerberos 时对用户进行身份验证。本页面介绍如何使用 Dataproc 提供的集群 KDC。

    • VPC 网络与 KDC 之间的 IP 连接,以执行初始身份验证。

    • KDC 上的防火墙规则,以允许来自 Dataproc Metastore 的流量。 另请参阅服务的防火墙规则

    • 包含 keytab 文件内容的 Secret Manager Secret。

      keytab 文件包含 Kerberos 主帐号和加密密钥对,可用于通过 Kerberos KDC 对服务主帐号进行身份验证。本页面介绍了如何使用 Dataproc 的集群 KDC 生成 keytab 文件,以及如何使用该文件来配置 Dataproc Metastore 服务。

      此 keytab 文件必须包含为 Hive Metastore 创建的服务主帐号的条目。提供的 Secret Manager 密文必须固定到特定的密文版本。系统不支持最新的版本。

    • KDC 和 keytab 文件中的主帐号。

      要启动 Hive Metastore,必须具有有效的 Kerberos keytab 文件和主帐号。KDC 和 keytab 中都存在该主帐号。主账号必须包含三个部分:primary/instance@REALM。不支持 _HOST 实例。

    • Cloud Storage 存储分区中的 krb5.conf 文件。

      有效的 krb5.conf 文件包含 Kerberos 配置信息,例如 KDC IP、端口和大区名称等用户输入。您必须指定 KDC IP,而不是 KDC FQDN。

      Dataproc Metastore 将整个 krb5.conf 视为 Cloud Storage 对象。在创建服务期间,您必须提供 Cloud Storage URI,用于指定 krb5.conf 文件的路径。典型的 URI 格式为 gs://{bucket_name}/path/to/krb5.conf

    • 为获得最佳结果,请使用与您的 Dataproc Metastore 服务位于同一区域的 Cloud Storage 存储分区。虽然 Dataproc Metastore 不会强制执行区域限制,但位于同一位置的资源和全球性资源效果更好。例如,全球性存储分区可用于任何服务区域,但欧盟多区域存储分区却不太适用于 us-central1 服务。跨区域访问具有更长的延迟时间、缺少区域故障隔离,并且会产生跨区域网络带宽费用。

访问权限控制机制

  • 如需创建服务,您必须具有一个包含 metastore.services.create IAM 权限的 IAM 角色。Dataproc Metastore 特定角色 roles/metastore.adminroles/metastore.editor 可用于授予创建权限。

  • 您也可以使用 roles/ownerroles/editor 旧版角色向用户或群组授予创建权限。

  • 如果您使用的是 VPC Service Controls,则 Secret Manager Secret 和 krb5.conf Cloud Storage 对象必须属于与 Dataproc Metastore 服务位于同一服务边界内的项目。

如需了解详情,请参阅 Dataproc Metastore IAM 和访问权限控制

为服务启用 Kerberos

以下说明介绍了如何为与 Dataproc 集成的 Dataproc Metastore 服务启用 Kerberos。

  1. 在将要与 Dataproc Metastore 服务对等互连的 VPC 网络中设置 Dataproc 集群并启用 Kerberos

    1. 创建 Dataproc 集群时启用项目访问权限,以允许 API 访问同一项目中的所有 Google Cloud 服务。 这可以通过在 Dataproc 集群创建 gcloud 命令中传递 --scopes 'https://www.googleapis.com/auth/cloud-platform' 来实现。
  2. 通过 SSH 连接到 Dataproc 集群的主实例。您可以通过浏览器或命令行执行此操作。 在主实例上运行以下命令:

    1. 在 Dataproc 集群上修改 /etc/hive/conf/hive-site.xml。选择主账号名称(格式应为 primary/instance@REALM)。在 /etc/hive/conf/hive-site.xml 中查找预先存在的 hive.metastore.keberos.principal 以找到 REALM 并替换 primary 和 instance 部分。示例主帐号名称为 hive/test@C.MY-PROJECT.INTERNAL

      记下主帐号名称,以便在创建 Dataproc Metastore 服务期间使用:

      <property>
        <name>hive.metastore.kerberos.principal</name>
        <!-- Update this value. -->
        <value>PRINCIPAL_NAME</value>
      </property>
      <property>
        <name>hive.metastore.kerberos.keytab.file</name>
        <!-- Update to this value. -->
        <value>/etc/security/keytab/metastore.service.keytab</value>
      </property>
      
    2. 在 Dataproc 集群的主虚拟机上创建 keytab/主账号组合:

      sudo kadmin.local -q "addprinc -randkey PRINCIPAL_NAME"
      sudo kadmin.local -q "ktadd -k /etc/security/keytab/metastore.service.keytab PRINCIPAL_NAME"
      
    3. 将 keytab 从 Dataproc 集群的主虚拟机上传到 Secret Manager。这要求运行 Dataproc 虚拟机的身份具有 Secret Manager Admin 角色才能创建密文。记下创建的密文版本,以便在创建 Dataproc Metastore 服务期间使用。

        gcloud secrets create SECRET_NAME --replication-policy automatic
        sudo gcloud secrets versions add SECRET_NAME --data-file /etc/security/keytab/metastore.service.keytab
        

    4. 通过 Compute Engine 界面或 gcloud compute instances list 确定 Dataproc 集群主实例的主要内部 IP 地址,并将其填充为 /etc/krb5.conf 中集群域的 kdcadmin_server

      例如(假设主实例的内部 IP 地址是 192.0.2.2):

      [realms]
        US-CENTRAL1-A.C.MY-PROJECT.INTERNAL = {
          kdc = 192.0.2.2
          admin_server = 192.0.2.2
        }
      
    5. /etc/krb5.conf 文件从 Dataproc 主虚拟机上传到 Cloud Storage。记下 Cloud Storage 路径,以便在创建 Dataproc Metastore 服务期间使用。

      gsutil cp /etc/krb5.conf gs://bucket-name/path/to/krb5.conf
      
  3. 向 Dataproc Metastore 服务帐号(此帐号由 Google 管理,可通过选择包括 Google 提供的角色授权在 IAM 权限界面页面上列出)授予 keytab 的访问权限:

       gcloud projects add-iam-policy-binding PROJECT_ID \
           --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-metastore.iam.gserviceaccount.com \
           --role roles/secretmanager.secretAccessor
       

  4. 向 Dataproc Metastore 服务帐号授予访问 krb5.conf 文件的权限。

       gcloud projects add-iam-policy-binding PROJECT_ID \
           --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-metastore.iam.gserviceaccount.com \
           --role roles/storage.objectViewer
       

  5. 确保您已为 KDC 配置入站防火墙规则。 这些防火墙规则必须在用于创建 Dataproc 集群的 VPC 网络上配置,以允许 TCP/UDP 流量入站。

  6. 使用上述主帐号名称、Secret Manager 密文版本和 krb5.conf Cloud Storage 对象 URI 创建新的 Dataproc Metastore 服务更新现有服务。请务必指定您在 Dataproc 集群创建期间使用的 VPC 网络。

    Dataproc Metastore 服务创建或更新操作将使用提供的主帐号、keytab 和 krb5.conf 文件测试是否成功登录。如果测试失败,则操作将失败。

  7. Dataproc Metastore 服务创建完成后,记下其 Thrift 端点 URI 和仓库目录。Thrift 端点 URI 类似于 thrift://10.1.2.3:9083,仓库目录类似于 gs://gcs-bucket-service-name-deadbeef/hive-warehouse。再次通过 SSH 连接到 Dataproc 集群的主实例,并执行以下操作:

    1. 在 Dataproc 集群上修改 /etc/hive/conf/hive-site.xml

      <property>
        <name>hive.metastore.uris</name>
        <!-- Update this value. -->
        <value>ENDPOINT_URI</value>
      </property>
      <!-- Add this property entry. -->
      <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>WAREHOUSE_DIR</value>
      </property>
      
    2. 重启 HiveServer2:

      sudo systemctl restart hive-server2.service
      
    3. 修改 /etc/hadoop/conf/container-executor.cfg,在每个 Dataproc 节点上添加以下代码行:

       allowed.system.users=hive
      
    4. 在连接到 Dataproc Metastore 实例之前,请先获取 kerberos 票证。

      sudo klist -kte /etc/security/keytab/metastore.service.keytab
      sudo kinit -kt /etc/security/keytab/metastore.service.keytab PRINCIPAL_NAME
      sudo klist # gets the ticket information.
      

后续步骤