使用 Secret Manager 凭证提供程序

Secret Manager 可以 保护您的敏感数据,例如 API 密钥、密码和 证书。您可以使用它在 Google Cloud中管理、访问和审核 Secret。

您可以使用 Secret Manager 凭证提供程序,将 Managed Service for Apache Spark 集群或作业配置为使用 Secret Manager Secret。

可用性

此功能适用于使用映像版本 2.0.97+、2.1.41+、2.2.6+ 或更高的主要 Managed Service for Apache Spark 映像版本创建的 Managed Service for Apache Spark 集群。

术语

下表介绍了本文档中使用的术语。

术语 说明
Secret Secret Manager Secret 是包含一系列元数据和 Secret 版本的全局项目对象。您可以将 Secret 作为二进制 blob 或文本字符串进行存储、管理和访问。
Credential 在 Hadoop 和其他 Managed Service for Apache Spark 托管的应用中,凭据由凭据名称 (ID) 和凭据值(密码)组成。 凭据 ID 和值会映射到 Secret Manager Secret ID 和 Secret 值(Secret 版本)。

用法

在创建 Managed Service for Apache Spark 集群或提交作业时,您可以通过设置以下 属性,将 Hadoop 和其他 OSS 组件 配置为与 Secret Manager 搭配使用。

  • 提供程序路径 :提供程序路径属性 hadoop.security.credential.provider.path 是一个以英文逗号分隔的列表,其中包含一个或多个凭证提供程序 URI,系统会遍历这些 URI 来解析凭证。

    --properties=hadoop.security.credential.provider.path=gsm://projects/PROJECT_ID
    
    • 提供程序路径中的 scheme 表示凭证提供程序类型。 Hadoop 方案包括 jceks://user://localjceks://。使用 gsm:// 方案可在 Secret Manager 中搜索凭证。
  • 替换点运算符:Secret Manager 服务不允许在 Secret 名称中使用点 (.)。但是,某些开源软件 (OSS) 组件会在其凭证密钥中使用点。如需解决此限制,请启用此属性以将凭证名称中的点 (.) 替换为连字符 (-)。这可确保名称中包含点的 OSS 凭据可以从 Secret Manager 中正确存储和检索。

    例如,如果 OSS 凭证密钥为 a.b.c,则在 Secret Manager 中存储时,您必须将其修改为 a-b-c

    --properties=hadoop.security.credstore.google-secret-manager.secret-id.substitute-dot-operator=true
    

    这是一个可选属性。默认情况下,值为 false。对于凭据名称中不包含点 (.) 运算符的凭据密钥,可以放心地忽略该属性。

  • Secret 版本 :Secret Manager 中的 Secret 可以有多个版本(值)。使用此属性可访问特定 Secret 版本,以便在生产环境中实现稳定访问。

    --properties=hadoop.security.credstore.google-secret-manager.secret-version=1
    

    这是一个可选属性。默认情况下,Secret Manager 会访问 LATEST 版本,该版本会在运行时解析为 Secret 的最新值。如果您的应用场景是始终访问 Secret 的 LATEST 版本,则可以放心地忽略该属性。

使用 Secret Manager 凭证提供程序创建 Managed Service for Apache Spark 集群

  1. 在本地或在 Cloud Shell运行以下命令,以使用所需的属性创建 Managed Service for Apache Spark 集群
    gcloud dataproc clusters create CLUSTER_NAME \
        --region=REGION \
        --properties="hadoop:hadoop.security.credential.provider.path=gsm://projects/PROJECT_ID,hadoop:hadoop.security.credstore.google-secret-manager.secret-id.substitute-dot-operator=true" \
        ...other flags as needed...
    

注意:

使用 Secret Manager 凭证提供程序提交 Managed Service for Apache Spark

  1. 在本地或在 Cloud Shell 中运行以下命令,以 使用所需的属性提交 Managed Service for Apache Spark 作业

    gcloud dataproc jobs submit CLUSTER_NAME \
        --region=REGION \
        --properties="hadoop.security.credential.provider.path=gsm://projects/PROJECT_ID,hadoop.security.credstore.google-secret-manager.secret-id.substitute-dot-operator=true" \
        ...other flags as needed... \
        -- job-args
    

注意:

将 Secret Manager 与 Hive Metastore 搭配使用

Hive Metastore 属性 javax.jdo.option.ConnectionPassword 包含用于对访问 metastore 数据库进行身份验证的密码。密码以文本格式保存在 hive-site.xml 中,这存在安全风险。最佳实践是在 Secret Manager 中存储密码,然后更新 hive-site.xml 配置文件,以允许 Hive metastore 服务从 Secret Manager 中读取密码。

以下示例展示了如何在不同的 Hive Metastore 场景中使用 Secret Manager。

使用本地 metastore 创建集群

  1. 在本地或在 Cloud Shell 中运行以下命令,以 创建 Managed Service for Apache Spark 集群
    gcloud dataproc clusters create CLUSTER_NAME \
        --region=REGION \
        ...other flags as needed... \
    

