¿Cuáles son las ventajas y desventajas de firmar criptográficamente commits y etiquetas en Git?

109

Entonces, alguien revisó mi trabajo y me dijo que siempre debería firmar mis confirmaciones y etiquetas criptográficamente. Cuando se le preguntó por qué, no sabía cómo explicármelo y dijo: "Es algo bueno".

Tratando de evitar un escenario obvio de chimpancés , ¿por qué debería realmente? ¿Existen realmente tantas ventajas distintas y ninguna desventaja?

¿Cuáles son las razones prácticas que me harían querer firmar cada compromiso y etiqueta que hago?

Madara Uchiha
fuente
3
Supongo que es para que haya un rastro de papel que vincule el compromiso contigo. Sin embargo, nunca antes he firmado un commit, ya sea con git o con cualquier otro sistema de control de fuente. Si su compañero cree que existe el riesgo de cometer fraudulentos, su empresa probablemente tenga mayores problemas de seguridad.
James
@ James: No es un trabajo de la compañía, pero sí participo en algunos proyectos de código abierto y cerrado.
Madara Uchiha
@James: "mayores problemas de seguridad" --- ¿como qué? Firmar es una forma técnica de resolverlos, ¿no?
zerkms
8
mikegerwitz.com/papers/git-horror-story.html es un punto de partida para el caso de uso de confirmaciones y etiquetas firmadas.
1
@ James cuando te comprometes a usar tu cuenta SVN, firmas tu compromiso. Cuando te comprometes con tu configuración global de git, eres la única autoridad que confirma que eres el autor.
Florian Margaine

Respuestas:

102

(Esto se basa en gran medida en A Git Horror Story: Integridad del repositorio con compromisos firmados, una muy buena lectura y más información de la que podría dar en una respuesta).

Hay varias formas en que un repositorio de git puede verse comprometido (esto no es una falla de seguridad, solo es un hecho de la vida; uno no debe evitar usar git debido a esto). Por ejemplo, alguien puede haber empujado a su repositorio afirmando ser usted. O, para el caso, alguien podría haber ingresado en el repositorio de otra persona afirmando ser usted (alguien podría empujar a su propio repositorio afirmando ser usted también). Esto es solo parte de la vida en un DVCS.

Solo como ejemplo:

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

Allí, he cambiado mi configuración de git para fingir que soy tú. Y ahora puedo comprometerme y dejar que esos compromisos de alguna manera lleguen a la compilación de producción, y parece que lo has hecho.

Con la firma de las confirmaciones (y etiquetas), se puede demostrar que ciertas confirmaciones y etiquetas fueron de usted (y las cosas que no están firmadas no deberían haber llegado a la compilación de producción). Esa es realmente la clave de todo: al firmar los compromisos, usted ha dicho que es su trabajo.

El aspecto "su trabajo" es particularmente importante en el kernel de Linux (y, por lo tanto, en git) que ocasionalmente se ve afectado por demandas de derechos de autor. Al firmar confirmaciones, usted dice que tiene derecho al software: rastrea el origen. Es posible que no tenga acceso a la fuente que se reclama como copyright y el reclamo no tiene fundamento. Puede ser que la compañía olvidó que usted trabajaba para ellos hace unos años y, bajo su dirección, agregó material al núcleo, o lo que sea.

Existe cierto debate sobre si cada compromiso debe firmarse. ¿De GPG firmando para git commit? (en el '09), Linus escribió:

Firmar cada confirmación es totalmente estúpido. Simplemente significa que lo automatizas y haces que la firma valga menos. Tampoco agrega ningún valor real, ya que la forma en que funciona la cadena git DAG de SHA1, solo necesita una firma para que todos los commits accesibles desde ese estén efectivamente cubiertos por ese. Por lo tanto, firmar cada confirmación simplemente pierde el punto.

También se puede leer mucho más sobre los pensamientos sobre iniciar sesión en git.

Dicho esto, se abrió paso en git de todos modos.

Parece haber un consenso mayoritario de que firmar confirmaciones es innecesario, pero firmar etiquetas es muy bueno. Esa publicación de blog vinculada en la parte superior sugiere que uno debe firmar todo de todos modos. Como dije, hay un debate sobre si cada commit es necesario o no.

La clave para el debate "firmar cada confirmación" probablemente tenga que ver con el flujo de trabajo que utiliza. La mayoría de las personas hacen un montón de confirmaciones en su repositorio local, y luego empujan ese conjunto. Debería ser suficiente etiquetar la colección final (suponiendo, es decir, asegurarse de que todos los cambios sean correctos). Si está trabajando en un entorno donde se están moviendo muchas confirmaciones individuales, la distinción entre una etiqueta y una confirmación se vuelve menos ... distinta, y la firma de confirmaciones puede ser más útil.

haykam
fuente
55
Puede ser suficiente (solo etiquetar el último), pero ¿por qué no etiquetarías cada confirmación?
hayd
3
Como un bastardo perezoso que no usa etiquetas, estoy exagerando el comentario anterior. En la configuración de git en mi estación de trabajo tengo commit.gpgsign = truey no puedo determinar desventajas. Si bien puede ser una tontería, no parece ser demasiado costoso.
pnovotnak
3
Voy con @pnovotnak en este caso, ¿por qué no harías esto? Quiero decir, firmo mis confirmaciones y otro desarrollador no está en el mismo proyecto, ¿a quién le importa? Pero si un hacker intenta robar mi identidad, puedo señalar la firma. Me parece que firmar solo tiene ventajas. Estoy de acuerdo en que su firma tenga menos valor, pero usted cambia esto por no tener que pensarlo. Es básicamente seguridad gratuita.
Jappie Kerk
2
Mi opinión personal es que firmar cada commit es algo bueno. Puedo estar bastante seguro de que los compromisos con mi firma provienen de mí, mientras que es trivial hacerse pasar por un autor con git de vainilla. Prefiero llamarlo validación gratuita , es la persona que de lo contrario supones que es, no la seguridad.
berto
1
@JosiahYoder. No, Github no rechazará un impulso porque el correo electrónico no está en su servicio. Digamos que estaba alojando su código en otro servicio (es decir: Bitbucket) y quería mover su repositorio a otro proveedor. Evitaría que los usuarios transfieran un repositorio (múltiples confirmaciones de múltiples usuarios) o creen espejos, etc. Es una característica de DVCS.
Ricky Notaro-Garcia