A maneira mais fácil é usar um chroot jail contendo apenas os comandos que você deseja que o script possa executar. Em seguida, você executa o script por meio de um wrapper que chama chroot
no diretório e, em seguida, executa o script.
Nosso produto tem a necessidade de 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.
Então, por exemplo, gostaríamos de executar o script e permitir os seguintes comandos: eco gato awk
Mas não permite 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 redirecionar para um comando diferente (o que pode ser feito usando alias).
Alguma ideia de como isso é feito?
Não há 100% de segurança para executar o script em uma máquina virtual, o que presumivelmente impede que o script atinja sua meta. Mas existem dois recursos que podem ajudá-lo. Se você está preocupado que o script foi escrito por uma pessoa mal-intencionada, esses recursos não são suficientes; mas se você está apenas preocupado que o script possa fazer coisas ruins ao seu sistema porque ele foi escrito por um programador descuidado ou com objetivos diferentes em mente, qualquer um desses dois recursos fornece um ambiente decente de sandboxing.
Você pode executar um shell restrito invocando o bash como bash -r
. Eu o encaminho para o manual bash para uma descrição detalhada; A idéia básica é que o script não pode chamar comandos que não estão em $PATH
, não pode alterar $PATH
, não pode redirecionar para ou de um arquivo e algumas restrições a mais. Isso é bastante simples de configurar, mas se o script desconhecido for muito complicado para você revisar, provavelmente usará muitas coisas que são proibidas em um shell restrito.
Você pode configurar uma cadeia chroot . A idéia é configurar uma árvore de diretórios /some/root
e executar o script em um ambiente que acredita que /some/root
é todo o sistema de arquivos ( chroot
é a abreviaçã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/bin
com os comandos que deseja permitir e o programa chroot veria esse diretório como /bin
. Você precisará copiar todo 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 de /proc
montado 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, diga /var/example
, você tem várias opções. Você pode fazer uma cópia em /some/root
. Você pode criar hard links (se eles trabalharem para o seu aplicativo e o chroot estiver no mesmo sistema de arquivos). No Linux, você pode fazer mount --bind /var/example /some/root/var/example
para “enxerto” /var/example
dentro do chroot. Observe que um link simbólico não funciona, pois o destino do link é determinado dentro do chroot.
Note que o chroot não oferece segurança absoluta, particularmente contra processos rodando como root. Por exemplo, um processo raiz poderia criar um arquivo de dispositivo dentro do chroot e acessar todo o disco através dele. Um processo chrooted ainda pode fazer conexões de rede (você pode proibir isso por não incluir qualquer programa de rede dentro do 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).
Tags bash