Problema com o script bash executado a partir do php como root

0

Estou fazendo um painel do qual você pode instalar aplicativos como o owncloud & complexo em seu servidor. Eu criei vários scripts bash que instalam e removem software. Eu testei todos eles do shell, tudo funciona como deveria. No entanto, quando eu executo os scripts do php como root usando o sudo no ubuntu 15.10, o apt-get & O dpkg não está funcionando como deveria.

Em visudo eu tenho:

seedbox ALL = (root) NOPASSWD: /bin/appinstaller

o appinstaller é um script bash que executa os scripts bash dos aplicativos de instalação / desinstalação (por exemplo, appinstaller plex)

Exemplo de script plex:

dpkg --configure -a
cd /tmp
wget https://downloads.plex.tv/plex-media-server/0.9.15.6.1714-7be11e1/plexmediaserver_0.9.15.6.1714-7be11e1_amd64.deb
dpkg -i plexmediaserver_0.9.15.6.1714-7be11e1_amd64.deb

Quando executo o appinstaller diretamente do bash, tudo funciona perfeitamente.

Quando executo o appinstaller do php usando (confirmei que o script está sendo executado como root):

exec("sudo /bin/appinstaller plex > /home/installer.log 2>&1 &");

Funciona, mas eu consigo apt & erros de dpkg quando tento instalar outros aplicativos como:

E: The package plexmediaserver needs to be reinstalled, but I can't find an archive for it. (even though it's installed and working)

E também dpkg --configure -a retorna um erro.

O plex está funcionando bem, mas parece que o apt não conclui o processo de instalação e fica preso em algum lugar, também executa comandos após o apt-get install / dpkg não ser executado a partir do php, mas será executado a partir do bash. Eu tentei executar o script também do cron & systemctl e eu recebo o mesmo problema.

Vale a pena notar que alguns aplicativos estão instalando / desinstalando sem problemas.

O que poderia estar fazendo a diferença entre executar o script de php / cron / systemctl ou diretamente do shell? Posso emular a sessão bash normal?

    
por J. Wilson 26.02.2016 / 07:35

1 resposta

0

Executar scripts PHP como root é uma prática perigosa. Os servidores da Web fazem o possível para impedir o escalonamento de privilégios e implementam várias medidas, como chroot jail . Eu acredito que isso pode ser a causa de seus problemas.

Em particular, dpkg precisa acessar arquivos em /var/lib/dpkg/ para poder funcionar corretamente. Você pode verificar se você tem acesso a este diretório a partir dos seus scripts PHP, por exemplo, tentando listar arquivos nele ou ler /var/lib/dpkg/status . Se você não o fizer (mesmo quando estiver executando como root), então você está realmente preso. Você pode, claro, apenas desativar a cadeia (como fazer isso depende do servidor web), mas eu não recomendaria isso. Há uma razão pela qual ele foi implementado e contornar os mecanismos de segurança expõe você a todos os tipos de ataques.

    
por 26.02.2016 / 10:46