Dapr for dotnet | 密钥管理 - Secret Management

本文介绍了Dapr的密钥管理构建块,用于安全地存储和检索应用程序的敏感信息,如数据库连接字符串、API密钥和认证证书。它提供了一种统一的接口,隐藏了底层的密钥存储实现,支持多种可插拔的存储组件,并允许在不同环境中使用不同的凭据。Dapr使得开发人员能够通过简单的API调用在代码中轻松访问密钥,同时避免直接依赖于特定的密钥存储服务,降低了多云环境下的复杂性。此外,还探讨了如何限制密钥的访问权限以及如何在.NET应用程序中使用Dapr的密钥管理功能。

密钥管理(Secret Management)简介

应用程序通常会通过使用专用的密钥存储来秘密存储敏感信息,常见示例包括:

  • 包含用户名和密码的数据库连接字符串。
  • 用于调用外部 Web API 的 API 密钥。
  • 用于对外部系统进行身份验证的客户端证书/令牌。

温馨提示:必须谨慎管理机密,以免在应用程序之外泄露。

传统的做法是 将应用程序机密存储在应用程序代码库内的配置文件中, .NET 开发人员一想到 web.config 文件就会很亲切。 虽然实现起来很简单,但 将机密与代码集成在一起并不安全。 常见的错误是在推送到公共 GIT 存储库时包含该文件,导致机密泄露。

微服务-十二要素(The Twelve Factors)

十二要素(The Twelve Factors)应用】是一种被广泛认可的用于构建新式分布式应用程序的方法。 其中介绍了一系列原则和最佳做法。 第三个要素规定配置和机密要存储在代码库外部

通常这需要建立一个 密钥存储,如 Azure Key Vault、Hashicorp Vault 和其他仓库等机密管理工具中隔离机密(并在那里存储应用程序级别的密钥)。 可通过这些工具将机密存储在外部、在不同环境中使用不同的凭据,并且通过应用程序代码引用它们。 不过,每款工具都不简单,而且需要学习(增加相应的学习成本)。

要访问这些密钥存储,应用程序需要导入相应的密钥存储 SDK,并使用它访问这些密钥。 这可能需要相当数量的模板代码,这些代码与应用的实际业务领域无关,因此在多云场景中,可能会使用不同厂商特定的密钥存储,这就成为一个更大的挑战。

Dapr 的密钥管理

Dapr 提供了简化机密管理的构建基块。让开发人员在任何地方更容易消耗应用程序密钥, Dapr 有一个专用的密钥构建块 API ,允许开发人员从一个密钥存储获得密钥。

密钥管理的优点

通过 Dapr 机密管理构建基块,可轻松地使用机密和机密管理工具。

  • 它通过统一的接口隐藏基础管道。
  • 它支持各种可插入的机密存储组件,这些组件在开发环境和生产环境中可能有所不同。
  • 应用程序不需要直接依赖于机密存储库(应用程序和密钥存储分离)。
  • 开发人员无需详细了解每个机密存储。

密钥管理的应用

使用 Dapr 的密钥存储构建块通常涉及以下内容:

  • 设置一个特定的密钥存储解决方案的组件。
  • 在应用程序代码中使用 Dapr 密钥 API 获取密钥。
  • [可选] 在 Dapr 组件文件中引用密钥。

密钥管理的工作原理

应用程序通过两种方式使用机密管理构建基块:

  • 直接从构建基块 API 检索查询机密。
  • 从 Dapr 组件配置中间接引用机密。

应用程序代码可以调用密钥构建块 API,从 Dapr 支持的密钥存储中检索密钥,并可以在您的代码中使用。

例如,下图显示了一个应用程序从配置的云密钥存储中请求名为 “mysecret“ 的密钥存储 “vault”。
self-hosted-mysecret

应用程序可以使用密钥 API 访问 Kubernetes 密钥存储的秘密。 在下面的示例中,应用程序会从 Kubernetes 密钥存储检索相同的密钥 “mysecret”。
k8s-mysecret
组件配置路径:

  • C:\Users<username>.dapr\components

更多密钥管理支持的组件,请查看:

  • Secret stores =》https://docs.dapr.io/reference/components-reference/supported-secret-stores/

密钥管理 API

使用机密管理构建基块时,应用程序会与 Dapr Sidecar 进行交互。 Sidecar 会公开机密 API。 可使用 HTTP 或 gRPC 调用 API。

  1. 【调用 Endport 】

使用以下 URL 调用 HTTP API(GET 请求)

# 单个密钥获取
http://localhost:<daprPort>/v1.0/secrets/<secret-store-name>/<name>

# 批量密钥获取
http://localhost:<daprPort>/v1.0/secrets/<secret-store-name>/bulk

URL 字段说明:

  • < dapr-port > 指定 Dapr Sidecar 正在侦听的端口号。
  • < store-name > 指定 Dapr 机密存储的名称。
  • < name > 指定要检索的机密的名称。
  • < metadata > [可选]提供机密的其他信息。

元数据属性因机密存储而异。 有关元数据属性的详细信息,请查看 [机密 API 参考](机密 API 参考 | Dapr Docs)

  1. 【响应状态码】
Code / 状态码 Description / 描述
200 OK,成功
204 Secret not found,未找到机密
400 Secret store is missing or misconfigured,机密存储丢失或配置错误
403 Access denied,访问被拒绝
500 Failed to get secret or no secret stores defined,未能获取机密存储或未定义机密存储
  1. 【构建块 Secret API 】

在 Dapr Sidecar 中的构建块 Secret API 接口信息(由于 daprd 是 go 语言编写的,因此下面提供 go 语言的接口信息):

type SecretStore interface {
   
   
  // Init authenticates with the actual secret store and performs other init operation
  // Init 使用实际的秘密存储进行身份验证并执行其他 init(初始化) 操作
  Init(metadata Metadata) error

  // GetSecret retrieves a secret using a key and returns a map of decrypted string/string values
  // GetSecret 使用密钥检索密钥并返回解密的字符串/字符串值的映射
  GetSecret(req GetSecretRequest) (GetSecretResponse, error)

  // BulkGetSecrets retrieves all secrets in the store and returns a map of decrypted string/string values
  // BulkGetSecrets 检索存储中的所有(批量)机密并返回解密的字符串/字符串值的映射
  BulkGetSecret(req BulkGetSecretRequest) (BulkGetSecretResponse, error)
}

在 .NET 中使用 Secret(机密)

此处使用 secretstores.local.file 类型来演示。

直接从构建基块 API 检索查询 Secret

添加 secrets01.json 文件

在 FrontEnd 项目中新增文件夹 Sec

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChaITSimpleLove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值