2012-05-05 19 views
8

Stavo pensando di creare un piccolo pannello di controllo Linux basato sul web (solo per divertimento).Esecuzione dei comandi di root da PHP ... Esiste un modo sicuro?

Primo potenziale problema che mi è venuto in mente è che avrei dovuto fornire le autorizzazioni a livello di utente root di Apache per eseguire quei comandi, il che comprometterebbe la sicurezza dell'intero sistema.

L'installazione di un server Web dedicato per il sistema non è realmente un'opzione.

Forse potrei eseguire una seconda istanza di Apache (mantenendo la prima per utenti regolari) ma nemmeno sicura se possibile.

Quindi, cosa ne pensate voi ragazzi? Quali sono le mie migliori opzioni qui?

Grazie in anticipo per qualsiasi input.

EDIT: Ok ragazzi grazie per tutti i suggerimenti, li terrò a mente.

+6

Le funzionalità di sicurezza che è necessario considerare, aggirare o superare sono numerose. Non pensare nemmeno a tentare ciò a meno che tu non abbia una seria conoscenza approfondita della sicurezza dei sistemi Linux. –

+0

Ogni volta che sei tentato di fare qualcosa come ** questo **, perché non chiedi alle persone di Plesk quanto è divertente [creare un pannello di amministrazione di sistema "sicuro" basato sul web] (http://arstechnica.com/ affari/notizie/2012/02/plesk-control-panel-bug-sinistra-FTC-siti-e-migliaia-più-esposti-to-anon.ars). – rdlowrey

+0

Stavo pensando di creare un piccolo pannello di controllo Linux basato sul web (solo per divertimento) - Sto pensando che dovresti uscire di più, ma poi dovrei fare qualcosa per la mia insonnia! –

risposta

5

Scrivere script specifici che possono essere eseguiti come root e utilizzare il bit setuid per farlo, in modo che Apache possa eseguire solo quegli script come root. IE

#! /usr/bin/php (or wherever your php binary is) 
<?php 
    // Some PHP code that takes in very limited user input, 
    // validates it carefully, and does a sequence of actions 
    // that you need to run as root. 

    // This could easily be a shell script (or whatever else you want) 
    // instead of PHP. That might be preferable in many situations. 
?> 

Poi assicurarsi che lo script è di proprietà di root e group'd dal tuo utente che Apache viene eseguito come:

chown root:www-data myscript.php 

Poi farlo girare come proprietario:

chmod u+s myscript.php 

E assicurati che Apache possa eseguirlo:

chmod g+x myscript.php 
+0

Eseguendo PHP con setuid, questo sembra solo un potenziale problema di sicurezza, ma sì, questo è ciò che OP vuole :) – Tibor

+0

Linux ignora il bit setuid sui linguaggi interpretati in quanto è considerato estremamente insicuro. http://unix.stackexchange.com/questions/364/allow-setuid-on-shell-scripts/2910#2910 –

3

L'esecuzione dei comandi di root tramite webserver mi sembra un'idea folle, ma comunque.

È possibile utilizzare sudo per assicurarsi che non vengano eseguiti comandi indesiderati.

piccolo esempio tratto da here, sudo config:

peter, %operator ALL= /sbin/, /usr/sbin, /usr/local/apps/check.pl 

E in php:

exec('sudo /usr/local/apps/check.pl ...'); 

essere sicuri di sfuggire in modo corretto e così via tutti gli argomenti.

Oppure si potrebbe invece costruire tabella db in questo modo:

commands (
    action, 
    serialized_parameters. 
    result, 
    return_code 
) 

utilizzare PHP per inserire i comandi a questo tavolo e il un altro script che verrà eseguito in cron da diversi utenti. Non avrai risultati in tempo reale (ma puoi averli con 30 secondi d'età) ma l'utente apache non sarà in grado di utilizzare direttamente alcun comando (ovviamente puoi limitare facilmente le azioni durante la lettura dei record).

1

Ho recentemente pubblicato un progetto che consente a PHP di ottenere e interagire con una shell Bash reale (come root se richiesto), risolve i limiti di exec() e shell_exec().Scarica qui: https://github.com/merlinthemagic/MTS

Dopo aver scaricato si dovrebbe semplicemente utilizzare il seguente codice:

$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true); 
$return1 = $shell->exeCmd('yourFirstCommand'); 
//the return will be a string containing the return of the command 
echo $return1; 

In termini di sicurezza è molto meglio che correre Apache come root. Ma lasciare PHP ovunque vicino a root è sempre difficile.

Il progetto ho costruito raggiunge una shell di root bash in uno dei 2 modi:

1) Si consente apache il diritto di sudo pitone.

O

2) si passa le credenziali di root per l'oggetto ogni volta che hai bisogno di una shell con l'installazione di root.

Scegli il tuo veleno. :) Leggi la documentazione.