Skip to content

关于本页

本页介绍更夫所基于的开源内核 Keep 的通用能力。更夫在其上提供国内化增强:钉钉/企业微信/飞书通知、国产大模型接入、LDAP 认证与值班管理。部署与上手请看快速上手。

概述 ​

TIP

密钥管理器选择对于保护您的应用程序至关重要。可以根据部署类型设置不同的模式。我们的系统支持四种主要的密钥管理器类型。

密钥管理器工厂 ​

SecretManagerFactory 是一个实用程序类,用于创建不同类型密钥管理器的实例。它利用工厂设计模式来抽象基于所需密钥管理器类型的创建逻辑。该工厂支持创建 File、GCP、Kubernetes 和 Vault 密钥管理器的实例。

SECRET_MANAGER_TYPE 环境变量在 SecretManagerFactory 中起着关键作用,用于确定在方法调用中未提供特定类型时要实例化的默认密钥管理器类型。

功能:

默认密钥管理器:如果设置了 SECRET_MANAGER_TYPE 环境变量,其值决定了工厂将创建的默认密钥管理器类型。 该变量的值应与 SecretManagerTypes 枚举中定义的类型之一相对应(FILE、AWS、GCP、K8S、VAULT、DB)。

配置示例:

在环境中设置 SECRET_MANAGER_TYPE=GCP 将使工厂默认创建 GcpSecretManager 实例。 如果未设置 SECRET_MANAGER_TYPE 或设置为 FILE,则工厂默认为创建 FileSecretManager 实例。 此环境变量提供了灵活性和易配置的优点,允许在不同环境或场景中使用不同的密钥管理器,而无需更改代码。

文件密钥管理器 ​

FileSecretManager 是 BaseSecretManager 的具体实现,用于管理存储在文件系统中的密钥。它使用指定目录(默认为 ./)来读取、写入和删除密钥文件。

配置:

设置环境变量 SECRET_MANAGER_DIRECTORY 以指定存储密钥的目录。如果未设置,默认为当前目录 (./)。

用法:

  • 密钥作为文件存储在指定目录中。
  • 读取密钥涉及从文件获取内容。
  • 写入密钥会创建或使用给定内容更新文件。
  • 删除密钥会删除相应的文件。

AWS 密钥管理器 ​

AwsSecretManager 与 Amazon Web Services' Secrets Manager 服务集成,用于安全的密钥管理。它为在 AWS 环境中存储和管理密钥提供了强大的解决方案。

配置:

必需的环境变量:

  • AWS_REGION:存储密钥的 AWS 区域
  • 对于本地开发:
    • AWS_ACCESS_KEY_ID:您的 AWS 访问密钥
    • AWS_SECRET_ACCESS_KEY:您的 AWS 秘密访问密钥 可选:
  • AWS_KMS_KEY_ID:用于加密密钥的 KMS 密钥 ID
  • AWS_SECRET_MANAGER_TAGS:要添加到 AWS Secrets Manager 中密钥的逗号分隔标签列表,例如 key=value,key2=value2
  • AWS_SECRET_ROTATION_ENABLED:设置为 true 以启用自动轮换密钥(默认:false)
  • AWS_SECRET_ROTATION_DAYS:自动轮换之间的天数(默认:30)
  • AWS_SECRET_ROTATION_LAMBDA_ARN:用于密钥轮换的 Lambda 函数 ARN,如果启用轮换则需要

用法:

  • 使用 AWS Secrets Manager 服务管理密钥
  • 支持创建、更新、读取和删除密钥
  • 在创建新密钥时可以自动配置密钥轮换策略

AWS 密钥轮换 ​

密钥轮换是一项安全最佳实践,可定期自动更新密钥。启用后,Keep 将使用轮换计划配置新创建的密钥。

要使用密钥轮换:

  1. 创建一个 Lambda 函数来轮换您的密钥(AWS 为常见轮换场景提供蓝图)
  2. 在您的环境中设置 AWS_SECRET_ROTATION_ENABLED=true
  3. 将 AWS_SECRET_ROTATION_LAMBDA_ARN 设置为您的轮换 Lambda 函数的 ARN
  4. 可选择设置 AWS_SECRET_ROTATION_DAYS 自定义轮换间隔

Lambda ARN 格式示例:arn:aws:lambda:region:account-id:function:function-name

注意:不同的密钥类型(数据库凭证、API 密钥等)需要不同的轮换逻辑。确保您的 Lambda 函数适合您存储的密钥类型。

Kubernetes 密钥管理器 ​

概述 ​

KubernetesSecretManager 与 Kubernetes 的本机密钥系统接口。

