Mantendo os segredos fora do controle da fonte - estamos apenas movendo o problema?


10

Eu herdei alguns projetos nos quais os segredos estavam no controle de origem no App.config e em arquivos semelhantes. Felizmente, não é um repositório público, então o risco não é tão sério quanto poderia ter sido. Estou procurando maneiras melhores de gerenciar isso, como o Azure KeyVault. (Mas não pretendo que esta pergunta seja específica para essa solução.)

Em geral, não estamos apenas movendo o problema? Por exemplo, com o Azure KeyVault, a ID e o segredo do aplicativo tornam-se os itens necessários para manter fora do controle de origem. Infelizmente, aqui está um exemplo típico de como isso pode dar errado. Outras abordagens acabam sendo semelhantes, com chaves de API ou arquivos de keystore que você precisa proteger.

Parece-me que produtos como o Azure KeyVault não são melhores e desnecessariamente mais complicados do que manter seus segredos em um arquivo de configuração separado e garantir que ele esteja no seu .gitignore ou equivalente. Esse arquivo teria que ser compartilhado conforme necessário através de um canal lateral. Obviamente, as pessoas provavelmente enviarão um e-mail com segurança para o outro ...

Existe uma maneira de gerenciar segredos que não apenas mudam o problema? Acredito que esta pergunta tenha uma única resposta claramente definida. Por analogia, se eu perguntasse como o HTTPS não apenas move o problema, a resposta seria que as chaves da CA são distribuídas com o seu sistema operacional e confiamos nelas porque confiamos no método de distribuição do sistema operacional. (Se deveríamos ser uma pergunta separada ...)

Respostas:


12

Você poderia dizer que está apenas mudando o problema. Por fim, terá que haver um segredo armazenado em algum lugar ao qual seu aplicativo tenha acesso para ter senhas, chaves ssh, qualquer que seja.

Mas, se bem feito, você está transferindo o problema de um lugar difícil de proteger adequadamente para um que possa proteger melhor. Por exemplo, colocar segredos em um repositório público do github é como deixar as chaves da sua casa presas à sua porta da frente. Quem os quiser não terá problemas para encontrá-los. Mas se você mudar, digamos que um repositório de chaves em uma rede interna sem conectividade externa tenha uma chance muito maior de manter suas senhas seguras. É mais como manter as chaves no bolso. Não é impossível perdê-las (o equivalente a fornecer sua senha do Azure, por exemplo), mas limita a sua exposição e pressiona as chaves à sua porta.


4

Segredos como chaves de criptografia e credenciais não devem ser verificados no controle de origem por alguns motivos. A primeira é, obviamente, que as chaves e credenciais de criptografia sempre devem ser necessárias, e o controle da fonte não é uma maneira confiável de proteger as informações da divulgação. A outra razão pela qual você não deseja esses segredos em seu controle de origem é geralmente porque os segredos são geralmente (mas nem sempre) específicos para um determinado atributo do ambiente em que o aplicativo será executado. (Por exemplo, adquirir uma chave privada para criar um digital assinatura necessária para uma autorização de serviço da web, o terminal específico desse serviço da web pode estar em execução em um ambiente de controle de qualidade que exige uma assinatura de controle de qualidade).

A maneira correta de tratar um ambiente (ou segredo global) é tratá-lo como qualquer outro atributo de configuração ambiental, com controles de segurança adicionais para uma boa medida. Um módulo de código bem projetado, independente e com versão deve ser idêntico entre os ambientes, de modo que o ambiente para o qual eles são implantados informe o aplicativo sobre seus atributos (por exemplo, detalhes de conexão com o banco de dados, credenciais, pontos de extremidade de serviços da Web, caminhos de arquivos, etc ...) os detalhes de configuração cruciais para o seu aplicativo são externalizados e se tornam parâmetros de configuração do seu ambiente.

Agora, para abordar alguns de seus argumentos:

Em geral, não estamos apenas movendo o problema?

Não existe segurança perfeita; no entanto, "mover" o problema para uma área em que medidas e controles adicionais possam ser colocados melhorará a dificuldade e reduzirá a probabilidade de divulgação acidental ou maliciosa de segredos. Uma boa regra a seguir ao projetar um sistema em que os dados confidenciais devem ser protegidos é sempre colocar os controles em dois. O que quero dizer com isso é garantir que, para uma divulgação acidental ou mal-intencionada de informações confidenciais ou incidentes de segurança, ocorra uma falha ou em dois ou mais controles.

