Secret Manager 凭据提供方

概览

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

与 Secret Manager 集成的 GoogleHadoopSecretManagerCredentialProvider API 是 Hadoop CredentialProvider API 的实现,Hadoop CredentialProvider API 是一种用于保护敏感凭据以防止公开访问的解决方案。

您可以通过以下方式使用 Hadoop 凭据提供程序 API:

术语

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

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

Hadoop 凭据命令

您可以使用 hadoop credential 命令创建、列出和管理 Secret。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 文件。

  • 删除项目中某个密钥的所有版本。

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

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

配置 OSS 组件

您可以通过设置以下组件属性,将 Hadoop 和其他受支持的其他 OSS 组件配置为与 Secret Manager 搭配使用:

  • 提供程序路径(必需):提供程序路径属性 hadoop.security.credential.provider.path 是一个逗号分隔列表,其中包含为解析凭据而遍历的一个或多个凭据提供程序 URI。

    --properties=hadoop.security.credential.provider.path=gsm://projects/project-id
    
    • scheme 用于指示凭据提供程序的类型。Hadoop 方案包括 jceks://user://localjceks://。如上例所示,使用 gsm:// 方案在 Secret Manager 中搜索凭据。
  • 替换点运算符(可选):Secret Manager 不支持在 Secret 名称中使用点 (.) 运算符,但 OSS 组件凭据密钥可以包含此运算符。当此属性设为 true 时。 您可以将凭据名称中的点(.) 替换为连字符(-)。例如,如果此属性设置为 true,您可以在将凭据名称 a.b.c 传递给 Secret Manager 时将其指定为 a-b-c。只有在使用 Hadoop 凭据命令指定凭据时,或在 OSS 组件尝试解析凭据时指定凭据,才需要此属性。它对创建、列出或删除 Hadoop 凭据命令没有影响。

    --properties=hadoop.security.credstore.google-secret-manager.secret-id.substitute-dot-operator=true
    
  • Secret 版本(可选):Secret Manager 中的 Secret 可以有多个版本(值)。使用此属性访问 Secret 版本。默认情况下,Secret Manager 会访问 LATEST 版本,该版本会在运行时解析为 Secret 的最新值。最佳做法是定义此属性,以便在生产环境中实现稳定的访问权限。

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

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 的 Hive 集群

  1. 在本地或 Cloud Shell 中运行以下命令,以使用所需的集群属性创建 Dataproc 集群

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

  2. 创建 Secret。您可以使用 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
    

  4. hive-site.xml 文件中移除 javax.jdo.option.ConnectionPassword。 以下命令会在 vim 中打开该文件并进行修改。

    sudo vim /etc/hive/conf/hive-site.xml
    

  5. 重启 Hive Metastore。

    sudo systemctl restart hive-metastore
    

具有外部 Metastore 的 Hive 集群

  1. 在本地或 Cloud Shell 中运行以下命令,以使用以下集群属性创建 Dataproc 集群

    gcloud dataproc clusters create CLUSTER_NAME \
        --region=REGION \
        ...other flags as needed... \
        --properties=core:fs.defaultFS=gs://METASTORE_CLUSTER_PROXY_BUCKET,dataproc:dataproc.components.deactivate="hdfs hive-server2 hive-metastore"
    

  2. 创建 Secret。您可以使用 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
      

  4. 在本地或 Cloud Shell 中运行以下命令,以创建具有如下集群属性的 Dataproc 集群。使用此集群运行 Hive 作业并连接到外部 Metastore。

    gcloud dataproc clusters create CLUSTER_NAME \
        --region=REGION \
        ...other flags as needed...
        --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"
    

如需深入了解