注意:

  1. 使用 Secret Manager 或 hadoop credential 命令创建 Secret。

    • 替代方案 1使用 Secret Manager 创建 Secret

      • Secret 名称:/projects/PROJECT_ID/secrets/javax-jdo-option-ConnectionPassword/versions/1
      • Secret 值:METASTORE_PASSWORD
    • 替代方案 2:使用 hadoop credential 命令创建 Secret。

      sudo hadoop credential create javax-jdo-option-ConnectionPassword -provider gsm://projects/PROJECT_ID -v METASTORE_PASSWORD
      

      • METASTORE_PASSWORD:由于 Secret Manager 不支持点 (.) 运算符,因此请将密码中的所有点 (.) 都替换为连字符 (-)。
  2. 验证该 Secret 是否存在。

    sudo hadoop credential list -provider gsm://projects/PROJECT_ID
    

  3. 使用文本编辑器从 hive-site.xml 文件中移除 javax.jdo.option.ConnectionPassword 属性,然后将 hadoop.security.credential.provider.pathhadoop.security.credstore.google-secret-manager.secret-id.substitute-dot-operator 属性添加到该文件。

    示例属性:

    hadoop.security.credential.provider.path=gsm://projects/PROJECT_ID
    hadoop.security.credstore.google-secret-manager.secret-id.substitute-dot-operator=true
    

  4. 重启 Hive Metastore。

    sudo systemctl restart hive-metastore
    

创建具有外部 Hive Metastore 的集群

  1. 在本地或在 Cloud Shell运行以下命令,以创建 Managed Service for Apache Spark 集群 ,并使用以下集群属性。 将此集群用作外部 Hive 作业的外部 Hive metastore,这些作业会在其他 Managed Service for Apache Spark 集群中运行来处理 Spark Hive 工作负载。

    gcloud dataproc clusters create METASTORE_CLUSTER_NAME \
        --region=REGION \
        --properties=core:fs.defaultFS=gs://METASTORE_CLUSTER_PROXY_BUCKET,dataproc:dataproc.components.deactivate="hdfs hive-server2 hive-metastore" \
        ...other flags as needed...
    
  2. 使用 Secret Manager 或 hadoop credential 命令创建 Secret。

    • 替代方案 1使用 Secret Manager 创建 Secret
      • Secret 名称:/projects/PROJECT_ID/secrets/javax-jdo-option-ConnectionPassword/versions/1
      • Secret 值:METASTORE_PASSWORD
    • 替代方案 2:使用 hadoop credential 命令创建 Secret。
      sudo hadoop credential create javax-jdo-option-ConnectionPassword -provider gsm://projects/PROJECT_ID -v METASTORE_PASSWORD
      
      • METASTORE_PASSWORD:由于 Secret Manager 不支持点 (.) 运算符,因此请将密码中的点 (.) 替换为连字符 (-)。
  3. 验证该 Secret 是否存在。

    sudo hadoop credential list -provider gsm://projects/PROJECT_ID
      

创建集群以运行连接到外部 metastore 的 Hive 作业

  1. 在本地或在 Cloud Shell运行以下命令,以创建 Managed Service for Apache Spark 集群 ,并使用以下集群属性。 使用此集群运行连接到另一个 Managed Service for Apache Spark 集群上的外部 metastore 的 Hive 作业。
    gcloud dataproc clusters create CLUSTER_NAME \
        --region=REGION \
        --properties="hive:javax.jdo.option.ConnectionURL=jdbc:mysql://METASTORE_CLUSTER_NAME-m/metastore,hive:hadoop.security.credential.provider.path=gsm://projects/PROJECT_ID,hive:hadoop.security.credstore.google-secret-manager.secret-id.substitute-dot-operator=true" \
        ...other flags as needed...
    

Hadoop 凭证命令

您可以使用 SSH 连接到 Managed Service for Apache Spark 主节点 以使用 hadoop credential 命令创建、列出和管理密钥。

hadoop credential 命令使用以下格式: hadoop credential SUBCOMMAND OPTIONS. 在以下示例中,添加了 -provider 标志以指定提供程序类型和位置(提供程序存储区)。gsm:// 架构用于指定 Secret Manager。

  • 使用指定的 Secret ID 创建 Secret。如果指定的 Secret ID 存在,该命令不会创建 Secret。此行为与 Hadoop CredentialProvider API 一致。

    hadoop credential create SECRET_ID -provider gsm://projects/PROJECT_ID -v VALUE
    

  • 列出存储在项目中的 Secret。

    hadoop credential list -provider gsm://projects/PROJECT_ID
    

  • 检查项目中是否存在具有指定值的 Secret。

    hadoop credential check SECRET_ID -provider gsm://projects/PROJECT_ID -v VALUE
    

  • 检查配置文件中是否存在特定的 Secret 版本。

    hadoop credential conf CONFIG_FILE check SECRET_ID -provider gsm://projects/PROJECT_ID -v VALUE
    
  • CONFIG_FILE:用于设置 hadoop.security.credstore.google-secret-manager.secret-version 的 XML 文件。

  • 删除项目中的 Secret 的所有版本。

    hadoop credential delete SECRET_ID -provider gsm://projects/ PROJECT_ID
    

如需了解详情,请参阅 Hadoop 命令指南

后续步骤