Como alguém lida com dados confidenciais ao usar o Github e o Heroku?

49

Ainda não estou acostumado com o modo como o Git funciona (e me pergunto se alguém além de Linus está;)).

Se você usar o Heroku para hospedar seu aplicativo, precisará verificar seu código em um repositório Git. Se você trabalha em um projeto de código aberto, é mais provável que compartilhe esse 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 Git, pois você o usa para enviar seu código ao Heroku.

Como trabalhar com este caso de uso?

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

Jonas
fonte
3
Eu começaria usando um repositório particular. Então, dependendo do quanto eu confie, posso .gitignore meus arquivos de configuração que contêm os dados confidenciais e somente os versão localmente. (Sendo local um local não externa central, que pode ser um no servidor de casa ou quem sabe)
Rig

Respostas:

30

O método preferido de manter as senhas / chaves da API secretas no heroku é definir valores de configuração por meio do aplicativo de linha de comando heroku. O exemplo a seguir, retirado de um artigo do heroku dev center

(O exemplo abaixo e toda a minha resposta estão relacionadas 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 no 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 seu .bashrcarquivo

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

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

Mike Vormwald
fonte
17

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

Ofuscação (apenas para código)

Para as partes do código que você deseja ocultar, você pode colocá-las em um projeto diferente, compilá-las e fazer check-in apenas do código compilado, não da fonte? Isso não é criptografia e não é adequado para criptografar senhas ou chaves. As pessoas ainda podem fazer engenharia reversa do seu código compilado, mas não obtêm a fonte.

Repositório GIT privado

Ele precisa ser um repositório público git?

Armazenamento do servidor

Você pode armazenar essas informações em um arquivo protegido no diretório inicial da conta de usuário sob a qual o aplicativo é executado? Eu copiaria a maneira como o ssh faz isso com ~ / .ssh / id_rsa e um chmod de 600. Falhando nisso, 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 alguma coisa.

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 senha ou certificado. Compartilhar uma chave simétrica com os amigos fica confuso.

Criptografia assimétrica (para vários desenvolvedores)

Se outros desenvolvedores precisarem verificar coisas secretas em um repositório público git, foi criada uma criptografia de chave pública / chave 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 a partir dela. Criptografe seus dados secretos usando a chave pública do servidor. Somente o servidor pode descriptografar esses dados usando sua chave privada. Você pode até verificar a chave pública no controle de origem para que outras pessoas possam criptografar dados usando a mesma chave pública e apenas o servidor possa descriptografá-los.

Ferramenta

O Openssl é provavelmente a única ferramenta de criptografia 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" for um servidor Web que use https, você já deve ter algum tipo de armazenamento de chaves seguro no servidor para armazenar a chave privada. esta. Talvez eles tenham algumas dicas de como os outros resolvem o desafio que você está enfrentando?

GlenPeterson
fonte
Para adicionar, o WRT ao armazenamento no servidor - não sei se você pode fazer isso com o Heroku, mas vi configurações em que um script é disparado do gancho pós-recebimento e / ou algo como Capistrano no servidor de implantação para copie o arquivo do banco de dados de implantação no local correto. Isso permite manter completamente o arquivo do banco de dados fora do repositório e ter um mecanismo automático para garantir que essas informações ainda estejam no local.
Shauna
Mesmo repositórios GIT privados devem proteger dados confidenciais. Apenas no caso de tornar-se público por acidente por um tempo. Além disso, acho que a criptografia assimétrica sempre deve ser usada, em vez de simétrica. Não vejo nenhuma desvantagem, apenas essa vantagem: você pode até deixar as APIs em algum lugar para facilitar a criptografia de novos dados sensíveis a serem codificados.
Tiberiu-Ionuț Stan
7

Se você deseja executar seu código no Heroku, é necessário fornecer a ele - não é possível mantê-lo em "segredo" do seu provedor de hospedagem.

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

Richard Nichols
fonte
11
Obrigado, mas qual é o fluxo de trabalho para isso?
Jonas
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 é desaprovada pelos especialistas em segurança porque funciona muito mal.

Em vez disso, senhas, chaves criptográficas etc. devem ser mantidas separadas 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 no seu código-fonte! Essa é uma prática muito ruim.

Veja também:

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

DW
fonte