Jakie są zalety i wady kryptograficznego podpisywania zatwierdzeń i znaczników w Git?

109

Ktoś więc ocenił moją pracę i powiedział mi, że zawsze powinienem podpisywać swoje zobowiązania i tagi kryptograficznie. Zapytany dlaczego nie wiedział, jak mi to wyjaśnić, i powiedział: „To po prostu dobra rzecz”.

Starając się unikać oczywistego scenariusza szympansa , dlaczego tak naprawdę powinienem? Czy naprawdę jest tak wiele wyraźnych zalet i żadnych wad?

Jakie są praktyczne powody, dla których chciałbym podpisywać każde zatwierdzenie i tag, który zrobię?

Madara Uchiha
źródło
3
Zakładam, że jest tak, że istnieje ślad papieru wiążący dla ciebie zobowiązanie. Nigdy wcześniej nie podpisywałem zatwierdzenia, ani w git, ani w innym systemie kontroli źródła. Jeśli twój rówieśnik uważa, że ​​istnieje ryzyko oszustwa, Twoja firma prawdopodobnie ma większe problemy z bezpieczeństwem.
James
@James: To nie jest praca firmowa, ale biorę udział w niektórych projektach otwartych i zamkniętych.
Madara Uchiha
@James: „większe problemy bezpieczeństwa” - jak co? Podpisywanie to techniczny sposób ich rozwiązania, prawda?
zerkms
8
mikegerwitz.com/papers/git-horror-story.html jest punktem wyjścia dla przypadku użycia podpisanych zatwierdzeń i tagów.
1
@James, kiedy zatwierdzasz przy użyciu konta SVN, podpisujesz swoje zatwierdzenie. Kiedy zatwierdzasz swoją globalną konfiguracją git, jesteś jedynym organem potwierdzającym, że jesteś autorem.
Florian Margaine

Odpowiedzi:

102

(Jest to w dużej mierze oparte na A Git Horror Story: Integrity Repository With Signed Commits - bardzo dobra lektura i więcej informacji niż mogłem udzielić odpowiedzi).

Istnieje wiele sposobów na skompromitowanie repozytorium git (nie jest to usterka bezpieczeństwa, tylko fakt życia - z tego powodu nie należy unikać używania git). Na przykład ktoś mógł przepchnąć Twoje repozytorium podając się za Ciebie. Lub, jeśli o to chodzi, ktoś mógł przepchnąć się do czyjegoś repozytorium, podając się za ciebie (ktoś mógłby naciskać na swoje własne repozytorium, podając się za ciebie). To tylko część życia w DVCS.

Jako przykład:

$ git config --global user.name 'Madara Uchiha'
$ git config --global user.email [email protected]

Tam zmieniłem konfigurację gita, żeby udawać, że jestem tobą. A teraz mogę oddać i pozwolić tym zatwierdzeniom jakoś wkroczyć do kompilacji produkcyjnej, i wygląda na to, że to zrobiłeś.

Dzięki podpisywaniu zatwierdzeń (i znaczników) można udowodnić, że niektóre zatwierdzenia i znaczniki były od ciebie (a rzeczy, które nie są podpisane, nie powinny były zostać wprowadzone do wersji produkcyjnej). To naprawdę klucz do tego wszystkiego - podpisując zobowiązania, które powiedziałeś, że to twoja praca.

Aspekt „twojej pracy” jest szczególnie ważny w jądrze Linuksa (a tym samym git), który czasami trafia w procesy o prawa autorskie. Podpisując zobowiązania, mówisz, że masz prawo do oprogramowania - śledzi ono pochodzenie. Możliwe, że nie masz dostępu do źródła, które jest przedmiotem roszczenia z tytułu praw autorskich, a roszczenie jest bezpodstawne. Być może firma zapomniała, że ​​pracujesz dla nich kilka lat temu i pod ich kierownictwem dodała materiał do jądra, czy cokolwiek innego.

