
Plugin do Jenkins que fornece fluxos de trabalho de aprovação de scripts e sandboxing Groovy para garantir a execução segura de scripts, com verificações de permissão cientes de ACL e gerenciamento de lista de permissões para administradores.
(adaptado de informações sobre o Template plugin in CloudBees Plugins guide)
Vários plugins do Jenkins exigem que os usuários definam scripts personalizados, mais comumente na linguagem Groovy, para personalizar o comportamento do Jenkins. Se todos os que escrevem esses scripts forem administradores do Jenkins — especificamente se tiverem a permissão Overall/RunScripts, usada por exemplo pelo link Script Console — então eles poderão escrever quaisquer scripts que desejarem. Esses scripts podem referenciar diretamente objetos internos do Jenkins usando a mesma API oferecida aos plugins. Esses usuários devem ser completamente confiáveis, pois podem fazer qualquer coisa no Jenkins (até alterar suas configurações de segurança ou executar comandos de shell no servidor).
No entanto, se alguns autores de scripts forem "usuários comuns" com apenas permissões mais limitadas, como Job/Configure, não é apropriado permitir que eles executem scripts arbitrários. Para apoiar essa divisão de papéis, o plugin da biblioteca Script Security pode ser integrado a vários plugins de funcionalidades. Ele suporta dois sistemas relacionados: aprovação de scripts e sandbox do Groovy.
O primeiro e mais simples sistema de segurança é permitir que qualquer tipo de script seja executado, mas somente com a aprovação de um administrador. Existe uma lista mantida globalmente de scripts aprovados que são considerados como não realizando ações maliciosas.
Quando um administrador salva algum tipo de configuração (por exemplo, um job), os scripts que foram editados pelo administrador são aprovados automaticamente e estão prontos para serem executados sem nenhuma intervenção adicional. Para scripts que foram enviados por usuários com menos privilégios, haverá avisos apropriados indicando que a aprovação é necessária. Os administradores podem aprovar esses scripts usando a página de configuração Script Approval ou editando o script e salvando-o. Em versões anteriores do Script Security Plugin, os administradores podiam aprovar automaticamente scripts enviados por usuários sem privilégios, salvando-os sem fazer quaisquer alterações, mas essa funcionalidade foi desativada para prevenir ataques baseados em engenharia social. ("Salvar" geralmente significa pela interface web, mas também pode significar enviar uma nova configuração XML via REST ou CLI.)
Quando um não administrador salva uma configuração de template, é feita uma verificação para saber se algum dos scripts contidos foi editado em relação a um texto aprovado. (Mais precisamente, se o conteúdo solicitado já foi aprovado anteriormente.) Se não foi aprovado, uma solicitação de aprovação para este script é adicionada a uma fila. (Um aviso também é exibido na interface da tela de configuração quando o texto atual de um script não está atualmente aprovado.)
Um administrador pode agora ir para Manage Jenkins » In-process Script Approval onde uma lista de scripts pendentes de aprovação será exibida. Supondo que nada com aparência perigosa esteja sendo solicitado, basta clicar em Approve para permitir que o script seja executado daí em diante.
Se você tentar executar um script não aprovado, ele simplesmente falhará, tipicamente com uma mensagem explicando que está pendente de aprovação. Você pode tentar novamente depois que o script for aprovado. Os detalhes desse comportamento podem variar de acordo com o plugin de funcionalidade que integra essa biblioteca.
Esperar que um administrador aprove cada alteração em um script, por mais aparentemente trivial que seja, pode ser inaceitável em uma equipe distribuída por fusos horários ou durante prazos apertados. Como opção alternativa, o sistema Script Security permite que scripts Groovy sejam executados sem aprovação, desde que se limitem a operações consideradas inerentemente seguras. Esse ambiente de execução limitado é chamado de sandbox. (Atualmente não há implementações de sandbox disponíveis para outras linguagens, portanto todos esses scripts devem ser aprovados se configurados por não administradores.)
Para alternar para este modo, basta marcar a caixa Use Groovy Sandbox abaixo do campo de entrada do script Groovy. Scripts em sandbox podem ser executados imediatamente por qualquer pessoa. (Até mesmo administradores, embora o script esteja sujeito às mesmas restrições, independentemente de quem o escreveu.) Quando o script é executado, cada chamada de método, construção de objeto e acesso a campo é verificada contra uma lista de permissões de operações aprovadas. Se uma operação não aprovada for tentada, o script é interrompido e o recurso correspondente do Jenkins não pode ser usado ainda.
O plugin Script Security vem com uma pequena lista de permissões padrão, e os plugins integrados podem adicionar operações a essa lista (tipicamente métodos específicos desse plugin).
Mas você não está limitado à lista de permissões padrão: toda vez que um script falha antes de executar uma operação que ainda não está na lista de permissões, essa operação é adicionada automaticamente a outra fila de aprovação. Um administrador pode ir para a mesma página descrita acima para aprovação de scripts inteiros e ver uma lista de aprovações de operações pendentes. Se Approve for clicado ao lado da assinatura de uma operação, ela é imediatamente adicionada à lista de permissões e fica disponível para scripts em sandbox.
A maioria das assinaturas terá a forma method class.Name methodName arg1Type arg2Type…,
indicando uma chamada de método Java com uma classe "receptora" específica (this), nome do método e
lista de tipos de argumentos (ou parâmetros). (A assinatura mais geral de uma chamada de método tentada
será oferecida para aprovação, mesmo quando o objeto real sobre o qual ela seria chamada fosse
de um tipo mais específico que sobrescreve esse método.) Você também pode ver staticMethod para
métodos estáticos (de classe), new para construtores e field para acessos a campos (get ou
set).
Administradores em ambientes sensíveis à segurança devem considerar cuidadosamente quais operações
incluir na lista de permissões. Operações que alteram o estado de objetos persistidos (como
jobs do Jenkins) geralmente devem ser negadas. A maioria dos métodos getSomething é inofensiva.