Tecnologías

Licencias de software

Las licencias de software son un contrato entre el autor de un código de un software específico y los usuarios consumidores del mismo. En ellas se establecen los términos, condiciones y cláusulas que deben cumplirse para poder hacer uso del software, es decir, es un conjunto de permisos que un desarrollador le otorga a un usuario para poder usar, distribuir o modificar su programa bajo una licencia determinada. 

Objetivo 

A día de hoy se consumen una gran cantidad de dependencias sin tener en cuenta bajo que tipo de licencia están siendo usadas, y esto puede ocasionar problemas legales cuando se vaya a publicar un producto. Al utilizar dependencias dentro de nuestros proyectos tenemos que hacer un uso responsable de ellas, teniendo en cuenta incluso las dependencias transitivas. 

En caso de encontrar dentro de esas dependencias algunas no permitidas en nuestro proyecto existen las siguientes opciones:

  1. Eliminar esa librería y buscar una alternativa open source más permisiva (como MIT o Apache2).
  2. Pagar la licencia en caso de que fuera posible.
  3. Desarrollar esa parte del código, teniendo en cuenta los posibles problemas de mantenimiento y auditoría que esto puede implicar.

Para ello, a continuación se pasará a detallar el tipo de licencias existentes y como identificarlas en nuestros proyectos. 

Tipos de licencias 

Las licencias de software se suelen clasificar según los derechos que el autor se reserva sobre su producto, así pues veamos las clasificaciones conocidas.

Licencias de software libre

Este tipo de licencias permiten usar, copiar, modificar y redistribuir el software del que se está dando uso. No obstante, existen muchos tipos de licencias de software libre que pueden ser más o menos permisivas, y es importante tenerlas en cuenta. A continuación se explicarán las diferencias entre todas ellas, y también se puede visitar el apéndice de licencias de software libre para verlo con más detalle.

Permisivas

Este tipo de licencias permiten crear una obra derivada del software que se está usando sin ningún tipo de restricción. En esta categoría podríamos encontrar las siguientes:

  • Academic Free License v.1.2
  • Apache Software License v.1.1 
  • Artistic License v.2.0 
  • Attribution Assurance license 
  • BSD License
  • MIT License
  • University of Illinois/NCSA Open Source License
  • W3C Software Notice and License
  • Zope Public License v.2.0 
  • Open LDAP License v.2.7 
  • Perl License
  • Academic Free License v.3.0 
  • PHP License v.3.0 
  • VMS License

Protegidas con copyleft 

Al contrario que copyright, este tipo de licencias no permiten añadir ningún tipo de restricción adicional sobre el producto. Así que si se ha modificado el software, toda modificación añadida debe ser software libre y deben licenciarse bajo los mismos términos y condiciones de la licencia original. 

En esta categoría podríamos encontrar las siguientes licencias:

  • Common Public License v.1.0
  • GNU General Public License
  • GNU General Public License v.2.0
  • GNU General Public License v.3.0
  • Eclipse Public License
  • eCos License v.2.0
  • Sleepycat Software Product License
  • Affero License v.1.0
  • Affero License v.2.0
  • OpenSSL License

Protegidas con copyleft débil o híbridas

Contienen una cláusula que obliga a que las modificaciones que se realicen al software original se deban licenciar bajo los mismos términos y condiciones de la licencia original, pero que las obras derivadas que se puedan realizar de él puedan ser licenciadas bajo otros términos y condiciones distintas.

En esta categoría podríamos encontrar las siguientes licencias:

Licencias de software privativo

Su uso,  modificación y redistribución está prohibido y requiere que se solicite autorización para ello.

Licencias de software comercial

Desarrollado por una empresa que pretende ganar dinero por su uso, sin hacer diferencia en que este sea software libre o propietario.

Algunos ejemplos conocidos de este tipo de software son: el sistema operativo Windows, Microsoft Office, Adobe Photoshop, entre otros.

Software de dominio público

Se permite uso, copia, modificación o redistribución con o sin fines de lucro.

Otros tipos de licencias conocidas

Freeware

Se usa para programas que permiten su redistribución pero no la modificación y no tienen su código fuente disponible.

Shareware

Este software permite redistribuir copias pero debe pagarse una licencia por uso continuado.

Identificación de licencias en nuestros proyectos

