Introdução às licenças de código aberto
As licenças de código aberto são acordos legais que definem como o software de código aberto pode ser usado, modificado e distribuído. Cada projeto de código aberto inclui uma licença que especifica os direitos concedidos aos usuários e quaisquer obrigações que eles devem cumprir. Compreender as licenças é essencial para a implementação legal e segura de software de código aberto em contextos organizacionais.
O que as licenças de código aberto definem
Uma licença de código aberto é um documento legal que acompanha o código-fonte e especifica:
Permissões concedidas
As licenças concedem explicitamente aos utilizadores determinados direitos:
- Direitos de utilização: Permissão para usar o software para qualquer finalidade, incluindo aplicações comerciais.
- Direitos de modificação: Permissão para modificar o código-fonte para atender a necessidades específicas, corrigir bugs ou adicionar recursos.
- Direitos de distribuição: Permissão para compartilhar o software com outras pessoas, seja na forma original ou modificada.
- Direitos de sublicenciamento: Em alguns casos, permissão para licenciar o software para outros sob termos diferentes.
Sem uma licença explícita, a lei de direitos autorais proíbe o uso, modificação ou distribuição de software. A licença fornece permissão legal para essas atividades.
Obrigações impostas
As licenças normalmente impõem requisitos aos usuários:
- Requisitos de atribuição: Deve preservar os avisos de direitos autorais e o texto de licença em cópias distribuídas.
- Divulgação do código-fonte: Algumas licenças exigem o fornecimento de código-fonte ao distribuir binários.
- Preservação da licença: Deve incluir o texto da licença com cópias distribuídas.
- Licenciamento de trabalho derivado: Algumas licenças exigem trabalhos derivados para usar a mesma licença (copyleft).
- Concessão de patentes: Algumas licenças incluem concessões explícitas de patentes ou cláusulas de rescisão defensiva.
Isenções de responsabilidade e garantia
Quase todas as licenças de código aberto se isentam de responsabilidade e garantias:
- Sem garantia: O software é fornecido "no estado em que se encontra" sem garantias de comercialização, adequação à finalidade ou não violação.
- Sem responsabilidade: Os autores e detentores de direitos autorais não são responsáveis por danos resultantes do uso do software.
- Risco do utilizador: Os utilizadores aceitam todos os riscos associados à utilização do software.
Essas isenções de responsabilidade protegem os desenvolvedores de código aberto de responsabilidade legal, reconhecendo que o software normalmente é fornecido livremente sem compensação.
A definição de código aberto
A Open Source Initiative (OSI) mantém a definição autorizada de código aberto que especifica os critérios para que as licenças sejam consideradas verdadeiramente de código aberto:
Requisitos principais
De acordo com a definição de código aberto, as licenças de código aberto devem:
Redistribuição gratuita:
- Sem restrições: As licenças não podem restringir ninguém de vender ou dar o software como parte de uma distribuição agregada.
- Sem royalties: As licenças não podem exigir royalties ou taxas por tais vendas.
Inclusão do código-fonte:
- Disponibilidade: Os programas distribuídos devem incluir código-fonte ou fornecer instruções claras para obtê-lo sem nenhum custo.
- Formulário preferido: O código-fonte deve estar na forma preferida para modificações.
- Sem ofuscação: O código-fonte deliberadamente ofuscado não satisfaz o requisito.
Trabalhos derivados:
- Modificações permitidas: As licenças devem permitir modificações e trabalhos derivados.
- Mesmos termos: As licenças devem permitir a distribuição de modificações nos mesmos termos do software original.
Integridade do código-fonte do autor:
- Arquivos de patch: As licenças podem exigir modificações para serem distribuídas como arquivos de patch ao lado da fonte original.
- Nomeação: As licenças podem exigir que obras derivadas usem nomes ou números de versão diferentes do original.
Não discriminação de pessoas ou grupos:
- Acesso universal: As licenças não podem discriminar qualquer pessoa ou grupo de pessoas.
- Igualdade de direitos: Todos devem ter os mesmos direitos de utilização do software.
Nenhuma discriminação contra áreas de atuação:
- Qualquer finalidade: As licenças não podem restringir o uso do software em campos específicos, como negócios ou pesquisa genética.
- Uso comercial: As licenças não podem proibir o uso do software em aplicativos comerciais.
Distribuição da licença:
- Aplicação automática: Os direitos associados ao programa devem aplicar-se a todas as pessoas a quem o programa é redistribuído.
- Sem licenças adicionais: Os usuários não devem precisar executar licenças adicionais para receber esses direitos.
A licença não deve ser específica de um produto:
- Direitos autónomos: Os direitos não devem depender de o programa fazer parte de uma distribuição de software específica.
- Execução independente: Se extraído da distribuição original, o software deve ter os mesmos direitos.
A licença não deve restringir outros softwares:
- Sem contaminação: As licenças não podem impor restrições a outro software distribuído juntamente com o software licenciado.
- Agregação permitida: As licenças não podem impedir a distribuição do software juntamente com o software sob diferentes licenças.
A licença deve ser tecnologicamente neutra:
- Sem restrições de interface: As licenças não podem exigir tecnologias ou estilos de interface específicos.
- Método de execução agnóstico: As licenças não devem se importar se o software é executado clicando em ícones, linhas de comando ou interfaces da Web.
Por que esses requisitos são importantes
A Definição de Código Aberto garante que as licenças proporcionam uma liberdade significativa:
Protege a liberdade do utilizador: Os requisitos impedem que as licenças imponham restrições ocultas que prejudicariam os princípios de código aberto.
Permite o uso comercial: Ao proibir a discriminação contra campos de atuação, a definição garante que as empresas possam construir produtos usando software de código aberto.
Promove a compatibilidade: Os requisitos que limitam a forma como as licenças podem afetar outros softwares reduzem os problemas de compatibilidade.
Previne a fragmentação: Ao exigir condições razoáveis, a definição impede a proliferação de licenças quase abertas incompatíveis.
Categorias de licenças de código aberto
Embora existam muitas licenças de código aberto diferentes, elas geralmente se enquadram em duas grandes categorias:
Licenças permissivas
As licenças permissivas impõem requisitos mínimos às obras derivadas:
- Caraterísticas: Permitir a incorporação de código em software proprietário sem exigir que o software proprietário seja de código aberto.
- Prescrições: Normalmente, exigem apenas atribuição (preservando avisos de direitos autorais e texto de licença).
- Uso comercial: Totalmente compatível com o desenvolvimento de software comercial.
- Exemplos: Licença MIT, Licença Apache 2.0, Licenças BSD.
As licenças permissivas maximizam a liberdade para os usuários, permitindo-lhes criar produtos comerciais de código fechado incorporando código aberto.
Licenças Copyleft
As licenças Copyleft requerem trabalhos derivados para usar a mesma licença:
- Caraterísticas: Certifique-se de que as versões modificadas e os trabalhos derivados permaneçam de código aberto.
- Prescrições: Requer a distribuição do código-fonte e o uso da mesma licença para trabalhos derivados.
- Uso comercial: Pode ser usado em software comercial, mas os trabalhos derivados devem ser de código aberto.
- Exemplos: GNU General Public License (GPL), GNU Lesser General Public License (LGPL), Mozilla Public License (MPL).
As licenças Copyleft priorizam a liberdade de software sobre a liberdade do usuário, garantindo que o software de código aberto permaneça de código aberto mesmo enquanto evolui.
Copyleft suave
Algumas licenças ocupam um meio-termo:
- Uso da biblioteca permitido: Permitir a vinculação a bibliotecas em aplicativos proprietários sem abrir o aplicativo.
- Restrições de modificação: As modificações na própria biblioteca devem ser de código aberto.
- Exemplos: GNU LGPL, Licença Pública Mozilla.
Licenças copyleft fracas equilibram a promoção do desenvolvimento de código aberto com a permissão do uso comercial.
Seleção de licenças por projetos
Os projetos de código aberto escolhem licenças com base em seus objetivos:
Maximizando a adoção: Os projetos que priorizam a adoção generalizada geralmente escolhem licenças permissivas que não impõem obrigações significativas aos usuários.
Garantir a liberdade: Os projetos que priorizam a liberdade de software escolhem licenças copyleft que garantem que os trabalhos derivados permaneçam de código aberto.
Prevenção de garfos proprietários: As licenças Copyleft impedem as empresas de criar versões proprietárias de software de código aberto.
Proteção por patente: Os projetos preocupados com patentes escolhem licenças com concessões explícitas de patentes (como o Apache 2.0) que fornecem direitos de patente mais claros.
Compatibilidade: Os projetos podem escolher licenças compatíveis com outro software do qual dependem ou com os quais desejam se integrar.
Várias licenças
Alguns projetos usam várias estratégias de licenciamento:
Licenciamento duplo: Ofereça software sob licenças comerciais e de código aberto, permitindo que os usuários escolham quais termos se aplicam.
Empilhamento de licenças: Diferentes componentes de um projeto podem ter licenças diferentes.
Evolução da licença: Os projetos às vezes mudam de licença ao longo do tempo, embora isso exija o acordo de todos os contribuidores.
O paradoxo da transparência
A transparência do código-fonte cria benefícios e riscos de segurança:
Benefícios da transparência em termos de segurança
O código-fonte público permite melhorias de segurança:
- Muitos olhos: Milhares de desenvolvedores podem revisar o código em busca de vulnerabilidades, aumentando a probabilidade de descoberta.
- Divulgação mais rápida: Quando são encontradas vulnerabilidades, estas podem ser divulgadas e corrigidas publicamente, informando todos os utilizadores.
- Patches comunitários: Os desenvolvedores preocupados com a segurança contribuem com patches para corrigir vulnerabilidades.
- Capacidade de auditoria: As organizações podem auditar dependências de código aberto para problemas de segurança, o que é impossível com software de código fechado.
Riscos de transparência em termos de segurança
O código-fonte público também ajuda os atacantes:
- Descoberta de vulnerabilidade: Agentes mal-intencionados podem analisar o código-fonte para encontrar vulnerabilidades exploráveis.
- Desenvolvimento de exploits: Compreender os detalhes da implementação ajuda os atacantes a desenvolver exploits.
- Identificação do alvo: Os invasores podem identificar quais aplicativos usam versões vulneráveis de componentes de código aberto.
- Exploração de dia zero: Os atacantes podem descobrir e explorar vulnerabilidades antes que elas sejam divulgadas publicamente.
O equilíbrio
A investigação sugere que a transparência proporciona benefícios líquidos em termos de segurança:
Lei de Linus: "Dado o número suficiente de olhos, todos os erros são fáceis de resolver." A revisão aberta geralmente encontra e corrige vulnerabilidades mais rapidamente do que o desenvolvimento de código proprietário.
Obscuridade não é segurança: Manter o código-fonte em segredo não impede vulnerabilidades — apenas as oculta até que os invasores eventualmente as descubram.
Divulgação responsável: A comunidade de código aberto desenvolveu práticas de divulgação responsável que equilibram segurança com transparência.
Realidade prática: As violações de segurança mais graves envolvem software de código fechado ou configuração incorreta, não vulnerabilidades de código aberto, sugerindo que a transparência não reduz inerentemente a segurança.
Compreender as licenças de código aberto e suas categorias fornece a base para avaliar licenças específicas. A próxima unidade explora as licenças comuns de código aberto em detalhes, ajudando você a entender quais termos as licenças populares impõem e como elas diferem.