机密存储

机密存储 #

概述 #

应用程序通常会需要获取敏感信息,例如数据库信息、敏感环境变量信息,密钥和token等,这些信息通常用于连接数据库,对服务和外部系统进行身份验证。

通常,这些信息以及其他应用程序需要的敏感信息会在机密存储(例如Hashicorp Vault和其他)组件中进行存储。要访问这些机密信息,应用程序需要导入机密存储SDK,并使用它来访问机密。这可能需要大量与应用程序的实际业务领域无关的样板代码,特别是在使用不同供应商特定秘密存储的多云场景中,这成为更大的挑战。

为了使各地的开发人员更容易使用应用程序机密存储,SideCar提供专用的机密构建模块API,允许服务从机密存储中获取机密信息。并且配套了相关的平台建设

使用场景 #

一般而言,服务容器中数据库连接信息等直接打在业务容器环境变量中,其真实的值暴露在整个部署环路。通过使用机密存储,可以将数据库连接信息等存储在机密存储中,避免直接在环境变量中和部署环路中暴露。对机密信息的修改。在sidecar层可以对服务可以获取的机密存储信息进行限制。

比如以下各项敏感信息可以存储在机密信息中:

  1. mysql配置
  2. 敏感环境变量配置
  3. 公私钥配置

平台使用 #

引擎配置 #

一般来说,引擎会在平台上已经配好,对于普通服务开发者,只需要引用就好了。

机密存储分为公有机密存储和私有机密存储。公有机密存储用于存储所有服务通用的信息,且不允许服务使用,主要用于存储异步消息引擎、私有机密存储引擎、以及后续会建设的缓存引擎的连接信息和密码信息等敏感数据。

私有机密存储是用于存储服务机密信息的,服务只能使用私有机密存储。

image-20211015172724847

公有机密存储 #

公有机密存储用于存储所有服务通用的信息,且不允许服务使用。主要用于存储平台上的一些敏感信息,如异步消息引擎、私有机密存储引擎、以及后续会建设的缓存引擎的连接信息和密码信息等敏感数据。

比如在平台上的公有机密存储中存储私有机密存储的访问地址和访问token。path为privatevault,key分别为address和token。

image-20211015172756742

私有机密存储 #

私有机密存储是用于存储服务机密信息的,服务只能使用私有机密存储。服务在机密信息配置页面,可以配置使用的机密存储引擎,这些引擎就是私有机密存储引擎。

image-20211015172823032

引擎配置项 #

引擎配置项的每个字段在msp界面上都有介绍,可以悬挂鼠标到字段后的小问号查看。这里整理了一份所有配置信息的描述。

这里有几个非常关键需要注意的字段:

  1. enginePath指定的是vault引擎。不同的enginePath是不同的数据存储区,相互之间数据是强隔离的。但是一般来说,对于服务使用方这个字段不需要太过了解。

  2. vaultKVPrefix是vault中存储key的前缀.通常用于不同的服务间的数据隔离,服务需要自定义此字段为一个引擎内唯一的值。当然两个服务也可以指定相同的值,两个服务获取的数据源就会是同一份,在对机密信息进行管理的时候就会相互可见。

  3. memoryLimit是缓存最高内存限制.单位是字节。默认1M。0为禁止缓存。出于性能考虑默认情况下缓存是开启的,每个服务可以设置为0来禁止自己的sidecar使用缓存。