它在指定的 Kubernetes 命名空间内管理密钥,旨在 Kubernetes 集群内运行。

配置 ​

  • SECRET_MANAGER_TYPE=k8s
  • K8S_NAMESPACE=keep - 指定 Kubernetes 命名空间的环境变量。如果未设置,默认为 .metadata.namespace。在集群内运行时,假定 Kubernetes 配置(如服务账户令牌)已正确设置。
  • K8S_VERIFY_SSL_CERT=true - 指定是否验证 Kubernetes API 的 SSL 证书的环境变量。默认为 true。

用法:

  • 密钥作为 Kubernetes Secret 对象存储。
  • 提供创建、检索和删除 Kubernetes 密钥的功能。
  • 根据 Kubernetes 要求处理 base64 编码和解码。

从密钥创建环境变量 ​

Kubernetes Secret Manager 集成允许 Keep 从 Kubernetes Secrets 获取环境变量。

对于敏感环境变量,例如 DATABASE_CONNECTION_STRING,建议存储为密钥:

创建数据库连接密钥 ​

bash
# Create the base64 encoded string without newline
CONNECTION_STRING_B64=$(echo -n "mysql+pymysql://user:password@host:3306/dbname" | base64)

# Create the Kubernetes secret
kubectl create secret generic keep-db-secret \
  --namespace=keep \
  --from-literal=connection_string=$(echo -n "mysql+pymysql://user:password@host:3306/dbname" | base64)

# Or using a YAML file:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: keep-db-secret
  namespace: keep
type: Opaque
data:
  connection_string: $(echo -n "mysql+pymysql://user:password@host:3306/dbname" | base64)
EOF

更新 helm Values.yaml ​

创建密钥后,更新 values.yaml 以便 helm chart 将密钥作为环境变量注入:

bash
backend:
  enabled: true
  waitForDatabase: true
  databaseConnectionStringFromSecret:
    enabled: true  # Enable using secret for database connection
    secretName: "keep-db-secret"  # Name of the secret we created
    secretKey: "connection_string"  # Key in the secret containing our connection string

使用 Helm 应用 ​

bash
# If installing for the first time
helm install keep keephq/keep \
  -f values.yaml \
  --namespace keep

# If updating existing installation
helm upgrade keep keephq/keep \
  -f values.yaml \
  --namespace keep

验证安装 ​

检查密钥是否正确创建:

bash
kubectl get secret keep-db-secret -n keep

验证密钥内容是否正确:

bash
kubectl get secret keep-db-secret -n keep -o jsonpath='{.data.connection_string}' | base64 -d

验证使用密钥的 pod:

bash
kubectl get pod -n keep -l app.kubernetes.io/component=backend -o yaml | grep DATABASE_CONNECTION_STRING -A 5

GCP 密钥管理器 ​

GcpSecretManager 利用 Google Cloud 的 Secret Manager 服务进行密钥管理。它需要使用 Google Cloud 凭证和项目 ID 进行设置。

配置:

确保设置环境变量 GOOGLE_CLOUD_PROJECT 为您的 Google Cloud 项目 ID。

用法:

  • 使用 Google Cloud 的 Secret Manager 管理密钥。
  • 支持在云中创建、访问和删除密钥的操作。
  • 集成 OpenTelemetry 以跟踪密钥管理操作。

Hashicorp Vault 密钥管理器 ​

VaultSecretManager 专为 Hashicorp Vault 而设计,Vault 是一个用于管理敏感数据的工具。它支持基于令牌的身份验证以及基于 Kubernetes 的 Vault 身份验证。

配置:

  • 设置 HASHICORP_VAULT_ADDR 为 Vault 服务器地址。默认为 http://localhost:8200。
  • 使用 HASHICORP_VAULT_TOKEN 进行基于令牌的身份验证。
  • 设置 HASHICORP_VAULT_USE_K8S 为 True 并提供 HASHICORP_VAULT_K8S_ROLE 以进行基于 Kubernetes 的身份验证。

用法:

  • 在 Hashicorp Vault 服务器中管理密钥。
  • 提供从 Vault 写入、读取和删除密钥的方法。
  • 支持不同的 Vault 身份验证方法,包括静态令牌和 Kubernetes 服务账户令牌。

DB 密钥管理器 ​

DbSecretManager 是 BaseSecretManager 的具体实现,用于管理存储在 DB 中的密钥。它使用表 secret 来读取、写入和删除密钥。

配置:

确保表 secret 存在。

用法:

  • 密钥存储在表 secret 中。

基于 MIT 协议开源的 Keep · 由更夫社区维护