É possível executar um script bash em uma espécie de sandbox?

13

Nosso produto precisa executar um script bash desconhecido em um servidor delicado para atingir um determinado objetivo. Este script bash é fornecido pelo usuário. Estamos interessados ​​em garantir que apenas comandos específicos sejam permitidos e que todos os outros não sejam. Além disso, precisamos substituir alguns comandos por outros.

Por exemplo, gostaríamos de executar o script e permitir os seguintes comandos: echo cat awk

Mas não permita nenhum outro comando (não queremos fornecer uma lista específica aqui).

Além disso, se o script contiver o comando cp, gostaríamos de capturá-lo e redirecioná-lo para um comando diferente (o que pode ser feito usando o alias).

Alguma idéia de como isso é feito?

Yon
fonte

Respostas:

9

A maneira mais fácil é usar uma prisão chroot contendo apenas os comandos que você deseja que o script possa executar. Em seguida, você executa o script através de um wrapper que chama chrootno diretório e, em seguida, executa o script.

Ignacio Vazquez-Abrams
fonte
17

Não há 100% de segurança na execução do script dentro de uma máquina virtual, o que presumivelmente impediria o script de atingir seu objetivo. Mas existem dois recursos que podem ajudá-lo. Se você está preocupado que o script tenha sido escrito por uma pessoa mal-intencionada, esses recursos não serão suficientes; mas se você estiver preocupado apenas que o script possa fazer coisas ruins ao seu sistema porque foi escrito por um programador descuidado ou com objetivos diferentes em mente, um desses dois recursos fornece um ambiente de sandbox decente.

  • Você pode executar um shell restrito chamando o bash como bash -r. Eu o refiro ao manual do bash para uma descrição detalhada; a idéia básica é que o script não possa invocar comandos que não estão $PATH, não pode mudar $PATH, não pode redirecionar para ou de um arquivo e mais algumas restrições. Isso é bastante simples de configurar, mas se o script desconhecido for muito complicado para você revisar, é provável que você use muitas coisas que são proibidas em um shell restrito.

  • Você pode configurar uma prisão chroot . A idéia é configurar uma árvore de diretórios /some/roote executar o script em um ambiente que acredite /some/rootser o sistema de arquivos inteiro ( chrootabreviação de change root). Depois que a árvore de diretórios estiver configurada, execute o script (copiado para /some/root/myscript) como chroot /some/root /bin/bash /myscript. Por exemplo, você configuraria um diretório /some/root/bincom os comandos que deseja permitir e o programa chroot veria esse diretório como /bin. Você precisará copiar tudo o necessário para a execução do programa dentro do chroot: bibliotecas, arquivos de dados bash, o próprio script, etc. O script pode precisar ser /procmontado dentro do chroot; você pode fazer isso com um comando como mount -t proc proc /proc.

    Se você precisar disponibilizar uma árvore de diretórios inteira para o script, digamos /var/example, você tem várias opções. Você pode fazer uma cópia em /some/root. Você pode criar links físicos (se eles funcionarem para o seu aplicativo e o chroot estiver no mesmo sistema de arquivos). No Linux, você pode fazer o mount --bind /var/example /some/root/var/example"enxerto" /var/exampledentro do chroot. Observe que um link simbólico não pode funcionar, pois o destino do link é determinado dentro do chroot.

    Observe que o chroot não fornece segurança absoluta, principalmente contra processos em execução como root. Por exemplo, um processo raiz pode criar um arquivo de dispositivo dentro do chroot e acessar todo o disco através dele. Um processo chroot ainda pode fazer conexões de rede (você pode proibi-lo, não incluindo nenhum programa de rede no chroot e garantindo que o programa não confiável não possa criar um arquivo e torná-lo executável ou substituir um executável existente).

Gilles 'SO- parar de ser mau'
fonte
Você precisará copiar tudo o que for necessário . Posso criar links simbólicos ou físicos em vez de copiar?
Kyb 20/09/19
1
@kyb Hard link: sim. Link simbólico: não, um link simbólico só pode apontar para um arquivo que você pode ver, não permite que você escape de um chroot. É difícil usar links físicos para isso e complicado: eles quebram se você substituir o arquivo, eles expõem a cópia original, caso seja gravável dentro do chroot. Se você deseja disponibilizar uma árvore inteira, copie-a ou faça uma montagem de ligação somente leitura.
Gilles 'SO- stop be evil'
Eu preciso fazer comandos comuns disponíveis, como grep, awk, units, etc. Eu preciso copiar todos os arquivos bin e todas as dependências manualmente ou há algum truque útil para dizer explicitamente o que utils devem trabalhar em chroot?
KYB