Líder en confianza digital para la era de la inteligencia artificial y la computación cuántica.   Descubra cómo Keyfactor lo Keyfactor posible.

Integración de firma de código seguro en sus prácticas de CI/CD

Firma de Código

En nuestro mundo cada vez más digital, la confianza lo es todo.

Los usuarios finales necesitan confiar en el Software con el que interactúan, los desarrolladores e ingenieros deben ser capaces de generar esa confianza, y los equipos de seguridad deben establecer los controles adecuados para habilitar todo el ciclo.

Por supuesto, como ya sabemos, establecer y mantener la confianza digital no siempre es fácil.

Una de las mejores formas de establecer la confianza digital es mediante el uso de identidades y, más específicamente, la firma de código, que verifica la autenticidad de las nuevas versiones. ¿Pero cómo se utiliza exactamente la firma de código en las organizaciones hoy en día? ¿Cuáles son algunos de los principales desafíos a los que se enfrentan los equipos al implementar la firma de código, y qué ocurre cuando esos procesos no son seguros? Quizás lo más importante, ¿cómo puede garantizar una firma de código segura en su pipeline de CI/CD?

Recientemente respondimos a estas preguntas y más durante nuestro seminario web Integración de la firma de código segura en el pipeline de CI/CD. Siga leyendo para conocer los puntos clave de esta discusión, o haga clic aquí para ver la grabación completa.

Establecer la confianza digital: Cada máquina necesita una identidad, y cada identidad debe ser gestionada

En primer lugar, hablemos de establecer la confianza digital. Cuando se trata de la firma de código, cada organización necesita crear un entorno de confianza donde los equipos de seguridad se sientan cómodos con los controles establecidos y donde los desarrolladores e ingenieros puedan trabajar como y donde quieran sin crear riesgos innecesarios.

Lograr ese equilibrio, especialmente para los equipos de DevOps, no es fácil. Entre los desarrolladores que trabajan de forma remota, las cargas de trabajo que se ejecutan en múltiples entornos y las cadenas de herramientas de DevOps que se vuelven más complejas, cada vez es más difícil saber qué es de confianza y qué no lo es. 

Aquí es donde la identidad adquiere tanta importancia – especialmente para las máquinas. En pocas palabras, cada máquina, cada dispositivo y cada carga de trabajo necesita una identidad, y cada una de esas identidades debe ser protegida y gestionada.

Los certificados de firma de código no son diferentes: Son la identidad detrás de su Software, ya que se utilizan para autenticar todo, desde compilaciones y artefactos de Software hasta imágenes de contenedores e incluso firmware y configuraciones de IoT. Como resultado, si esa identidad de firma de código se ve comprometida, se socava la confianza.

Comprender los casos de uso de la firma de código: El componente integral para la confianza digital

En los últimos años, el papel de la firma de código en el establecimiento de la confianza digital ha adquirido una importancia cada vez mayor. Los usuarios finales que descargan Software de internet esperan que dicho Software esté firmado. 

Esa realidad, combinada con el auge de los entornos de confianza cero, significa que casi todos los activos que produce una empresa deben estar firmados; cualquier cosa que sea desplegable (piense en scripts, código de infraestructura, imágenes de contenedores, aplicaciones, archivos WAR, archivos EAR, DLL, ejecutables, macros, lo que sea) necesita ser firmada porque la actividad maliciosa puede ocurrir en cualquier lugar.

Teniendo esto en cuenta, algunos de los casos de uso más comunes de la firma de código incluyen:

  • Protección de la infraestructura: Prevención de descargas no autorizadas y ransomware al permitir que solo las aplicaciones de confianza se ejecuten en su infraestructura.
  • Protección de dispositivos y firmware: Prevención del acceso no autorizado a dispositivos mediante la protección del firmware y las actualizaciones de firmware con firmas y verificación digitales.
  • Salvaguarda del Software: Garantizar que el Software publicado y distribuido esté firmado y que las claves estén protegidas.
  • Confianza en los contenedores: Establecimiento de imágenes base de confianza y firmadas digitalmente para contenedores y máquinas virtuales desplegadas en su entorno.
  • Habilitación de DevSecOps: Establecimiento de la confianza en el pipeline de CI/CD, desde la firma digital del código fuente registrado en los repositorios hasta la firma de paquetes después de la compilación.
  • Prevención de macros maliciosas: Prevención de macros no autorizadas o maliciosas en dispositivos internos al garantizar que solo se permita la ejecución de macros firmadas.

