Como alguém lida com dados sensíveis ao usar o Github e o Heroku?

48

Eu ainda não estou acostumado com a maneira como o Git trabalha (e me pergunto se alguém além de Linus é;)).

Se você usar o Heroku para hospedar seu aplicativo, precisará ter seu código verificado em um repositório do Git. Se você trabalha em um projeto de código aberto, é mais provável que você compartilhe este repositório no Github ou em outros hosts do Git.

Algumas coisas não devem ser verificadas no repositório público; senhas de banco de dados, chaves de API, certificados, etc ... Mas essas coisas ainda precisam fazer parte do repositório do Git, já que você o usa para enviar seu código para o Heroku.

Como trabalhar com esse caso de uso?

Nota: Eu sei que Heroku ou PHPFog podem usar variáveis de servidor para contornar este problema. Minha pergunta é mais sobre como "ocultar" partes do código.

    
por Jonas 03.09.2012 / 19:07
fonte

4 respostas

29

O método preferido para manter as senhas / chaves da API secretas no heroku é definir valores de configuração através do aplicativo heroku commandline. O seguinte exemplo retirado de artigo do centro de desenvolvimento da heroku

(O exemplo abaixo, e minha resposta inteira está relacionada a aplicativos rails)

$ cd myapp
$ heroku config:add S3_KEY=8N029N81 S3_SECRET=9s83109d3+583493190
Adding config vars and restarting myapp... done, v14
S3_KEY:     8N029N81
S3_SECRET:  9s83109d3+583493190

Em seguida, faça referência a esses valores de configuração em seu código usando a variável ENV []

AWS::S3::Base.establish_connection!(
  :access_key_id     => ENV['S3_KEY'],
  :secret_access_key => ENV['S3_SECRET']
)

Dessa forma, suas senhas confidenciais não são armazenadas no repositório git. (Nota: Ao executar o aplicativo localmente, defina esses valores no arquivo .bashrc

Além disso, não tenho certeza do tipo de aplicativo que você está executando, mas no Rails, o heroku não usa o arquivo database.yml, ele simplesmente define seu nome de usuário / senha do banco de dados de acordo com as configurações do aplicativo. Então você pode evitar salvar essas credenciais no git

Além disso, também, se você estiver executando seu próprio aplicativo e quiser que ele permaneça privado, uma ótima alternativa para o github é bitbucket que oferece acesso privado gratuito repositórios.

    
por 09.01.2013 / 19:09
fonte
17

Várias ideias ... A criptografia de chave pública é a resposta mais flexível.

Ofuscação (somente para código)

Para as partes do código que você quer esconder, você poderia colocá-las em um projeto diferente, compilá-las e registrar apenas o código compilado, não a fonte? Isso não é encriptado e não adequado para criptografar senhas ou chaves. As pessoas ainda podem fazer engenharia reversa de seu código compilado, mas não obtêm a fonte.

Repositório GIT privado

Tem que ser um repositório público público ?

Armazenamento do servidor

Você pode armazenar essas informações em um arquivo protegido no diretório pessoal da conta de usuário em que o aplicativo é executado? Eu copiaria a maneira como o ssh faz isso com ~ / .ssh / id_rsa e um chmod de 600. Caso contrário, uma variável de ambiente poderia ser usada. Você precisa de algum lugar no servidor para armazenar algum tipo de chave, ou não há como proteger algo.

Criptografia Simétrica (apenas para você)

Se você for o único desenvolvedor, poderá colocar uma chave no servidor e ter a mesma chave em sua máquina e usar um esquema de criptografia simétrica para proteger alguns dados, como uma senha ou um certificado. Compartilhar uma chave simétrica com amigos fica confuso.

Criptografia assimétrica (para vários desenvolvedores)

Se outros desenvolvedores precisarem verificar coisas secretas em um repositório git público, foi feita uma criptografia de chave pública / privada (assimétrica) para esse tipo de coisa. Instale uma chave privada no seu servidor (não a verifique no controle de origem!) E gere uma chave pública dela. Criptografe seus dados secretos usando a chave pública do servidor. Apenas o servidor pode descriptografar esses dados usando sua chave privada. Você pode até mesmo verificar a chave pública no controle de origem para que outras pessoas possam criptografar dados usando a mesma chave pública e somente o servidor possa descriptografá-la.

Ferramenta

O Openssl é provavelmente a única ferramenta de criptografia de que você precisará. Não escreva seu próprio algoritmo de criptografia ou sua própria implementação de um algoritmo publicado.

Pensamentos finais

Se o "servidor" é um servidor web que usa https, então você já deve ter algum tipo de keystore seguro no servidor para armazenar a chave privada. É meio alucinante que uma empresa de hospedagem não faria isso. fazer concessões para isso. Talvez eles tenham algumas dicas de como os outros resolvem o desafio que você está enfrentando?

    
por 05.09.2012 / 16:09
fonte
7

Se você quer rodar seu código no Heroku, você tem que dar a ele - você não pode mantê-lo "secreto" do seu provedor de hospedagem.

No que diz respeito aos repositórios git públicos, se o seu projeto for de código aberto, mas você não quiser compartilhar os detalhes de hospedagem, será necessário manter uma bifurcação privada de seu projeto para fins de implantação.

    
por 04.09.2012 / 04:42
fonte
6

Você não deve ocultar partes do código. A segurança do seu sistema não deve depender do sigilo do código; isso é conhecido como "segurança através da obscuridade", que é mal visto por especialistas em segurança porque funciona muito mal.

Em vez disso, senhas, chaves de criptografia, etc. devem ser mantidos separados do código. Armazene-os em um arquivo de configuração separado ou em um valor de configuração que seja lido pelo código. Você não precisa armazená-los no git.

Importante: Nunca codifique chaves criptográficas, senhas ou outros segredos em seu código-fonte! Isso é uma prática muito ruim.

Veja também:

Plug: IT Security.SE é um ótimo lugar para fazer perguntas sobre segurança!

    
por 09.01.2013 / 23:29
fonte