参数是否必填详情描述示例
vaultAddrYVault server访问地址. 默认值 "https://127.0.0.1:8200""https://127.0.0.1:8200"
caCertNCA校验,使用此3字段中的一个即可. 编码后的ca证书"cacerts"
caPathNCA校验,使用此3字段中的一个即可.ca证书文件路径"path/to/cacert/file"
caPemNCA校验,使用此3字段中的一个即可.pem格式编码的ca证书"encodedpem"
skipVerifyN跳过 TLS 校验. 默认值 "false"不跳过。"true", "false"
tlsServerNameNTLS server name 配置"tls-server"
vaultTokenMountPathNvault 访问 token的本地文件路径,与vaultToken必须有一个是配置过的。"path/to/file"
vaultKVPrefixYvault中存储key的前缀.通常用于不同的服务间的数据隔离,服务需要自定义此字段。不同服务设置为同一个值需要谨慎对同一个机密信息管理相互影响并可见。 默认值是 "dapr""dapr", "appuniqueid"
vaultTokenNvault 访问 token.与vaultTokenMountPath必须有且仅有一个值是有配置的。"******"
enginePathN引擎的路径,默认是secret。对应于vault底层的Secrets Engines,此配置对应项必须在vault底层存在。"secret"
sidecarSecretStoreN是否是sidecar可以使用的秘密存储,所有机密组件中只允许最多一个组件为true,如果多个组件配置了,仅配置解析时第一个遇到的组件此字段生效,字符串true or false。默认falsetrue
parseAsMapN是否将机密内容解析为map[stirng]string,如果为true,则要求存储的机密信息格式必须为json字符串,且此字符串可以正常被解析为map[stirng]string。字符串true or false。默认truetrue
ttlN过期时间,纯数字代表ms,或者时间格式。默认5分钟。"5m""1000"
memoryLimitN缓存最高内存限制.单位是字节。默认1M。0为禁止缓存。"100000"

机密信息配置 #

image-20211015172929430

image-20211015172941611

黑白名单 #

平台上可以对服务能够获取的机密信息添加限制。主要有黑名单模式和白名单模式两种。当没有配置黑白名单的时候,默认不加任何额外限制。

黑名单模式:配置的key不允许访问,其他的放行。

白名单模式:只有配置的key才允许访问,其他的禁止。

机密信息管理 #

入口 #

image-20211015173054671

添加机密信息 #

可以通过平台管理界面和控制面API来添加和修改机密信息。

image-20211015173129481

查看机密信息 #

可以通过平台管理界面和控制面API来查看机密信息。默认不显示具体内容,如果需要查看某个key对应的机密信息,可以点击后面的小眼睛来限制具体的值。

image-20211015173149987

机密存储遥测 #

机密信息监控指标遥测主要从两个视角来聚合信息。第一个是服务视角,可以查看每个服务针对每个机密信息key的获取速率。另一个是引擎视角,查看自己引擎每个key被获取的整体速率。

机密信息缓存指标遥测提供了服务每个实例的sidecar机密信息缓存的各项指标信息。

image-20211015173217655

服务如何获取机密信息 #

通过 SDK 获取 #

由于当前中台的主要语言是go和php,配套了gosdk和phpsdk封装,可以以本地函数调用的方式获取到对应的机密信息值。

gosdk 使用示例 #
  sdk, _ := gosdk.NewKongClient(r.Header)
  // 获取引擎是vault、path是mysql对应的机密信息。
  res, err := sdk.GetSecret(context.Background(), "vault", "mysql", nil)
	if err != nil {
		// 处理错误,这里发生的错误一般都是网络错误或者配置错误
		return err
	}
	if !res.Success() {
		// 处理错误,这里发生的错误一般都是逻辑错误,比如并没有配置此机密信息、没有权限获取此机密信息
		return errors.New(res.Msg) // msg中是错误描述
	}
	secretMap := res.Data
	fmt.Println(secretMap["db"])

phpsdk 使用示例 #

//通过sdk获取机密信息
$client = Client::getInstance();
$res = $client->getSecret('vault', 'mysql');
var_dump($res);
// -------- res 内容格式如下,使用中台正常服务调用的通用返回格式 -----------
array(3) {
  ["state"]=>
  int(1)
  ["msg"]=>
  string(7) "success"
  ["data"]=>
  array(4) {
    ["db"]=>
    string(2) "db"
    ["host"]=>
    string(4) "host"
    ["password"]=>
    string(8) "password"
    ["user"]=>
    string(4) "user"
  }
}

通过 HTTP 请求获取 #

对于其他语言,可以通过http请求访问sidecar获取机密信息。

GET http://<sidecarAddress>/v1.0/secrets/<secret-store-name>/<name>

URL 参数:

ParameterDescription
sidecarAddresssidecar访问地址
secret-store-name获取机密信息的机密存储名称
name要获取的机密信息的key