Construyendo confianza y reduciendo riesgos: El modelo de madurez de la firma de código

Dada la importancia de la firma de código para establecer la confianza digital y la amplia variedad de casos de uso de la firma de código, las organizaciones deben prestar mucha atención a sus prácticas de firma de código. Aquí es donde entra en juego la idea de un modelo de madurez de la firma de código. Ese modelo se presenta de la siguiente manera:

Nivel 0: Sin firma

  • No firmar los entregables de Software
  • Vulnerable al acceso no autorizado al código
  • Sin auditabilidad ni integridad detrás del Software

Nivel 1: Fragmentado

  • Firma de entregables de Software, pero con herramientas fragmentadas
  • Los desarrolladores gestionan sus propias claves privadas sin control centralizado
  • Las claves de firma son vulnerables a un uso indebido o a un compromiso

Nivel 2: Centralizado

  • Uso de una plataforma centralizada para la política de firma de código, el flujo de trabajo y la auditabilidad
  • Protección de claves de firma sensibles en un HSM seguro
  • No integrado con procesos o flujos de trabajo de CI/CD y no todos los casos de uso están cubiertos

Nivel 3: Integrado con CI/CD

  • Firma de todos los contenedores, artefactos y entregables de Software
  • Integrado con herramientas y flujos de trabajo de firma nativos
  • Auditabilidad y gobernanza completas sobre todos los procesos de firma

Lamentablemente, muchas organizaciones se encuentran hoy en día entre el Nivel 0 y el Nivel 1 de este modelo de madurez. El problema no es que los equipos no reconozcan la importancia de la firma de código, sino que no saben cómo firmar o no están al día con las mejores prácticas de firma.

Por ejemplo, a menudo vemos claves que se transfieren mediante unidades USB, lo que genera riesgos de exposición. O vemos a diferentes equipos utilizando distintas soluciones puntuales, lo que significa que los procesos están fragmentados y no se trasladan bien a toda la organización. 

Esto ocurre porque la firma de código segura es un desafío: es necesario que las claves sean accesibles para los equipos que las necesitan, dondequiera que estén, pero inaccesibles para aquellos que no deberían firmar con esas claves. Puede parecer un dilema sin solución (Catch-22).

Encontrar una solución: Cómo Keyfactor Signum resuelve los obstáculos comunes para la firma de código segura

¿Cómo se logra la centralización y se avanza en el modelo de madurez de la firma de código? Normalmente, los equipos deben resolver tres desafíos principales. Afortunadamente, Keyfactor Signum ofrece soluciones a estos desafíos a través de características como la protección de claves, los controles de políticas, los registros de eventos, las interfaces nativas, la autenticación y la atestación. 

Protección de claves

El desafío: Para empezar, ¿dónde se almacenan sus claves de firma de código? Con demasiada frecuencia, se guardan en unidades flash, servidores de compilación o estaciones de trabajo, todos ellos lugares vulnerables al acceso no autorizado de terceros.

La solución: Keyfactor Signum protege estas claves sensibles generándolas y almacenándolas dentro de un HSM. Es importante destacar que Keyfactor impide que estas claves salgan de ese HSM una vez generadas.

Por qué es importante: En el futuro, esta atestación de claves (o la capacidad de proporcionar una prueba a su CA pública de que las claves se generan en un HSM) será de suma importancia, ya que el CAB Forum pronto exigirá que las CA públicas dispongan de esta prueba para firmar cualquier certificado.

Auditabilidad

El desafío: A continuación, ¿quién tiene acceso para firmar código y existe un registro de auditoría de quién firmó qué, cuándo lo hizo y con qué lo firmó? No basta con almacenar y generar claves en un lugar seguro, ya que también es necesario controlar quién tiene acceso a ellas.

La solución: Keyfactor Signum establece esta auditabilidad aplicando reglas y políticas sobre quién tiene acceso a las claves, quién puede utilizarlas y para qué pueden usarse. También proporciona un registro de auditoría completo para tener visibilidad de todo lo que ocurre en el entorno.

