Pergunta

Nós armazenamos todos os nossos senhas de aplicativos e db em texto simples no controle de origem. Fazemos isso como nosso processo de criação / implantação gera arquivos de configuração necessárias e também faz implanta reais que requerem essas senhas (ou seja: a executar o SQL contra um banco de dados requer que você efetuar logon no db usando credenciais válidas). Alguém já teve uma necessidade semelhante em que você fosse capaz de implementar esse tipo de funcionalidade enquanto não armazenar as senhas em texto puro?

Foi útil?

Solução

Se o seu plano é armazenar todas as informações de código e de configuração para executar um sistema de produção diretamente do controle de versão, e sem intervenção humana, você está ferrado. Por quê? Isso tudo é apenas uma violação do velho axioma de segurança "Nunca anote a sua senha". Vamos fazer uma prova por negação.

Primeiro corte, você tem senhas de texto simples nos arquivos de configuração. Isso não é bom, eles podem ser lidos por qualquer um que pode ver os arquivos.

Segundo corte, vamos criptografar as senhas! Mas agora o código precisa saber como descriptografar as senhas, por isso, você precisa colocar a algum lugar chave de decodificação no código. O problema acaba de ser empurrado para baixo um nível.

Como sobre o uso de chaves públicas / privadas? Mesmo problema, como as senhas, a chave tem que ser no código.

O uso de um arquivo de configuração local não é armazenado no controle de versão ainda coloca a senha e os meios para lê-los se eles estão criptografados, em disquete e disponíveis para um atacante. Você pode endurecer as coisas um pouco, garantindo permissões do arquivo de configuração são muito limitados, mas devem a caixa estar enraizada você está ferrado.

O que nos leva ao porquê colocar senhas em disco é uma má idéia. Isso viola o conceito de um firewall de segurança. Uma máquina comprometida contendo informações de login significa outras máquinas será comprometida. Uma máquina mal conservados pode derrubar toda a sua organização.

Em algum ponto um ser humano vai ter que injetar o segredo fundamental para iniciar a cadeia de confiança indo. O que você poderia fazer é criptografar todos os segredos no código e, em seguida, quando o sistema é iniciado tem um ser humano inserir manualmente a chave para decifrar todas as senhas. Isto é como o sistema de senha mestra Firefox usa. É aberto a abusos já que uma vez que uma senha está comprometida, muitos sistemas podem ser comprometidos, mas é conveniente e provavelmente mais seguro desde que os usuários só tem que lembrar de uma senha e são menos propensos a escrevê-lo.

O toque final é garantir que devem as informações de login ser comprometido (e você deve sempre assumir que ele será) que A) o atacante não pode fazer muito com ele e B) você pode rapidamente encerrar as contas comprometidas . O primeiro significa apenas dar as contas tanto o acesso como eles precisam. Por exemplo, se o seu programa de sempre apenas precisa de ler a partir de um banco de dados tem que logar em uma conta restrita para SELECT. Em geral, remover todo o acesso e, em seguida, adicioná-lo apenas quando necessário. Ser mesquinho sobre os direitos para excluir para que você obtenha uma visita de mesinhas Bobby .

Este último significa que você dar a cada usuário / organização / projetar seu próprio login, mesmo que eles podem ter os mesmos direitos e privilégios exatas e acessar os mesmos dados. É um pouco mais de um aborrecimento, mas isso significa que, se um sistema é comprometido, você pode rapidamente encerrar essa conta sem desligar todo o seu negócio.

Outras dicas

Eu assumo o objetivo é que você não quer senhas privadas da sua empresa para estar disponível, criptografado, decifrado, ou de outra forma, a qualquer pessoa que deveria de outra forma ter acesso ao resto da fonte.

Aqui está como eu faço isso. Eu duplicado este padrão de TikiWiki, que faz isso também.

em algum arquivo que normalmente contém senhas, configurá-los para valores fictícios, não importa o quê. Configurá-lo para o que quer que seu cliente deveria ver. Coloque um comentário próximo para desenvolvedores para deixar esse arquivo sozinho e alterar um segundo arquivo.

No segundo arquivo, que é criado se ele não estiver lá, colocar as senhas reais. organizar para esse arquivo para ser incluído, importado, qualquer que seja, pelo primeiro arquivo.

Organizar para o seu controle de origem para ignorar esse arquivo. Poderia ser algo como isto:

# in .gitignore
localsettings.py

# in settings.py
## Alter this value to log into the snack machine:
## developers: DON'T alter this, instead alter 'localsettings.py'
SECRET_VALUE = ""
try:
  from localsettings import *
except:
  pass

# in localsettings.py
SECRET_VALUE = "vi>emacs"

Eu construí sistemas onde banco de dados pares de ID do usuário / senha não são parte da queda código. A chave é a configuração de um mecanismo de configuração site-specific. Então você pode colocar essa informação na caixa em questão, sem que seja parte do código-base.

Há um bônus: você pode não só ter senhas diferentes para diferentes gotas de código, mas também para diferentes desenvolvedores. : -)

Você não mencionou a língua, então aqui é uma solução vb.net usamos:

Imports System.Web.Security
Imports System.Security.Cryptography
Imports System.Text
Imports Microsoft.Win32

Public Class myCrypt

Private myKey As String = "somekeyhere"
Private cryptDES3 As New TripleDESCryptoServiceProvider()
Private cryptMD5Hash As New MD5CryptoServiceProvider()


Private Function Decrypt(ByVal myString As String) As String
    cryptDES3.Key = cryptMD5Hash.ComputeHash(ASCIIEncoding.ASCII.GetBytes(myKey))
    cryptDES3.Mode = CipherMode.ECB
    Dim desdencrypt As ICryptoTransform = cryptDES3.CreateDecryptor()
    Dim buff() As Byte = Convert.FromBase64String(myString)
    Decrypt = ASCIIEncoding.ASCII.GetString(desdencrypt.TransformFinalBlock(buff, 0, buff.Length))
End Function

Private Function Encrypt(ByVal myString As String) As String
    cryptDES3.Key = cryptMD5Hash.ComputeHash(ASCIIEncoding.ASCII.GetBytes(myKey))
    cryptDES3.Mode = CipherMode.ECB
    Dim desdencrypt As ICryptoTransform = cryptDES3.CreateEncryptor()
    Dim MyASCIIEncoding = New ASCIIEncoding()
    Dim buff() As Byte = ASCIIEncoding.ASCII.GetBytes(myString)
    Encrypt = Convert.ToBase64String(desdencrypt.TransformFinalBlock(buff, 0, buff.Length))
End Function

End Class

armazena senhas na forma criptografada. Escrever uma rotina personalizada que decodifica as senhas e atualiza os arquivos de configuração em tempo de compilação. Isso pode ser facilmente integrado com a ferramenta de construção como Ant.

Se fazendo em C você pode armazenar no como um array de caracteres e colocar os personagens em como referências decimais. Não sei se isso vai quebrar cordas ou não, mas pode ajudar a aliviar um pouco esse problema.

char pass[]={72, 101, 108, 108, 111};
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top