Apa keuntungan dan kerugian dari komitmen dan tag penandatanganan secara kriptografis di Git?

109

Jadi seseorang mengintip pekerjaan saya, dan dia memberi tahu saya bahwa saya harus selalu menandatangani komitmen dan tag saya secara kriptografis. Ketika ditanya mengapa, dia tidak tahu untuk menjelaskannya kepada saya, dan berkata "Itu hal yang baik untuk dilakukan".

Mencoba menghindari skenario simpanse yang jelas , mengapa saya harus benar-benar? Apakah benar-benar ada begitu banyak kelebihan dan kekurangan?

Apa alasan praktis yang membuat saya ingin menandatangani setiap komitmen dan tag yang saya buat?

Madara Uchiha
sumber
3
Saya berasumsi bahwa ada jejak kertas yang mengikat komitmen kepada Anda. Saya belum pernah menandatangani komit sebelumnya, baik dengan git atau sistem kontrol sumber lainnya. Jika rekan Anda percaya ada risiko penipuan yang dilakukan perusahaan Anda mungkin memiliki masalah keamanan yang lebih besar.
James
@ James: Ini bukan pekerjaan perusahaan, tapi saya berpartisipasi dalam beberapa proyek sumber terbuka dan tertutup.
Madara Uchiha
@ James: "masalah keamanan yang lebih besar" --- seperti apa? Menandatangani adalah cara teknis untuk menyelesaikannya, bukan?
zerkms
8
mikegerwitz.com/papers/git-horror-story.html adalah titik awal untuk kasus penggunaan komit dan tag yang ditandatangani.
1
@James ketika Anda komit menggunakan akun SVN Anda, Anda menandatangani komit Anda. Ketika Anda berkomitmen dengan git global config, Anda adalah satu-satunya otoritas yang menegaskan bahwa Anda adalah penulisnya.
Florian Margaine

Jawaban:

102

(Ini sebagian besar didasarkan pada A Git Horror Story: Integritas Repositori Dengan Komitmen Ditandatangani — bacaan yang sangat bagus, dan lebih banyak informasi daripada yang bisa saya masukkan ke dalam jawaban.)

Ada beberapa cara di mana repositori git dapat dikompromikan (ini bukan cacat keamanan, hanya fakta kehidupan — orang tidak boleh menghindari menggunakan git karena ini). Misalnya, seseorang mungkin telah mendorong ke repositori Anda yang mengaku sebagai Anda. Atau dalam hal ini, seseorang bisa saja mendorong ke repositori orang lain yang mengaku sebagai Anda (seseorang bisa mendorong ke repositori mereka sendiri yang mengaku sebagai Anda juga). Ini hanya bagian dari kehidupan dalam DVCS.

Sebagai contoh:

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

Di sana, saya telah mengubah konfigurasi git saya untuk berpura-pura aku kamu. Dan sekarang saya bisa berkomitmen dan membiarkan komitmen itu entah bagaimana membuat jalan mereka ke produksi build, dan sepertinya Anda sudah melakukannya.

Dengan menandatangani komit (dan tag), orang dapat membuktikan bahwa komit dan tag tertentu berasal dari Anda (dan hal-hal yang tidak ditandatangani seharusnya tidak masuk ke build produksi). Itu benar-benar kunci dari semuanya — dengan menandatangani komitmen, Anda telah mengatakan itu pekerjaan Anda.

Aspek "pekerjaan Anda" sangat penting dalam kernel linux (dan karenanya git) yang terkadang dipukul dengan tuntutan hukum hak cipta. Dengan menandatangani komit, Anda mengatakan bahwa Anda memiliki hak atas perangkat lunak — itu melacak asalnya. Mungkin Anda tidak memiliki akses ke sumber yang diklaim sebagai hak cipta dan klaim tidak berdasar. Mungkin saja perusahaan lupa bahwa Anda bekerja untuk mereka beberapa tahun yang lalu dan di bawah arahan mereka menambahkan bahan ke kernel, atau apa pun.

Ada beberapa perdebatan apakah setiap komit harus ditandatangani. Dari GPG menandatangani git commit? (kembali '09), Linus menulis:

Menandatangani setiap komit benar-benar bodoh. Itu hanya berarti bahwa Anda mengotomatiskannya, dan Anda membuat tanda tangan itu kurang berharga. Ini juga tidak menambah nilai nyata, karena cara rantai-git DAG dari kerja SHA1, Anda hanya perlu satu tanda tangan untuk membuat semua komitmen dapat dicapai dari yang satu secara efektif tercakup oleh yang itu. Jadi menandatangani setiap komit tidak ada gunanya.

Lebih banyak tentang pemikiran tentang masuk git dapat dibaca di sana juga.

Yang mengatakan, itu membuat jalan ke git.

Tampaknya ada konsensus mayoritas bahwa menandatangani komitmen tidak perlu, tetapi menandatangani tag sangat baik. Posting blog yang ditautkan di atas menunjukkan bahwa seseorang harus menandatangani semuanya. Seperti yang saya katakan, ada beberapa perdebatan tentang apakah setiap komit diperlukan atau tidak.

Kunci untuk debat "tandatangani setiap komitmen" mungkin ada hubungannya dengan alur kerja yang Anda gunakan. Kebanyakan orang membuat banyak komit di repo lokal mereka, dan kemudian mendorong set itu. Itu harus cukup untuk menandai koleksi akhir (dengan asumsi, yaitu, Anda memastikan bahwa semua perubahan sudah benar). Jika Anda bekerja di lingkungan tempat banyak komit tunggal bergerak, perbedaan antara tag dan komit menjadi kurang ... berbeda — dan komit penandatanganan mungkin menjadi lebih bermanfaat.

haykam
sumber
5
Mungkin cukup (hanya menandai yang terakhir), tetapi mengapa Anda tidak hanya menandai setiap komit?
hayd
3
Sebagai bajingan malas yang tidak menggunakan tag, saya memperbarui komentar sebelumnya. Dalam konfigurasi git di workstation saya yang saya miliki commit.gpgsign = truedan saya dapat memastikan tidak ada kerugian. Meskipun mungkin konyol, sepertinya tidak terlalu mahal.
pnovotnak
3
Saya menggunakan @pnovotnak untuk yang ini, mengapa Anda tidak melakukan ini? Maksudku, aku menandatangani komitmen dan pengembang lain tidak pada proyek yang sama, siapa yang peduli? Tetapi jika seorang hacker mencoba mencuri identitas saya, saya hanya bisa menunjukkan penandatanganannya. Menurut saya penandatanganan hanya memiliki kelebihan. Saya setuju bahwa tanda tangan Anda mendapat nilai lebih rendah, tetapi Anda menukar ini karena tidak harus memikirkannya. Pada dasarnya keamanan gratis.
Jappie Kerk
2
Pendapat pribadi saya adalah menandatangani setiap komit adalah hal yang baik. Saya bisa sangat yakin bahwa komit dengan tanda tangan saya berasal dari saya, sedangkan sepele untuk menyamar sebagai penulis dengan vanilla git. Saya lebih suka menyebutnya validasi gratis itu orang yang Anda anggap sebagai bukan, keamanan.
berto
1
@JosiahYoder. Tidak, Github tidak akan menolak dorongan karena email tidak ada di layanan mereka. Katakanlah Anda meng-hosting kode Anda di layanan lain (yaitu: Bitbucket) dan Anda ingin memindahkan repositori ke penyedia lain. Ini akan mencegah pengguna mentransfer repositori (Banyak komit oleh banyak pengguna) atau membuat mirror, dll. Ini adalah fitur DVCS.
Ricky Notaro-Garcia