Trwa debata, czy każde zatwierdzenie powinno być podpisane. Od podpisania GPG dla git commit? (jeszcze w '09) Linus napisał:

Podpisywanie każdego zatwierdzenia jest całkowicie głupie. Oznacza to po prostu, że zautomatyzujesz go i sprawisz, że podpis będzie mniej wart. To również nie wnosi żadnej realnej wartości, ponieważ sposób, w jaki łańcuch git DAG w pracy SHA1, potrzebujesz tylko jednego podpisu, aby wszystkie zatwierdzenia dostępne z tego były skutecznie pokryte przez ten. Więc podpisywanie każdego zatwierdzenia po prostu mija się z celem.

Tam też można przeczytać o wiele więcej na temat myśli na temat logowania się w git.

To powiedziawszy, i tak trafiło do gita.

Wydaje się, że istnieje większość zgodności co do tego, że podpisywanie zatwierdzeń jest niepotrzebne, ale znaczniki podpisywania są bardzo dobre. Ten post na blogu umieszczony na górze sugeruje, że i tak należy wszystko podpisać. Jak powiedziałem, trwa debata na temat tego, czy każde zatwierdzenie jest konieczne, czy nie.

Klucz do debaty „podpisuj każde zatwierdzenie” prawdopodobnie wiąże się z używanym przepływem pracy. Większość ludzi dokonuje wielu zatwierdzeń w lokalnym repozytorium, a następnie wypycha ten zestaw. Powinno wystarczyć otagowanie końcowej kolekcji (przy założeniu, że upewnisz się, że wszystkie zmiany są prawidłowe). Jeśli pracujesz w środowisku, w którym porusza się wiele pojedynczych zatwierdzeń, rozróżnienie między tagiem a zatwierdzeniem staje się mniej… wyraźne - a zatwierdzanie podpisów może stać się bardziej przydatne.

Haykam
źródło
5
Może to być wystarczające (aby po prostu otagować ostatni), ale dlaczego nie miałbyś po prostu otagować każdego zatwierdzenia?
hayd
3
Jako leniwy drań, który nie używa tagów, aktualizuję poprzedni komentarz. W konfiguracji git na mojej stacji roboczej mam commit.gpgsign = truei nie mogę stwierdzić żadnych wad. Choć może to być głupie, nie wydaje się zbyt drogie.
pnovotnak
3
Idę z @pnovotnak w tej sprawie, dlaczego nie zrobiłbyś tego? Mam na myśli, że podpisuję swoje zobowiązania, a inny programista nie ma tego samego projektu, kogo to obchodzi? Ale jeśli haker próbuje ukraść moją tożsamość, mogę po prostu wskazać podpisanie. Wydaje mi się, że podpisywanie ma tylko zalety. Zgadzam się, że twój podpis ma mniejszą wartość, ale wymieniasz go za to, że nie musisz o tym myśleć. To w zasadzie darmowe bezpieczeństwo.
Jappie Kerk
2
Osobiście uważam, że podpisanie każdego zatwierdzenia jest dobrą rzeczą. Mogę być całkiem pewien, że moje podpisy pochodzą ode mnie, a podszywanie się pod autora za pomocą waniliowego git jest banalne. Wolę nazwać to bezpłatną weryfikacją, ponieważ jest to osoba, którą w innym przypadku zakładasz, a nie bezpieczeństwo.
berto
1
@JosiahYoder. Nie, Github nie odmówi wypychania, ponieważ wiadomość e-mail nie jest dostępna. Załóżmy, że hostujesz swój kod w innej usłudze (np. Bitbucket) i chcesz przenieść swoje repozytorium do innego dostawcy. Zapobiegnie to przenoszeniu przez użytkowników repozytorium (wiele zatwierdzeń przez wielu użytkowników) lub tworzeniu kopii lustrzanych itp. Jest to funkcja DVCS.
Ricky Notaro-Garcia