2009-02-08 21 views
17

Mi piacerebbe sapere se è possibile per utente non root su linux (sto usando openSUSE) per eseguire apache senza usare il comando sudo. Tieni conto che l'utente si trova nello stesso gruppo di apache (wwwrun).
Grazie in anticipo.C'è un modo per avviare/riavviare/fermare il server Apache su linux come utente non root?

+0

SE sapevo che avrei risposto, ma invece ti dirò che questa non è una domanda di programmazione :) Seriamente, però, non conosco la risposta. È una bella domanda, infatti. –

+1

Grazie e sì, non ero sicuro se questa domanda si adattava alla programmazione, comunque ci ho provato :). – Adriana

+4

È discutibilmente correlato alla programmazione, in quanto il motivo più comune per volerlo fare, secondo la mia esperienza, è che un programmatore può riavviare più facilmente Apache nella sua casella di sviluppo. –

risposta

3

I problemi indicati in precedenza da benlumley, ovvero i file di registro e le porte riservate, possono essere facilmente superati configurando la directory e la porta del registro in httpd.conf.

+2

Non vi è alcun modo per aggirare le limitazioni di accesso alle porte privilegiate senza accesso privilegiato. – kmkaplan

+0

"Configurare la porta ... nel proprio httpd.conf" è un modo per aggirare le limitazioni di accesso alle porte privilegiate, in quanto è possibile scegliere una porta non privilegiata per l'ascolto. –

+0

Oh ok, non mi ero reso conto che una porta non standard si adattasse perfettamente a Day. – kmkaplan

1

I due problemi che posso pensare che è necessario per superare sono:

  1. autorizzazioni per i file di log - questi potrebbero essere già impostate per consentire wwwrun accedervi, ma la sua spesso un problema.

  2. Utente non root che accede a una porta con privilegi (80) - non è sicuro se/come è possibile modificarlo.

10

