A melhor maneira de armazenar uma senha de banco de dados em um arquivo de script/configuração de inicialização?

StackOverflow https://stackoverflow.com/questions/10731

  •  08-06-2019
  •  | 
  •  

Pergunta

Portanto, nossos aplicativos de servidor web precisam se conectar ao banco de dados, e alguns outros aplicativos possuem scripts de inicialização que são executados no momento da inicialização.

Qual é a melhor forma de armazenar o nome/senha desses aplicativos, em termos de

  • segurança, por ex.talvez não queiramos que os administradores de sistemas saibam a senha do banco de dados
  • manutenibilidade, por ex.tornando a configuração fácil de alterar quando a senha muda, etc.

soluções Windows e Linux apreciadas!

Foi útil?

Solução

A melhor maneira de proteger sua senha é parar de usá-la.Use uma conexão confiável:Como:Conecte-se ao SQL Server usando a autenticação do Windows no ASP.NET 2.0.Então você não tem nada a esconder - publique seu web.config e fonte para o mundo, eles ainda não conseguirão acessar seu banco de dados.

Se isso não funcionar para você, use o integrado sistema de criptografia de configuração em ASP.NET.

Outras dicas

PostgreSQL oferece uma boa solução para este tipo de situação em sua documentação.Essencialmente, você usa ssh para conectar uma porta da sua máquina à porta do servidor PostgreSQL na máquina remota.Isso tem três estágios de autenticação:

  1. Restrinja o acesso à porta local, como permitir que apenas um usuário específico se conecte a ela.
  2. Configure uma conexão sem senha com o host PostgreSQL com ssh como um usuário específico.
  3. Permita que o usuário ssh se conecte para ter acesso local ao PostgreSQL sem uma senha.

Isso reduz a segurança de suas contas de usuário estarem seguras e sua configuração ssh ser correta, e você não precisa de uma senha armazenada em qualquer lugar.

Editar:Devo acrescentar que isso funcionará com qualquer banco de dados que escute uma porta TCP/IP.Acontece que está descrito no PostgreSQL.E você vai querer que o iptables (ou o equivalente no Linux) faça as restrições de porta.Ver esse.

Eu concordo com lomaxx:se alguém já estiver no servidor ou tiver amplo acesso a ele (como um administrador de sistema), o jogo estará praticamente encerrado.Portanto, a ideia seria usar um servidor em que você confia e que seja seguro na medida que você deseja.Especificamente:

  • Você precisa confiar nos administradores de sistemas
  • Você precisa confiar em qualquer outra pessoa que esteja executando código no mesmo servidor (é por isso que a hospedagem compartilhada é uma grande proibição para mim)

Além disso, as variáveis ​​de ambiente parecem ser uma escolha popular para armazenar esses tipos de credenciais, porque isso significa que o acesso apenas à fonte (por exemplo, comprometendo a caixa de desenvolvimento) não a revela diretamente e também pode ser bem localizada para cada servidor (dev, teste, etc).

texto simples?Se eles estiverem no seu servidor, espero que o servidor seja seguro o suficiente para não permitir acesso não autorizado.Se as pessoas puderem acessar seus arquivos de configuração no servidor, algo deu errado muito antes.

esclarecimento:em termos de segurança, facilidade de manutenção (por ex.se o login precisar ser alterado, posso encontrá-lo mais tarde, etc.)

@lomax:talvez eu não queira que todos tenham acesso ao servidor físico (por exemplo,sysadmins) para ver a senha.

Obrigado!

Na maioria dos casos, acredito que seja suficiente ofuscar a senha em um arquivo de texto simples (por exemplo.com base64).Você não pode proteger completamente uma senha armazenada contra um determinado administrador de sistema com acesso root, portanto, não há necessidade de tentar.A ofuscação simples, no entanto, protege contra a revelação acidental da senha a um surfista de ombro.

Uma alternativa mais complexa é configurar um servidor de senha seguro dedicado que:

  • fornece um serviço de descriptografia de senha
  • na verdade armazena as senhas para uso por outros servidores menos seguros

Dependendo dos protocolos de rede usados, isso pode não proteger contra um administrador de sistema não autorizado com tcpdump.E provavelmente também não protegerá contra um determinado administrador de sistema com um depurador.Nesse ponto, talvez seja hora de olhar para algo como os tickets Kerberos.

Você pode inserir uma chave de criptografia simétrica em seu binário e fazer com que esse binário leia um nome de usuário/senha criptografado de um arquivo no disco quando for inicializado.

No entanto, isso não é muito mais do que ofuscação, já que é provável que seu código esteja armazenado em algum repositório de origem em algum lugar.

Eu sugeriria que seria melhor você controlar o acesso aos seus servidores, tanto fisicamente quanto pela rede, usando um firewall e uma bolha de rede privada, e armazenar as senhas em formato claro (ou codificado em base 64) no disco com permissões bloqueadas. para o usuário de execução do seu aplicativo da web.

Você também pode bloquear o servidor de banco de dados para aceitar apenas conexões de máquinas de aplicativos da web por IP.

Em última análise, seu problema é que a chave (seu par nome de usuário/senha do banco de dados) precisa estar disponível para uso programático e autônomo por seus aplicativos da web.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top