A maneira mais segura de executar o script bash usando PHP-FPM

1

Atualmente, estou executando um websever com Nginx + PHP-Fpm e cada site com seu próprio nome de usuário / GID. Então eu tenho um script bash que eu uso para criar novos usuários junto com outros materiais necessários. Eu sei que posso chamar um script usando shell_exec / suexec, mas eu estou querendo saber qual é a maneira mais segura de chamar um script bash sem comprometer a segurança do servidor?

No começo, eu estava pensando em definir um cron job para executar o script, mas a conta precisa ser ativada instantaneamente. Então o cron não vai funcionar.

Também fiz algumas pesquisas e algumas sugestões para usar o daemon do php para monitorar uma fila e executar o script quando houver um trabalho. Não tenho certeza sobre isso (daemon) desde que eu nunca tenho qualquer experiência sobre isso.

Como posso executar meu script com segurança?

Atualização:
Apenas para atualizar, decidi usar a combinação Beanstalkd + pheanstalk.

O script php enviará o trabalho para a fila e será executado por um script phonemonizado executado por um usuário separado que tenha privilégios necessários.

    
por Sam W. 13.02.2012 / 08:36

1 resposta

2

Sobre o tópico específico de usar exec em php e como ser seguro, a única coisa que você precisa cuidar é escapar dos argumentos.

i.e. não faça isso:

exec('myscript ' . $_POST['arg']);

se não for óbvio - pense no que acontece se $_POST['arg'] contiver ; rm xyz - ou pior, se você enviar a saída desse comando para a tela e contiver ; more /etc/passwd; more db-config.php etc.

portanto - escape dos seus argumentos :

$foo = escapeshellarg($whatever);
exec("myscript $foo");

No entanto, se o seu script exigir mais privilégios do que você normalmente permitiria que o seu usuário nginx tivesse - é melhor dar atenção ao conselho que você encontrou que desassocia o usuário que está executando o script bash do usuário nginx.

Semelhante à sua sugestão do daemon do php na questão, o aplicativo php envia uma solicitação para o script bash ser executado, de forma síncrona ou assíncrona, usando um job fila do sistema. A fila de tarefas apenas envia a solicitação ao seu script bash, opcionalmente retornando o resultado. Desta forma, você pode iniciar o script bash "create new user" como um usuário com permissões apropriadas, sem dar ao seu usuário nginx quaisquer privilégios extras e arriscando que essas permissões sejam exploradas em algum outro lugar se o código do seu aplicativo php. Gearman em particular, é muito fácil de configurar.

    
por 13.02.2012 / 10:29