使用 Secret

您可以使用 Secret Manager 安全地存储 API 密钥、密码和其他敏感信息。本指南介绍如何配置 Cloud Functions 以访问存储在 Secret Manager 中的密文。

本文档介绍向函数提供密文的两种方法:

  • 将密文装载为卷。这会将密文作为文件提供给函数。如果您将密文作为卷引用,则每次从磁盘读取该文件时,函数都会从 Secret Manager 访问密文值。如果您希望引用最新版本的密文而不是固定版本的密文,则将其装载为卷是一个很好的策略。如果您计划实现密文轮替,则此方法也非常适用。

  • 将密文作为环境变量传递。环境变量值会在实例启动时进行解析,因此如果您使用此方法,我们建议您引用固定版本的密文,而不是引用最新版本的密文。

如需详细了解如何使用 Secret Manager,请参阅 Secret Manager 概览

准备工作

  1. 启用 Secret Manager API。

    启用 API

  2. 如果您尚未在 Secret Manager 中创建密文,请先创建一个。如需了解如何创建和访问密文,请参阅创建密文

授予对密文的访问权限

您的函数可以访问与该函数位于同一项目的密文,也可以访问位于另一个项目中的密文。要访问密文,函数的运行时服务帐号必须被授予密文的访问权限

默认情况下,Cloud Functions 使用 App Engine 默认服务帐号向 Secret Manager 进行身份验证。对于生产用途,Google 建议您将函数配置为使用用户管理的服务帐号进行身份验证,该服务帐号分配有包含完成该函数的任务所需的最小权限的一组角色。

如需将 Secret Manager 与 Cloud Functions 搭配使用,请向与您的函数关联的服务帐号分配 roles/secretmanager.secretAccessor 角色:

  1. 转到 Cloud Console 中的 Secret Manager 页面:
    转到 Secret Manager 页面

  2. 点击密文的名称。

  3. 如果面板尚未打开,请点击显示信息面板以打开面板。

  4. 在信息面板中,点击添加主帐号

  5. 新的主账号字段中,输入函数用于其身份的服务帐号。函数的服务帐号是以下之一:

  6. 选择角色下拉列表中,选择 Secret Manager,然后选择 Secret Manager Secret Accessor

使密文可被函数访问

要从函数引用密文,您必须先使密文可被函数访问。您可以使用 Google Cloud Console 或 gcloud 命令行工具使密文可被新函数或现有函数访问:

控制台

要使密文可被函数访问,请执行以下操作:

  1. 转到 Google Cloud Console 中的 Cloud Functions 页面:
    转到 Cloud Functions 页面

  2. 点击要访问密文的函数的名称。

  3. 点击修改

  4. 点击运行时、构建和连接设置以展开高级配置选项。

  5. 点击安全以打开“安全”标签页。

  6. 点击引用密文,以为函数设置密文。

  7. 选择要使其可被访问的密文。如果您需要创建密文,请参阅创建和访问密文

    • 如需引用与函数位于同一项目中的密文,请执行以下操作:

      1. 从下拉列表中选择密文。
    • 如需引用另一个项目中的密文,请执行以下操作:

      1. 验证您项目的服务帐号已被授予密文的访问权限

      2. 选择看不到您的 Secret?请输入密文资源 ID。

      3. 按以下格式输入密文的资源 ID:

        project/PROJECT_ID/secrets/SECRET_NAME

        替换以下内容:

        • PROJECT_ID:密文所在项目的 ID。

        • SECRET_NAME:Secret Manager 中的密文名称。

  8. 选择密文的引用方法。您可以将密文作为卷装载,也可以将密文作为环境变量公开。

    • 如需将密文装载为卷,请执行以下操作:

      1. 选择装载为卷

      2. 装载路径字段中,输入要用于密文的路径。

      3. 版本下拉列表中,选择要引用的密文版本。

    • 如需将密文公开为环境变量,请执行以下操作:

      1. 选择公开为环境变量

      2. 装载路径字段中,输入要用于密文的路径。

      3. 版本下拉列表中,选择要引用的密文版本。

  9. 点击完成

  10. 点击下一步

  11. 点击部署

函数的代码现在可以引用密文。

gcloud

