Quais são as vantagens e desvantagens de assinar criptograficamente confirmações e tags no Git?


109

Então, alguém examinou meu trabalho e me disse que eu deveria sempre assinar meus commits e tags criptograficamente. Quando perguntado por quê, ele não sabia me explicar e disse: "É apenas uma coisa boa a se fazer".

Tentando evitar um cenário óbvio de chimpanzé , por que eu deveria mesmo? Há realmente tantas vantagens distintas e sem desvantagens?

Quais são os motivos práticos que me levariam a assinar todos os commit e tags que faço?


3
Suponho que é para que haja um rastro de papel amarrando o commit a você. Eu nunca assinei um commit antes, no git ou em qualquer outro sistema de controle de origem. Se o seu colega acredita que há um risco de confirmação fraudulenta, sua empresa provavelmente tem problemas maiores de segurança.
James

@ James: Não é trabalho da empresa, mas participo de alguns projetos de código aberto e fechado.
Madara Uchiha

@ James: "maiores problemas de segurança" --- como o que? A assinatura é uma maneira técnica de resolvê-los, não é?
Zerkms 22/09/2013

8
mikegerwitz.com/papers/git-horror-story.html é um ponto de partida para o caso de uso de confirmações e tags assinadas.

1
@ James, quando você confirma usando sua conta SVN, assina seu commit. Quando você confirma sua configuração global do git, você é a única autoridade que confirma que você é o autor.
Florian Margaine 22/09

Respostas:


102

(Isso se baseia amplamente em A Git Horror Story: Integridade do repositório com compromissos assinados - uma leitura muito boa e mais informações do que eu poderia colocar em uma resposta.)

Existem várias maneiras pelas quais um repositório git pode ser comprometido (isso não é uma falha de segurança, apenas um fato da vida - não se deve evitar o uso do git por causa disso). Por exemplo, alguém pode ter enviado para o seu repositório alegando ser você. Ou, nesse caso, alguém poderia ter enviado para o repositório de alguém que afirma ser você (alguém pode enviar para o próprio repositório que afirma ser você também). Isso é apenas parte da vida em um DVCS.

Apenas como exemplo:

$ git config --global user.name 'Madara Uchiha'
$ git config --global user.email muchiha@example.com

Lá, mudei minha configuração do git para fingir que sou você. E agora eu posso me comprometer e deixar esses comprometimentos entrarem na construção da produção, e parece que você fez isso.

Com a assinatura dos commits (e tags), pode-se provar que determinados commits e tags foram de você (e coisas que não foram assinadas não deveriam ter entrado na construção da produção). Essa é realmente a chave de tudo: assinando confirmações, você disse que é seu trabalho.

O aspecto "seu trabalho" é particularmente importante no kernel do linux (e, portanto, no git) que é ocasionalmente atingido por ações de direitos autorais. Ao assinar confirmações, você diz que tem direito ao software - ele rastreia a origem. Pode ser que você não tenha acesso à fonte que está sendo reivindicada como direitos autorais e a reivindicação é infundada. Pode ser que a empresa tenha esquecido que você estava trabalhando para eles há alguns anos e, sob a direção deles, adicionou material ao kernel, ou qualquer outra coisa.

Há algum debate sobre se todo commit deve ser assinado. Da assinatura do GPG para o git commit? (em '09), Linus escreveu:

Assinar cada confirmação é totalmente estúpido. Significa apenas que você a automatiza e faz com que a assinatura valha menos. Ele também não agrega nenhum valor real, já que, da maneira como a cadeia DAG git do SHA1 funciona, você só precisa de uma assinatura para tornar todos os commits acessíveis a partir daquele que são efetivamente cobertos por esse. Portanto, assinar cada confirmação está simplesmente sem entender.

Muito mais sobre os pensamentos sobre o login no git também podem ser lidos lá.

Dito isto, ele chegou ao git de qualquer maneira.

Parece haver um consenso majoritário de que a assinatura de confirmações é desnecessária, mas a assinatura de tags é muito boa. O post no blog sugere que alguém assine tudo de qualquer maneira. Como eu disse, há um debate sobre se todo commit é necessário ou não.

A chave para o debate "assine todos os commit" provavelmente tem a ver com o fluxo de trabalho que você usa. A maioria das pessoas faz muitos commits em seus repositórios locais e depois pressiona esse conjunto. Deve ser suficiente marcar a coleção final (supondo que você tenha certeza de que todas as alterações estão corretas). Se você estiver trabalhando em um ambiente em que muitas confirmações únicas estão sendo movimentadas, a distinção entre uma marca e uma confirmação se torna menos ... distinta - e as confirmações de assinatura podem se tornar mais úteis.


5
Pode ser suficiente (apenas marcar o último), mas por que você não marcaria todos os commit?
Hayd

3
Como um bastardo preguiçoso que não usa tags, estou atualizando o comentário anterior. Na configuração do git na minha estação de trabalho eu tenho commit.gpgsign = truee não posso verificar nenhuma desvantagem. Embora possa ser bobo, não parece muito caro.
pnovotnak

3
Vou com @pnovotnak neste, por que você não faria isso? Quero dizer, assino meus commits e outro desenvolvedor não faz o mesmo projeto, quem se importa? Mas se um hacker tenta roubar minha identidade, posso apenas apontar a assinatura. Parece-me que a assinatura tem apenas vantagens. Concordo que sua assinatura ganha menos valor, mas você troca isso por não ter que pensar nisso. É basicamente segurança gratuita.
precisa saber é o seguinte

2
Minha opinião pessoal é que assinar todos os commit é uma coisa boa. Posso ter certeza de que as confirmações com minha assinatura vieram de mim, enquanto é trivial personificar um autor com vanilla git. Prefiro chamá-lo de validação gratuita , é a pessoa que você supõe ser, não a segurança.
berto

1
@JosiahYoder. Não, o Github não recusará um envio porque o email não está em seu serviço. Digamos que você estava hospedando seu código em outro serviço (por exemplo: Bitbucket) e desejou mover seu repositório para outro provedor. Impediria que os usuários transferissem um repositório (confirmações múltiplas por vários usuários) ou criassem espelhos, etc. É um recurso do DVCS.
Ricky Notaro-Garcia 22/10
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.