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

问题描述 投票:0回答:5

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

git security azure-functions
5个回答
8
投票

此处所述,您可以为您的秘密添加另一个配置文件(

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": "[email protected]",
        "ToAddress": "[email protected]",
        "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
投票

请记住在每次提交更改时更改 local.settings.json 中的机密

使用

smudge-clean
机制。 smudge-clean 是一种允许您在文件通过索引时修改文件的机制。

smudge/clean 是每当您提交文件(clean)并将文件签出到工作目录(smudge)时运行的过滤器。


Smudge / clean

阅读所有相关内容并在此处进行设置:
https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes

事实证明,您可以编写自己的过滤器来在 commit/checkout 上的文件中进行替换。

这些称为

clean
smudge
过滤器。

.gitattributes
文件中,您可以为特定路径设置过滤器,然后设置将在文件签出(“污迹”)和暂存(“清理”)之前处理文件的脚本。

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

enter image description here


2
投票

您确实应该按照此处所述使用用户机密。这也适用于 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);
        }
    }
}

0
投票

您可以在没有机密的情况下提交 Json 文件,然后在本地添加机密,并且永远不会再次暂存该文件以进行提交。

此外,如果您过去提交带有机密的文件,然后再次提交不带机密的文件,则您的机密仍位于存储库中。您必须使用镐删除文件(我认为检查 filetree 命令)。


0
投票

我发现如果您命名文件,Visual Studio 可以很好地识别它

local.settings.json
(gitignored,包含您的秘密)和
local.settings.reference.json
(已提交,秘密替换为 ***)。

参考文件在解决方案树中缩进显示在实际文件下方。

当您第一次签出这样的项目时,您只需复制参考文件,添加机密即可开始使用,并且不会意外提交任何机密,因为该文件已被 gitignored。

旁注:

您可以使用任何名称代替

reference
,例如区分
dev
prod
秘密。

我尝试对网络应用程序中的 app.config 执行相同的操作,但它没有显示缩进。

© www.soinside.com 2019 - 2024. All rights reserved.