要使函数可访问密文,请输入以下命令之一。

  • 如需将密文装载为卷,请输入以下命令:

    gcloud beta functions deploy FUNCTION_NAME \
    --runtime RUNTIME \
    --set-secrets 'SECRET_FILE_PATH=SECRET:VERSION'
    

    替换以下内容:

    • FUNCTION_NAME:函数的名称。

    • RUNTIME:运行函数的运行时

    • SECRET_FILE_PATH:密文的完整路径。例如 /etc/secrets/primary/latest,其中 /etc/secrets/primary/ 是装载路径,/latest/ 是密文路径。您也可以分别指定装载路径和密文路径:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

    • SECRET:Secret Manager 中的密文名称。

    • VERSION:要使用的密文的版本。例如 1latest

    --set-secrets 标志会替换任何现有密文。如需保留函数的现有密文,请改用 --update-secrets 标志。

  • 如需将密文公开为环境变量,请输入以下命令:

    gcloud beta functions deploy FUNCTION_NAME \
    --runtime RUNTIME \
    --set-secrets 'ENV_VAR_NAME=SECRET:VERSION'
    

    替换以下内容:

    • FUNCTION_NAME:函数的名称。

    • RUNTIME:运行函数的运行时

    • ENV_VAR_NAME:环境变量的名称。

    • SECRET:Secret Manager 中的密文名称。

    • VERSION:要使用的密文的版本。例如 1latest

    --set-secrets 标志会替换任何现有密文。如需保留函数的现有密文,请改用 --update-secrets 标志。

  • 如果函数的服务帐号已被授予另一个项目中密文的访问权限,则可以引用另一个项目中的密文。如需引用另一个项目中的密文,请使用该密文的资源路径:

    gcloud beta functions deploy FUNCTION_NAME \
    --runtime RUNTIME \
    --update-secrets 'SECRET_FILE_PATH=SECRET_RESOURCE_PATH:VERSION'
    

    替换以下内容:

    • FUNCTION_NAME:函数的名称。

    • SECRET_RESOURCE_PATH:位于另一个项目中的密文的资源路径。资源路径采用以下格式:

      project/PROJECT_ID/secrets/SECRET_NAME

      替换以下内容:

      • PROJECT_ID:密文所在项目的 ID。

      • SECRET_NAME:Secret Manager 中的密文名称。

    • RUNTIME:运行函数的运行时

    • SECRET_FILE_PATH:密文的完整路径。例如 /etc/secrets/primary/latest,其中 /etc/secrets/primary/ 是装载路径,/latest/ 是密文路径。您也可以分别指定装载路径和密文路径:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

    • SECRET:Secret Manager 中的密文名称。

    • VERSION:要使用的密文的版本。例如 1latest

  • 您可以一次更新多个 Secret。请以英文逗号分隔每个密文的配置选项。以下命令会更新一个作为卷装载的 Secret,以及另一个作为环境变量公开的 Secret。

    如需更新现有 Secret,请输入以下命令:

    gcloud beta functions deploy FUNCTION_NAME \
    --runtime RUNTIME \
    --update-secrets 'ENV_VAR_NAME=SECRET:VERSION, \
    SECRET_FILE_PATH=SECRET:VERSION'
    

    替换以下内容:

    • FUNCTION_NAME:函数的名称。

    • RUNTIME:运行函数的运行时

    • ENV_VAR_NAME:环境变量的名称。

    • SECRET:Secret Manager 中的密文名称。

    • VERSION:要使用的密文的版本。例如 1latest

    • SECRET_FILE_PATH:密文的完整路径。例如 /etc/secrets/primary/latest,其中 /etc/secrets/primary/ 是装载路径,/latest/ 是密文路径。您也可以分别指定装载路径和密文路径:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

从函数中移除密文

您可以使用 Cloud Console 或 gcloud 工具从函数中移除密文:

控制台

  1. 转到 Google Cloud Console 中的 Cloud Functions 页面:
    转到 Cloud Functions 页面

  2. 点击要移除其某个密文的函数的名称。

  3. 点击修改

  4. 点击运行时、构建和连接设置以展开高级配置选项。

  5. 点击安全以打开“安全”标签页。

  6. 将鼠标悬停在要移除的密文上,然后点击 删除

  7. 点击下一步

  8. 点击部署

gcloud

您可以从函数中移除所有密文,或指定一个或多个要移除的密文:

  • 如需移除所有密文,请运行以下命令:

    gcloud beta functions deploy FUNCTION_NAME \
    --runtime RUNTIME \
    --clear-secrets
    

    替换以下内容:

    • FUNCTION_NAME:函数的名称。

    • RUNTIME:运行函数的运行时

    所有密文都会从该函数中清除。

  • 如需指定要移除的密文列表,请使用 --remove-secrets 标志。以下命令会移除一个装载为卷的密文,以及另一个公开为环境变量的密文。

    gcloud beta functions deploy FUNCTION_NAME \
    --runtime RUNTIME \
    --remove-secrets='ENV_VAR_NAME,SECRET_FILE_PATH, ...'
    

    替换以下内容:

    • FUNCTION_NAME:函数的名称。

    • RUNTIME:运行函数的运行时

    • ENV_VAR_NAME:环境变量的名称。

    • SECRET_FILE_PATH:密文的完整路径。例如 /etc/secrets/primary/latest,其中 /etc/secrets/primary/ 是装载路径,/latest/ 是密文路径。您也可以分别指定装载路径和密文路径:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

    指定的密文会从函数中移除。

查看函数的可访问密文

您可以使用 Cloud Console 或 gcloud 工具查看函数当前可以访问的密文:

控制台

  1. 转到 Google Cloud Console 中的 Cloud Functions 页面:
    转到 Cloud Functions 页面

  2. 点击函数的名称以查看其可用密文。

  3. 点击修改

  4. 点击运行时、构建和连接设置以展开高级配置选项。

  5. 点击安全以打开“安全”标签页。

安全标签页列出了函数当前可访问的密文。

gcloud

如需查看函数可用的密文t,请使用 gcloud beta functions describe 命令:

gcloud beta functions describe FUNCTION_NAME

FUNCTION_NAME 替换为您的函数的名称。

后续步骤