Por qué es importante: A medida que el volumen de casos de uso que requieren la firma de código sigue creciendo, este nivel de visibilidad para verificar y validar las actividades de firma será esencial para escalar de forma segura.

Necesidad de velocidad

El desafío: Por último, los desarrolladores quieren algo fácil de usar que no altere su proceso. Entonces, si se almacenan las claves en una ubicación segura y se tienen controles estrictos sobre el acceso, ¿cómo se logra que esas claves sigan siendo fácilmente accesibles para los equipos que las necesitan para firmar código?

La solución: Keyfactor Signum hace que estas protecciones sean operativamente eficaces al integrarse en herramientas de firma nativas e incorporarse a los procesos de compilación y entrega existentes; de este modo, los desarrolladores no tienen que cambiar sus flujos de trabajo.

Por qué es importante: Permitir que sus desarrolladores sigan trabajando como ya lo hacen, mediante la introducción de integraciones nativas en sus herramientas existentes, facilita que obtengan las claves según sea necesario (evitando así ralentizaciones y/o soluciones alternativas) mientras se mantiene la seguridad mediante la autenticación a través de un proveedor de identidades.

Comprendiendo la solución: La arquitectura de la solución de Keyfactor Signum

Saber qué es Keyfactor Signum es una cosa; comprender cómo funciona exactamente y cómo se ve en la práctica es otra. Con esto en mente, a continuación se presenta un flujo de trabajo típico con Keyfactor Signum:

Una vez que el código se ha confirmado, independientemente de su origen y naturaleza, debe ser firmado. Keyfactor Signum proporciona integraciones con herramientas de firma comunes (por ejemplo, SignTool, jarsigner, Cosign, etc.) para respaldar este proceso. Dado que Keyfactor está alojado en la nube, permite a los usuarios firmar de forma segura desde cualquier lugar.

Keyfactor Signum también ofrece diferentes modelos de autenticación a través de un agente SAML/OAuth y una consola de administración. A través de la consola, los administradores tienen control y visibilidad sobre las políticas de firma, pueden conceder aprobaciones para quién puede hacer qué, y tienen acceso a los registros de auditoría para ver la actividad real.

En conjunto, esta arquitectura ofrece una solución potente que facilita el proceso de firma de código a los desarrolladores, al tiempo que otorga a los administradores todo el control necesario para centralizar la gestión y garantizar que las claves estén debidamente protegidas.

Integración completa: Incorporación de la firma segura de código en la cadena de CI/CD

Finalmente, ¿cómo encaja todo esto en la cadena de CI/CD? Con una solución como Keyfactor Signum, es posible garantizar que cualquier binario que entre en su repositorio esté firmado, sin excepción. Así es como se desarrolla el proceso:

Una vez que un desarrollador envía código a la cadena de CI/CD, este se dirige al repositorio de código fuente y su servidor de CI (ya sea Jenkins, Azure DevOps o cualquier otro) ejecuta pruebas unitarias. A partir de ahí, el código se firma utilizando el cliente Keyfactor Signum y luego se almacena en el repositorio.

En adelante, cada vez que alguien extraiga código del repositorio, este se verificará. Herramientas como SignTool, jarsigner y Cosign incorporan un componente de verificación para comprobar que el código está firmado por un certificado verificado basado en la raíz de confianza correcta. Esto significa que, incluso si alguien creara su propio certificado de firma, este estaría fuera de la raíz de confianza designada, por lo que cualquier código firmado con dicho certificado fallaría en la etapa de verificación.

Una vez que el código supera la etapa de verificación, pueden comenzar las pruebas de integración y carga, y, en última instancia, ese código puede pasar a producción. El componente clave de todo esto es que, independientemente de cuándo alguien extraiga código del repositorio, siempre hay un paso de verificación previo antes de que pueda ocurrir cualquier otra cosa.

¿Qué viene a continuación? Vea Keyfactor Signum en acción

¿Desea saber más sobre cómo integrar la firma segura de código en su cadena de CI/CD y cómo Keyfactor Signum puede ayudarle? Haga clic aquí para ver el seminario web completo, que incluye una demostración en vivo de Keyfactor Signum.