将函数源代码添加到源代码管理存储库中时,如何正确处理local.settings.json文件中的机密

时间:2018-10-28 06:55:19

标签: git security azure-functions

我有一个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中的秘密的最佳实践是什么。

4 个答案:

答案 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

  

事实证明,您可以在提交/签出上编写自己的过滤器来替换文件。

     

这些被称为cleansmudge过滤器。

     

.gitattributes文件中,您可以为特定路径设置过滤器,然后设置脚本以在检出文件之前(“涂抹”)和在暂存文件之前(“清洁”)。

可以将这些过滤器设置为执行各种有趣的事情。
因此,您可以编写自己的过滤器,以在提交/签出时对文件进行替换。

enter image description here

答案 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.jsonsecrets.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);
        }
    }
}