概述
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 密钥 IDAWS_SECRET_MANAGER_TAGS:要添加到 AWS Secrets Manager 中密钥的逗号分隔标签列表,例如key=value,key2=value2AWS_SECRET_ROTATION_ENABLED:设置为true以启用自动轮换密钥(默认:false)AWS_SECRET_ROTATION_DAYS:自动轮换之间的天数(默认:30)AWS_SECRET_ROTATION_LAMBDA_ARN:用于密钥轮换的 Lambda 函数 ARN,如果启用轮换则需要
用法:
- 使用 AWS Secrets Manager 服务管理密钥
- 支持创建、更新、读取和删除密钥
- 在创建新密钥时可以自动配置密钥轮换策略
AWS 密钥轮换
密钥轮换是一项安全最佳实践,可定期自动更新密钥。启用后,Keep 将使用轮换计划配置新创建的密钥。
要使用密钥轮换:
- 创建一个 Lambda 函数来轮换您的密钥(AWS 为常见轮换场景提供蓝图)
- 在您的环境中设置
AWS_SECRET_ROTATION_ENABLED=true - 将
AWS_SECRET_ROTATION_LAMBDA_ARN设置为您的轮换 Lambda 函数的 ARN - 可选择设置
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=k8sK8S_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,建议存储为密钥:
创建数据库连接密钥
# 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 将密钥作为环境变量注入:
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 应用
# 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验证安装
检查密钥是否正确创建:
kubectl get secret keep-db-secret -n keep验证密钥内容是否正确:
kubectl get secret keep-db-secret -n keep -o jsonpath='{.data.connection_string}' | base64 -d验证使用密钥的 pod:
kubectl get pod -n keep -l app.kubernetes.io/component=backend -o yaml | grep DATABASE_CONNECTION_STRING -A 5GCP 密钥管理器
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中。