我有一个Azure函数,其local.settings.json
文件中有一些秘密。
我想在GitHub上共享函数源代码的最佳实践是什么?
到目前为止,我可以想到以下选项,但是每个选项都有一些问题或挑战:
1-每当我提交更改时,请记住更改local.settings.json
中的机密。提交完成后,撤消更改,因此我可以运行该函数并对其进行调试。此选项非常容易出错且乏味。
2-将local.settings.json
添加到.gitignore文件。通过这种方法,从GitHub获得代码的人需要记住恢复local.settings.json
3-将机密存储在Azure Key Vault中。但这对于我正在创建的小功能来说太过分了。
我想问一下如何处理源代码控制存储库中local.settings.json
中的秘密的最佳实践是什么。
答案 0 :(得分:2)
您可以在没有机密信息的情况下提交Json文件,然后在本地添加机密信息,再也不会再次上载该文件供提交。
此外,如果您过去使用机密提交文件,然后又不带机密再次提交文件,则您的机密仍在存储库中。您必须使用镐将文件删除(我想检查一下filetree命令)。
答案 1 :(得分:2)
请务必在我提交更改后随时更改local.settings.json中的秘密
使用smudge-clean
机制。清除污迹是一种机制,可让您在文件通过索引时对其进行修改。
smudge / clean是过滤器,只要您将文件(clean)和检出文件提交到工作目录(smudge),它们就会运行。
Smudge / clean
在此处阅读所有内容并进行设置:
https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes
事实证明,您可以在提交/签出上编写自己的过滤器来替换文件。
这些被称为
clean
和smudge
过滤器。在
.gitattributes
文件中,您可以为特定路径设置过滤器,然后设置脚本以在检出文件之前(“涂抹”)和在暂存文件之前(“清洁”)。
可以将这些过滤器设置为执行各种有趣的事情。
因此,您可以编写自己的过滤器,以在提交/签出时对文件进行替换。
答案 2 :(得分:2)
作为described here,您可以为您的秘密添加另一个配置文件(secret.settings.json
)。
{
"ConnectionStrings": {
"SqlConnectionString": "server=myddatabaseserver;user=tom;password=123;"
},
"MyCustomStringSetting": "Override Some Name",
"MailSettings": {
"PrivateKey": "xYasdf5678asjifSDFGhasn1234sDGFHg"
}
}
将新的设置文件添加到.gitignore
。然后从local.settings.json
中删除.gitignore
并删除所有秘密值。
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet"
},
"ConnectionStrings": {
"SqlConnectionString": "--SECRET--"
},
"MyCustomStringSetting": "Some Name",
"MyCustomNumberSetting": 123,
"MailSettings": {
"FromAddress": "local-testing123@email.com",
"ToAddress": "receiver@email.com",
"MailServer": "smtp.mymailserver.com",
"PrivateKey": "--SECRET--"
}
}
然后确保包含您的额外配置文件。
var config = new ConfigurationBuilder()
.SetBasePath(context.FunctionAppDirectory)
.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
.AddJsonFile("secret.settings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
使用这种技术,至少所有设置都在源代码管理中被跟踪。所有秘密值都会被安全删除。
答案 3 :(得分:0)
您确实应该按照here 中的说明使用用户机密。这也适用于 Azure Functions。这样,未加密的文件至少保存在用户配置文件目录中,该机器上的其他用户无法读取。
您甚至不必为用户机密或环境变量注册配置源。这是由 Azure Function 运行时自动完成的。您可以通过注入 IConfiguration 以同样的方式从 环境变量、local.settings.json 和 secrets.json 访问配置:
using Burckhardt.IoT.Compressor.Data.Function.Interfaces;
using System.Text.Json;
using Microsoft.Extensions.Configuration;
namespace Burckhardt.IoT.Compressor.Data.Function.Configuration
{
public abstract class ConfigurationLoader<T> : IConfigurationLoader<T>
where T : class, new()
{
private readonly string _environmentVariableName;
private readonly IConfiguration _configuration;
protected ConfigurationLoader(IConfiguration configuration, string environmentVariableName)
{
_environmentVariableName = environmentVariableName;
_configuration = configuration;
}
public T Load()
{
var environmentVariableValue = _configuration.GetSection(_environmentVariableName).Value;
return JsonSerializer.Deserialize<T>(environmentVariableValue);
}
}
}