Um bom exemplo disso pode ser o armazenamento de um arquivo criptografado em um servidor. Também tenho uma chave de descriptografia secreta que devo manter em sigilo em outro arquivo.

  • Armazene a chave e o arquivo criptografado no mesmo servidor (0 controles, qualquer pessoa com acesso ao servidor pode adquirir trivialmente as informações confidenciais)
  • Execute as etapas acima e proteja o acesso a ambos os arquivos, para que possam ser legíveis apenas pelo usuário do aplicativo em tempo de execução do sistema operacional (1 Controle, comprometendo a senha do usuário root ou o usuário em tempo de execução do aplicativo permitirá que um invasor adquira informações confidenciais)
  • Armazene a chave no cofre de chaves externas, adquira a chave com várias medidas de segurança, como lista branca de endereços IP, autenticação de certificado e outras medidas no aplicativo que pode acessar o arquivo criptografado em seu sistema de arquivos. (Vários controles, várias falhas nos controles de segurança devem ocorrer para que dados confidenciais sejam comprometidos)

Novamente, não existe segurança perfeita, mas o objetivo de ter vários controles garante que várias falhas precisem ocorrer para que a divulgação ocorra.

Parece-me que produtos como o Azure KeyVault não são melhores e são desnecessariamente mais complicados,

Complicado, sim, inútil é completamente subjetivo. Não podemos discutir sobre a inutilidade de segurança adicional sem considerar realisticamente o quão sério seria para os dados confidenciais serem expostos. Se alguém pudesse usar os dados confidenciais para enviar transferências eletrônicas ilícitas para fora de sua instituição financeira, algo como um cofre de chaves é a coisa mais distante do que seria inútil.

do que manter seus segredos em um arquivo de configuração separado e garantir que ele esteja no seu .gitignore ou equivalente.

Até que alguém acidentalmente o verifique no controle de origem, agora o segredo está incorporado no histórico de controle de origem para sempre.

Obviamente, as pessoas provavelmente enviarão um e-mail com segurança para o outro ...

A segurança não é apenas uma questão técnica, é também uma questão de pessoas. Isso seria fora de tópico, no entanto, sinto que neste momento você está tentando se convencer de não fazer o necessário.

Existe uma maneira de gerenciar segredos que não apenas mudam o problema? Acredito que esta pergunta tenha uma única resposta claramente definida. Por analogia, se eu perguntasse como o HTTPS não apenas move o problema, a resposta seria que as chaves da CA são distribuídas com o seu sistema operacional e confiamos nelas porque confiamos no método de distribuição do sistema operacional.

A segurança nem sempre faz com que os problemas desapareçam, na maioria das vezes coloca controles em torno deles. Sua analogia é sucinta, porque é exatamente isso que a criptografia de chave pública-privada faz. Estamos "movendo o problema" para a CA, confiando de forma absoluta e completa em nossa CA para garantir a identidade da entidade proprietária do certificado público. Basicamente, nada menos que uma série de falhas catastróficas (por exemplo, perder a confiança na CA) teria que ocorrer para levar a um problema de segurança.

Como em muitas coisas, a segurança é uma linha que você deve traçar com base em critérios subjetivos, na natureza dos dados, nas consequências da divulgação, no apetite ao risco, no orçamento, etc.


0

Vale a pena considerar o git secretprojeto ( http://git-secret.io/ ) para manter os arquivos secretos no repositório git criptografados com chave assimétrica. As chaves públicas também estão no repositório, a chave privada não.

Os recursos dessa abordagem são:

  • quando um novo usuário / máquina precisa descriptografar arquivos protegidos - ele publica / envia sua chave pública de gpg (gnu privacy guard aka pgp). O usuário que já pode descriptografar arquivos protegidos pode criptografá-los com uma nova chave adicional - depois que o novo usuário pode descriptografar arquivos protegidos com sua chave privada.
  • obviamente, você precisa controlar quem pode confirmar / enviar push para o repositório git. Caso contrário, o invasor poderá confirmar sua própria chave pública e aguardar até que alguém autorizado criptografe novamente os arquivos protegidos com essa nova chave pública comprometida.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.