Hay varias formas de realizar este proceso:

  • A través de software privativo. 
  • A través de plugins de Maven. 
  • A través de software libre que puede ser incluido en nuestro ciclo de CI/CD, como por ejemplo Jenkins

Software comercial

En esta sección vamos a explicar la alternativa que nos ha parecido más interesante que requiere suscripción Ultimate con Gitlab.

Gitlab License Compliance

Dentro de las opciones de los proyectos de Gitlab podemos incluir ciertos plugin para realizar tareas sobre ellos. En este caso existe la opción de incluir la herramienta Auto License Compliance mediante la opción Auto DevOps.

Esta solución usa la herramienta Open Source License Finder para detectar las licencias, incluidas las de tercero, de las dependencias de los proyectos. Gitlab comprueba el reporte de licencias, las compara y las muestra en el merge request, de forma que seremos capaces de ver si ha ocurrido un problema de compliance durante su comprobación e impedir que se realice el merge en caso negativo.

Además dispone de unas políticas donde puedes aceptar o denegar licencias de forma cómoda:

Plugins de Maven

Existen diferentes alternativas que consisten en incluir un plugin en maven indicando las licencias que queremos evitar en una lista negra, de forma que si hay alguna coincidencia el proceso de construcción de maven dará un error que pararía el ciclo de CI/CD.

Varios ejemplos de alternativas creadas por usuarios de GitHub son las siguientes:

Aunque son soluciones a tener en cuenta, no se trata de software que lleve actualizaciones constantes y que tenga un soporte fiable.

Software Open Source

Este tipo de soluciones son las más habituales en cuanto al control del compliance. Hay que tener en cuenta que para usarlas hay que introducirlas dentro de nuestro ciclo de CI/CD y por lo general no suele ser un proceso fácil, como podría ser la opción de GitLab. Hay que llevar a cabo configuración, en algunos casos crear imágenes de Docker personalizadas o usar las genéricas que ocupan bastante espacio, opción que puede resultar problemática.

A continuación se exponen las más conocidas:

FOSSA

Se trata de un analizador de dependencias bajo una licencia MPL-2.0 que es capaz de identificar licencias de librerías directas y de terceros usadas en el código. Esta alternativa la usa por ejemplo Docker a través de la su imagen publicada en Docker Hub

FOSSA es capaz de analizar múltiples lenguajes de programación como PHP, Java, Python, Ruby, entre otros. También es integrable en herramientas del ciclo CI/CD como JenkinsGitlab, etc. 

Aunque se presenta como una opción Open Source, tiene limitaciones en su uso y requiere registrarte en su web para obtener un API Key que será usado para administrar los proyectos a través de su interfaz. Para obtener más privilegios en su uso hay que suscribirse.

FOSSology

Se trata de una alternativa Open Source bajo licencia GPL-2.0 que al igual que FOSSA, es capaz de identificar licencias de librerías directas y de terceros usadas en el código. Puede usarse a través de la línea de comandos y de una interfaz que conecta con una base de datos para administrarlo mediante un cliente web. 

FOSSology es usado por compañías como HP, Siemens, The Linux Foundation, entre otras.

License Finder

Se trata de una alternativa Open Source bajo licencia MIT, que está pensada para comparar las licencias encontradas en las dependencias del proyecto contra una lista creada por el usuario para generar un reporte deseable. 

License Finder está desarrollado en Ruby y puede descargarse como gema del mismo. Es capaz de interpretar múltiples lenguajes como Java, C++, JavaScript, Go, entre otros. 

Presenta una imagen en Docker Hub que tiene instalados todos los paquetes necesarios para usar todas sus opciones, aunque ocupa más de 2 GB. Para evitar tener que usar la imagen completa, teniendo muchos de los paquetes sin usar y ocupando memoria innecesariamente, una buena opción para su uso sería crear una imagen propia cargando solo aquello que deseemos usar a través de Ruby, y posteriormente consumir esa imagen de Docker apropiadamente configurada. 

Entre todas las opciones Open Source comentadas anteriormente, License Finder parece la opción más interesante por su facilidad de uso e integración. No obstante requiere mayor conocimiento técnico para su apropiada configuración que las opciones privativas o integraciones directas con Maven.

✍🏻 Author(s)

Deja una respuesta