È possibile eseguire Apache come qualsiasi utente. Assicurati che sia impostato per utilizzare solo le risorse consentite (directory, file e, soprattutto, l'ascolto su una porta non privilegiata).

Per visualizzarlo sulla porta 80 standard HTTP (che è privilegiata) sarà necessario impostare, come root un reindirizzamento al proprio server Apache. Il modo più semplice è probabilmente l'uso di iptables. Per esempio, se il vostro server Apache è in ascolto sulla porta 8080:

iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -j REDIRECT --to-port 8080 

Se non è possibile configurare il server come questo (o il vostro amministratore di sistema farlo una volta per tutte) si dovrà utilizzare una porta non privilegiata (qualcosa come Listen 8080) e accedervi utilizzando un URL che assomiglia http://www.example.com:8080/

+0

Il problema è che non posso diventare root, quindi sto cercando un modo per superare tutto ciò che deve essere fatto come root. Ma grazie per la tua risposta. – Adriana

0

penso che si dovrebbe essere in grado di fare questo concedendo eseguire l'accesso al gruppo proprietario del programma di controllo di Apache (ad esempio, "chmod g + x apachectl"). Se questo non funziona da solo, provare anche a impostare il bit SUID proprietario sul programma (qualcosa sulla falsariga di "chmod u + s apachectl").

Il primo passaggio consente agli utenti del proprio gruppo wwwrun di eseguire il programma apachectl. Il secondo passo fa in modo che quando il gruppo esegue il programma, venga eseguito con i privilegi dei proprietari del programma.

Fammi sapere se funziona, sono un po 'arrugginito con l'esecuzione di file SUID, ma posso aiutarti a esaminarlo ulteriormente se hai ancora problemi.

Assicurati di comprendere le conseguenze dell'impostazione del bit SUID prima di farlo.

5

Risposta breve: No

La ragione per questo è che solo root può legare le porte sotto 1024.

Risposta lunga: controllare http://www.debian-administration.org/articles/386

Una volta a superare il problema con le porte, ho non pensare che ci saranno altri problemi Ricorda che l'utente che esegue apache deve avere accesso in scrittura ai file di log e magari anche ad altri file.

Tuttavia, se lo si esegue senza sudo, lo spawner probabilmente non sarà in grado di cambiare utente, quindi apache verrà eseguito come utente che lo avvia, anziché dall'utente apache.

Ma qual è la ragione per cui non si desidera eseguire sudo?È solo il processo del spawner che viene eseguito come root, il resto viene eseguito sotto l'utente apache.

0

È possibile impostare "setuid" per consentire agli utenti non root di eseguire apachectl come root (senza dover eseguire l'autenticazione come root).

Example

Edit: dovrei menzionare che si richiede l'accesso root per impostare questa funzione, in primo luogo :-)

+0

Ho pensato la stessa cosa.(13) Autorizzazione negata: make_sock: impossibile eseguire il binding all'indirizzo [::]: 80 (13) Autorizzazione negata: make_sock: impossibile eseguire il binding all'indirizzo 0.0.0.0:80 –

+0

Errore mio - setuid è generalmente ignorato per gli script di shell (per ragioni di sicurezza). Dai un'occhiata alla risposta di Emanuel. – Nick

+0

La risposta di Emanuel vola. –

5

Se è stato installato sudo è possibile creare un file: /etc/suduers.d/apache2reload con il seguente contenuto:

username ALL=NOPASSWD:/usr/bin/service apache2 reload 
+0

Non lo farebbe. Non riesco a capire perché così tante persone hanno pubblicato questa opzione. Per impostazione predefinita, una volta eseguito il comando sudo, non è necessario immettere la password per eseguire un altro comando sudo, fornendo così l'accesso root gratuito. – dtc

+0

Questo non era "predefinito" sui due sistemi che ho appena provato (Ubuntu 14.04, SLES 11) - vale la pena controllarlo. – Nick

+0

Questa è la risposta giusta. Cambiare l'apache utente viene eseguito come (che di solito non è root in ogni caso) non fa la differenza. L'obiezione di @ dtc si basa su un fraintendimento su come funziona il sudoers conf. – jwg

0

è possibile visualizzare i privilegi con sudo -l, da qui si potrebbe scoprire che si ha accesso al comando di riavvio, ma forse non avviare e arrestare.

0

Alcuni link che ho trovato hanno dato la risposta più vantaggiosa per questo. Dal punto di vista tecnico, funziona ancora come root, ma puoi ancora usare l'apache2 e apache2ctl (se stai anche utilizzando il secondo) per caricare i file. Ciò consente di eseguirli con l'accesso root ma essere comunque di un utente che mantiene le stesse autorizzazioni, mantenendo intatta la sicurezza (a meno che apache o apache2ctl non facciano cose più pazze che dubito che siano).

-1

è possibile utilizzare per eseguire il supervisore apache

3

Se non si vuole dare accesso a sudo, è anche possibile creare un programma wrapper setuid. Per esempio:

httpdctrl.c

#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <signal.h> 
#include <strings.h> 

// allow start/stop/restart of apache by non-root users 

int main(int argc, char **argv) 
{ 
    char *cmd, *cmd2, *usage; 

    // UPDATE THIS LINE: 
    cmd = "/your/path/to/httpd/sbin/apachectl"; 
    cmd2 = "apachectl"; 
    usage = "Usage: COMMAND [start|stop|restart]\n"; 

    if (argc != 2) { 
    printf(usage); 
    exit(1); 
    } 

    setegid(0); 
    seteuid(0); 
    setgid(0); 
    setuid(0); 

    if (strncmp(argv[1], "start", 5) == 0) { 
    if (execl(cmd, cmd2, "start", (char*)0) < 0) { 
    perror("Error"); 
    } 
    } else if (strncmp(argv[1], "stop", 4) == 0) { 
    if (execl(cmd, cmd2, "stop", (char*)0) < 0) { 
    perror("Error"); 
    } 
    } else if (strncmp(argv[1], "restart", 7) == 0) { 
    if (execl(cmd, cmd2, "restart", (char*)0) < 0) { 
    perror("Error"); 
    } 
    } else { 
    printf(usage); 
    exit(1); 
    } 
    exit(0); 
} 

Aggiornare il percorso a:

// UPDATE THIS LINE: 
    cmd = "/your/path/to/httpd/sbin/apachectl"; 

Poi compilare e cambiare i permessi con

gcc -o httpdctrl httpdctrl.c 
sudo chown root:root httpdctrl 
sudo chmod u+s httpdctrl 

Ora il httpdctrl è di proprietà di root, e setuid lo eseguirà come root.

IMPORTANTE: assicurarsi che lo script di avvio/arresto e tutte le directory padre siano di proprietà di root. Rimuovi anche l'accesso in scrittura ai file e le directory per "altro". Fondamentalmente, non vuoi che qualcuno sia in grado di modificare o modificare i file/dirs che vengono eseguiti con root.

Problemi correlati