在客户端-服务器构建之间共享秘密的好策略

Good strategy to share secrets between client-server builds

以下面的案例为例

您有一个使用 OAuth2 保护的 RESTful API 层。另一方面,要让用户根据您的 API 进行身份验证,您需要请求访问令牌(即 grant_type=password)。

为了请求密码访问令牌,客户端应用程序需要 OAuth 客户端(密钥+秘密对)。

现在您已将所有内容配置为使用持续集成持续部署

在开发 构建 期间,构建脚本 创建测试数据,包括 OAuth 客户端 .显然,如果构建创建了测试数据,它之前会删除在自动化测试期间创建的所有数据。

所以您希望您的客户端应用程序使用 OAuth 客户端之一,并且您希望避免对其中之一进行硬编码,因为它们是使用 API 基础设施,因此它们在每次构建时都是从头开始重新创建的。

认为前端和后端是由不同的构建脚本构建的。

结论与问题

什么是在服务器和客户端基础设施之间共享秘密的好方法,所以两者都起床并运行与相同的安全秘密同步?

一些想法

  1. 操作系统环境变量。我可以将这些秘密存储在构建机器环境变量中。也就是说,客户端基础设施将始终使用最新的机密来构建和部署。

  2. 与#1 相同,但将这些秘密存储在构建机器的共享目录中。

关于TFS/VSTS构建(TFS 2015或更高版本)/发布(TFS 2017或VSTS)系统,您只需要在构建定义的Options/General选项卡中选中允许脚本访问OAuth令牌选项或发布环境,然后您可以在每个任务中使用 $(System.AccessToekn) 获取访问 OAuth 令牌。

对于其他系统,更好的做法是将access token存在系统环境变量中,最后移除,类似于其他build/release任务使用[=12的share变量值=] (PowerShell) 在 TFS 或 VSTS 中。

另一方面,为了安全起见,您可以将加密的Access Token存放在系统环境中,然后解密使用。

最后,我使用 公共构建目录来存储一个 JSON 文件,其中包含最新的凭据方法 ,两个构建都可以访问它。每个后端构建 运行 都会保留一个包含整个凭据的 JSON 文件,而前端构建依赖于整个文件。

无论如何,我尝试了环境变量的方法,但是由于两个构建都是 运行ning 在同一个 TFS 构建代理上,客户端构建看不到环境变量的变化,除非整个代理服务是重新启动。