Reinicie o PHP-FPM de um script PHP

1

Estou executando uma pilha LEMP e desejo escrever um painel de controle simples para ela.

Então, eu quero poder reiniciar php-fpm de um script php. Para conseguir isso, foi o que fiz.

Criado um invólucro binário em c como este php-shell.c :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_CMN_LEN 100

int main(int argc, char *argv[])
{
    char cmd[MAX_CMN_LEN] = "", **p;

    if (argc < 2)
    {
        fprintf(stderr, "Usage: ./php_shell terminal_command ...");
        exit(EXIT_FAILURE);
    }
    else
    {
        strcat(cmd, argv[1]);
        for (p = &argv[2]; *p; p++)
        {
            strcat(cmd, " ");
            strcat(cmd, *p);
        }
        system(cmd);
    }

    return 0;
}

Este programa foi compilado assim:

gcc php_shell.c -o php_shell

Eu adicionei o usuário nginx a sudo visudo da seguinte forma:

Defaults:nginx        !requiretty
nginx    ALL=(ALL)    NOPASSWD:/path/to/php_shell

Então eu executei o comando em um script php assim:

var_dump(shell_exec('sudo /path/to/php_shell "service nginx restart" 2>&1'));

Assim que executo este script php do script, recebo 502 Gateway Error e parece que todos os php-fpm processos foram eliminados e não iniciam o backup.

Alguma ideia? Estou fazendo isso errado? Eu quero alcançar o mesmo para nginx (ou seja, ser capaz de reiniciar o servidor nginx do script php executando service nginx restart ). Como posso conseguir isso?

    
por Latheesan 26.10.2015 / 00:08

1 resposta

0

Parabéns! Você está no caminho para dar acesso irrestrito a qualquer pessoa que possa fazer com que seu servidor nginx execute um código arbitrário. É melhor que você tenha certeza de que cada script CGI e página php e qualquer outra coisa que possa ser usada para executar código arbitrário é segura.

Seu wrapper C é equivalente a configurar o sudo para permitir que o nginx execute qualquer comando como root.

NÃO faça fazer assim.

Escreva invólucros de script de shell individuais (ou qualquer outro) para comandos específicos e conceda acesso sudo apenas a esses scripts de wrapper. Por exemplo, /usr/local/sbin/restart-nginx.sh , que nada , mas service nginx restart , dá ao nginx sudo acesso a esse script.

Em seguida, escreva outro script completamente separado para executar, digamos, dmidecode -s system-uuid como na sua pergunta anterior. E dê ao nginx sudo acesso a esse script também.

Quanto mais simples e menos complicado cada roteiro individual, melhor. O mais seguro de tudo é não receber nenhuma entrada do usuário, não da linha de comando e não de variáveis de ambiente.

Se alguns de seus scripts de wrapper precisarem de entrada do usuário, verificação de sanidade e limpeza de todas as entradas fornecidas pelo usuário antes de usá-lo. E cite suas variáveis - por exemplo, use sempre "$variable" e nunca apenas $variable sem aspas.

Se os scripts do wrapper estiverem ficando excessivamente longos e complicados, tente identificar apenas o comando mínimo ou o conjunto de comandos que precisam ser executados como root e escrevê-los como um script (ou scripts) separado, chamado por sudo do script principal. ou seja, corra o mínimo possível como root.

    
por 26.10.2015 / 01:12