Azure - String de conexão no Key Vault x configurações de aplicativos

8

Para o Azure Functions e WebJobs, há algum benefício em colocar seqüências de conexão como Segredos no Key Vault em vez de colocá-las diretamente nas Configurações do Aplicativo (e referenciá-las usando o ConfigurationManager.ConnectionStrings)? Os Segredos do Cofre de Chaves do Azure destinam-se principalmente a VMs e outras, em vez de Funções e WebJobs do Azure?

Parece que está apenas adicionando uma etapa extra no desenvolvimento (atualize o Segredo no Key Vault e o Identificador Secreto nas configurações do aplicativo) e uma etapa extra no tempo de execução (uma recuperação adicional do Key Vault), com o único benefício: o Segredo nas configurações do aplicativo é um identificador em vez do segredo real. Não vejo os benefícios de segurança aqui, enquanto há prejuízos.

Anônimo1
fonte
Isso é super legal para dar a seqüência de conexão de banco de dados público sobre um impulso de erro no github :) (Se você realmente precisa de um motivo)
Tensibai
Não vejo como isso aconteceria. Estou falando de ter a cadeia de conexão nas Configurações do aplicativo, que são armazenadas na nuvem e nunca tocam na base de código.
anonymous1
Desde que seja feito na nuvem, enquanto as interações com a GUI estiverem bem, vá para o IaC puro, onde toda a sua configuração na nuvem é feita como código, e isso acontecerá um dia, esse é o principal motivo para usar um cofre. Se você não achar que é necessário, em seguida, não usá-lo ...
Tensibai
Sim, é apenas que o Identificador secreto parece tão seguro / inseguro quanto a cadeia de conexão do banco de dados. Você precisa alterar ambos ou nenhum.
anonymous1
Na verdade, algo chamado 'DB_Cx_String' referenciado na configuração do aplicativo é menos problemático do que 'jdbc: // host: port / DBname' por exemplo.
Tensibai 22/03

Respostas:

9

Os benefícios que eu os vejo são os motivos gerais para usar o Azure Key Vault

  • Segredos são armazenados centralmente com opções para autorização, auditoria, etc.
  • O Azure pode ser com script para atualizar os segredos em um timer - portanto, se uma sequência de conexões chegar às mãos erradas, ela será válida apenas por um dia (ou uma semana ou qualquer outra coisa)
  • Caso o segredo seja compartilhado entre vários aplicativos, você só precisará atualizá-lo em um local (não é o maior benefício, mas ainda é bom)
Nicolai Skovvart
fonte
11
Parece-me que você está dizendo que o cofre de chaves só é útil se vários servidores de aplicativos estiverem compartilhando os mesmos segredos. Se a cadeia de conexão for usada por um único servidor de aplicativos, não haverá vantagem no cofre de chaves.
John Henckel
3

Tenho a mesma opinião que você, não vejo sentido em usar o Key Vault nesses cenários.

Em vez disso, utilizo a Configuração de Aplicativos do Azure https://docs.microsoft.com/en-us/azure/azure-app-configuration/overview , onde simplesmente guardo todas as configurações de aplicativos. E a única sequência armazenada no serviço de aplicativo real / func / trabalho na Web seria a sequência de conexão para acessar a Configuração de Aplicativo do Azure.

Na minha Inicialização, na qual as definições de configuração são aplicadas, leio em ..settings.json e, se não estiver presente (que não deveria estar se estiver sendo executado no Azure), procuro a cadeia de conexão com a Configuração de Aplicativo do Azure.

Se ..settings.json for encontrado, significa que estou executando localmente.

..settings.json é criptografado se não estiver no arquivo gitignore.

Parece algo como isto:

var appConfigEndpoint = Environment.GetEnvironmentVariable("AppConfigEndpoint");
            var appConfigLabel = Environment.GetEnvironmentVariable("AppConfigLabel");

            if (!string.IsNullOrEmpty(appConfigEndpoint))
            {
                config.AddAzureAppConfiguration(options =>
                {
                    options.Connect(appConfigEndpoint);
                    options.Use(keyFilter: "*", labelFilter: appConfigLabel);
                });
            }
            else
            {
                config.AddJsonFile("appsettings.test.json", optional: false);
            }
Janus007
fonte
Estou muito atrasado, mas se você ainda tem a mesma opinião, precisa alterá-la. A configuração (sua referência) não é para armazenar segredos, é para armazenar configurações. A seqüência de conexão do banco de dados é um segredo, não uma configuração. KeyVault é armazenar segredos, Configuração é armazenar configuração em um armazenamento centralizado. Espero que isso faça sentido # 2
RAM
0

A recuperação do cofre de chaves pode ser um problema de desempenho. A leitura do cofre de chaves leva alguns segundos. O SLA do Azure diz apenas que levará menos de 5 segundos em 99,9% do tempo. Não garante o tempo médio, mas pela minha experiência e boatos, a média é de cerca de 2 segundos.

A menos que seu aplicativo da web esteja "sempre ativado", ele será descarregado se ficar inativo por 5 a 20 minutos. Isso significa que, a menos que você tenha muito tráfego, os tempos de resposta do seu site frequentemente serão ruins.

John Henckel
fonte
11
Você pode obter a maioria dos segredos do aplicativo apenas uma vez durante o início do aplicativo.
Miroslav Holec
0

Estamos planejando usar abaixo

Segredos - cofre de chaves do Azure

  • Rotação da chave mestra para colunas Sempre criptografadas
  • Armazenamento de certificados (pode escrever facilmente um provedor no .NET)
  • Itens sensíveis, como cadeias de conexão (ocultando outras informações de recursos), senhas etc.

Configurações - Configurações de aplicativos do Azure (ainda em pré-visualização)

  • O Watch é um método maravilhoso para a descoberta de serviços, especialmente se você precisar atualizar sinalizadores ou valores para usos operacionais.
  • Não há necessidade de reiniciar um contêiner ou instância.
Vinay
fonte