Come evitare di usare sudo quando si lavora in / var / www?


173

Voglio smettere di dover usare sudoogni volta che lavoro /var/www. Come posso fare ciò? Voglio semplicemente mettere tutti i miei siti in questa directory e lavorare con loro senza troppa sofferenza.


3
Stai usando apache?
Rinzwind,

1
Dopo aver letto qui, questo può anche aiutare nella parte di autorizzazione: askubuntu.com/questions/20105/…
Luis Alvarado

2
Un altro modo per ottenere sicurezza è continuare a utilizzare sudo -u www-datama limitarsi al sudoersfile per poterlo solo sudo www-data(e non sudo root). Vedi serverfault.com/questions/295429/…
Simon Woodside,

Risposte:


250

La maggior parte delle risposte qui non sono scritte pensando alla sicurezza. È bello avere la sensazione che correre sudoogni volta non sia molto saggio. Se si sudo rm -rf / var/www/dir esegue un refuso (ad esempio un singolo spazio bianco in un posto sbagliato: non eseguire! ), È possibile che il sistema venga eliminato .

Nota: a partire da Apache 2.4.7 / Ubuntu 14.04, /var/wwwè stato spostato su /var/www/htmlRegola i comandi in questa risposta di conseguenza.

Vedere:

Cattive idee:

  • chmod 777(sagarchalise) - questo consente a chiunque abbia accesso al tuo sistema di scrivere nelle directory e nei file e quindi consente all'intruso di eseguire qualsiasi codice sotto l' www-datautente
  • chgrp -R www-data $HOME(cob) - questo permette www-datadi leggere o scrivere qualsiasi file nella home directory. Ciò non tiene conto della regola del privilegio minimo
  • chown -R $USER:$USER /var/www(kv1dr) - a meno che il mondo non abbia i permessi di lettura /var/www, il server web in esecuzione sotto www-datanon sarà in grado di leggere (servire) i file. Se il file è un semplice documento HTML accessibile al pubblico, potrebbe non essere un problema se il mondo può leggere il file. Ma se il file è un file PHP contenente password, lo è.

NOTA : nelle soluzioni seguenti, ho concesso i www-dataprivilegi di scrittura. Tuttavia, /usr/share/doc/base-passwd/users-and-groups.txt.gzafferma:

www-data

Alcuni server Web funzionano come dati www. Il contenuto Web non deve essere di proprietà di questo utente o un server Web compromesso sarebbe in grado di riscrivere un sito Web. I dati scritti dai server Web saranno di proprietà di www-data.

Ove possibile, non concedere autorizzazioni di scrittura al www-datagruppo. www-datadeve solo essere in grado di leggere i file in modo che il server web possa servirli. L'unico caso in cui sono www-datanecessarie autorizzazioni di scrittura è per le directory che archiviano i caricamenti e altre posizioni che devono essere scritte.

Soluzione 1

Aggiungiti al www-datagruppo e imposta il bit setgid nella /var/wwwdirectory in modo tale che tutti i file appena creati ereditino anche questo gruppo.

sudo gpasswd -a "$USER" www-data

Correggi i file creati in precedenza (supponendo che tu sia l'unico utente di /var/www):

sudo chown -R "$USER":www-data /var/www
find /var/www -type f -exec chmod 0660 {} \;
sudo find /var/www -type d -exec chmod 2770 {} \;

(ancora più sicuro: utilizzare 640o 2750manualmente chmod g+w file-or-dirche deve essere scrivibile dal server web)

Soluzione 2

Crea un collegamento simbolico per ciascun progetto nella tua home directory. Supponiamo che il tuo progetto si trovi in ~/projects/fooe che tu voglia averlo in /var/www/foo, eseguire:

sudo ln -sT ~/projects/foo /var/www/foo

Se la directory home non ha bit di esecuzione (decrescente) impostato per other(per motivi di sicurezza), cambiare il gruppo su di esso www-data, ma impostare solo il bit di esecuzione (nessuna lettura / scrittura). Fare lo stesso per la ~/projectscartella in quanto potrebbe contenere progetti diversi da www. (Non è necessario sudose hai precedentemente aggiunto il tuo utente al www-datagruppo.)

sudo chgrp www-data ~ ~/projects
chmod 710 ~ ~/projects

Impostare il gruppo su www-dataon ~/projects/fooe consentire al server web di leggere e scrivere su file e file + directory e scendere in directory:

sudo chgrp www-data ~/projects/foo
find ~/projects/foo -type f -exec chmod 660 {} \;
find ~/projects/foo -type d -exec chmod 2770 {} \;

Ancora più sicuro: usa 640 e 2750 per impostazione predefinita e chmod manualmente i file e le directory che devono essere scrivibili dall'utente del server web. Il bit setgid deve essere aggiunto solo se si desidera che tutti i file appena creati ~/projects/foosiano accessibili al gruppo.

D'ora in poi, puoi accedere al tuo sito all'indirizzo http://localhost/fooe modificare i tuoi file di progetto in ~/projects/foo.

Guarda anche


Cosa ne pensi di una sessione www in un terminale di sudo su www-data? Combinato con un prompt di colore diverso, per rendere più ovvio che si tratta della shell di un altro utente e di una politica per mettere sempre il corrispondente xterm - ad esempio - sul desktop virtuale 4, in modo che ci si abitui, a evitare la confusione?
utente sconosciuto

@utente sconosciuto: se fai tutto bene nel terminale perché hai una chiara separazione tra gli account utente. Ma non funzionerà se si utilizza un programma GUI come gedit. Non ho mai verificato se l'esecuzione di un programma GUI con un altro utente nella sessione corrente sia sicura o meno, sarebbe una domanda interessante.
Lekensteyn,

1
@imaginaryRobots: se avessi pubblicato diverse soluzioni per ogni domanda, Askubuntu sarebbe pieno di risposte su tre righe. Lo terrò così com'è a meno che tu non riesca a convincermi a dividerlo.
Lekensteyn,

1
@berbt setfacl -d u::rwX,g::rX /var/wwwha l'effetto divertente che la modalità predefinita diventa 0750 (o 0640) anche se l'umask è zero. Potrebbe essere una buona idea se vuoi evitare i file scrivibili dal mondo, ma se /var/wwwè già inaccessibile al mondo non è necessario.
Lekensteyn,

1
C'è un problema con l'inversione del processo nella soluzione 1? Con questo voglio dire, /var/www/app01ha la proprietà app01:app01e quindi l' www-data utente viene aggiunto al app01 gruppo ? O questo romperà qualcosa?
Jack_Hu

9

Invece di archiviare i miei siti Web in / var / www inserisco dei collegamenti lì ai siti che si trovano nella mia cartella home. Posso modificare liberamente o aggiungere pagine ai miei siti. Quando sono soddisfatto delle modifiche, quindi FTP a una società di hosting dove si collega il mio nome di dominio.


Questa è un'idea sensata.
thomasrutter,

7

Se rendi / var / www scrivibile dal suo gruppo e ti aggiungi al gruppo, non dovrai usare sudo pur essendo abbastanza sicuro. Prova questo:

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rw /var/www

Dovresti quindi essere in grado di modificare i /var/www/file senza problemi.

La prima riga ti aggiunge al www-datagruppo, la seconda riga cancella tutti i file con la proprietà incasinata e la terza fa in modo che tutti gli utenti membri del www-datagruppo possano leggere e scrivere tutti i file /var/www.


4
Questa è una pessima idea per la sicurezza e questo consiglio non dovrebbe essere seguito, per ragioni spiegate in altre risposte. www-data dovrebbe essere un gruppo non privilegiato , senza accesso in scrittura.
thomasrutter,

5

cosa non fare

  • Non impostare le autorizzazioni per i file su 777 (scrivibile in tutto il mondo)

    Questo è un grave difetto di sicurezza, specialmente se si abilita lo scripting lato server come PHP. I processi non privilegiati non dovrebbero essere in grado di scrivere su file che potrebbero influire sul sito Web o, nel caso in cui vengano utilizzati script lato server, eseguire codice arbitrario.

  • Non aggiungerti come membro del gruppo www-data e concedergli le autorizzazioni di scrittura

    Lo scopo di quel gruppo è che è un gruppo non privilegiato che i processi del server eseguono. Dovrebbero avere accesso in lettura ai file del sito Web solo dove possibile, per gli stessi motivi di cui sopra.

  • Non modificare le autorizzazioni dei processi Apache

    I processi figlio Apache vengono eseguiti come www-datautente e gruppo per impostazione predefinita e questo non deve essere modificato. Questo è solo un modo per dare loro nessuna autorizzazione di scrittura al filesystem.

    In determinate circostanze si desidera che gli script lato server siano in grado di scrivere su file, nel qual caso solo questi file devono essere resi scrivibili www-datae occorre prestare attenzione per garantire la sicurezza.

dos

  • Imposta i file di proprietà di te stesso

    Se sei l'unico, o il solito, a modificare determinati file sul sito Web, è logico assumere la proprietà di tali file. Imposta il proprietario su <your username>.

    Non è necessario modificare le autorizzazioni del server per questo, poiché il server continuerà a ottenere l'accesso in sola lettura anche quando i file sono di proprietà dell'utente.

  • Scegli un posto ragionevole per ospitare i file (usando DocumentRoot )

    Se /var/wwwnon ha senso, siete invitati a posizionarli altrove. Se sono specifici per il tuo sviluppo o test, potresti metterli nella tua home directory. Oppure puoi impostare alcune directory in /srv.

  • Se si desidera consentire l' accesso in scrittura al gruppo , creare un nuovo gruppo allo scopo

    Non riutilizzare un gruppo di sistema, poiché questi sono in genere progettati per avere l'accesso che hanno attualmente e non più, per motivi di sicurezza.


5

È così semplice Non è necessario abilitare 'UserDir' di apache (non raccomandato) né fare confusione con i gruppi 'www-data' (gruppo apache nel caso su Fedora)

Basta creare la directory del progetto all'interno /var/www/html

cd /var/www/html
sudo mkdir my_project

Quindi chown la directory del progetto al tuo utente.

sudo chown your_username my_project

Ora puoi iniziare a lavorare sulla cartella del tuo progetto come utente normale con qualsiasi editor, IDE a tua scelta. Nessun altro sudos :)


1
+1 È quello che faccio: cambiare la proprietà non di /var/wwwse stessa, ma delle sottodirectory.
fkraiem,

2

chmod in / var su www per consentire l'accesso al proprietario e chown per assicurarsi di possederlo. Probabilmente un'idea stupida, ma sicuramente funzionerebbe.


2
Non è un'idea stupida, è un'idea sensata dal punto di vista della sicurezza. Nota: non è necessario (e non è necessario) modificare le autorizzazioni di /var, solo /var/wwwe / o il suo contenuto.
thomasrutter,

1

È possibile avviare una sessione www in un terminale da

sudo su www-data

Combinato con un prompt di colore diverso *, per rendere più ovvio che si tratta della shell di un altro utente e di una politica per mettere sempre il corrispondente xterm (e l'editor e simili) sul - per esempio - il desktop virtuale 4, in modo che ti abitui, per evitare confusione.

*) Per un prompt di colore diverso con un carattere diverso, creare un file / etc / prompt come questo:

# PROMPTING
#       When  executing  interactively, bash displays the primary prompt PS1 when it is ready to read a command, and the sec-
#       ondary prompt PS2 when it needs more input to complete a command.  Bash allows these prompt strings to be  customized
#       by inserting a number of backslash-escaped special characters that are decoded as follows:
#              \a     an ASCII bell character (07)
#              \d     the date in "Weekday Month Date" format (e.g., "Tue May 26")
#              \D{format}
#                     the  format is passed to strftime(3) and the result is inserted into the prompt string; an empty format
#                     results in a locale-specific time representation.  The braces are required
#              \e     an ASCII escape character (033)
#              \h     the hostname up to the first `.'
#              \H     the hostname
#              \j     the number of jobs currently managed by the shell
#              \l     the basename of the shell's terminal device name
#              \n     newline
#              \r     carriage return
#              \s     the name of the shell, the basename of $0 (the portion following the final slash)
#              \t     the current time in 24-hour HH:MM:SS format
#              \T     the current time in 12-hour HH:MM:SS format
#              \@     the current time in 12-hour am/pm format
#              \A     the current time in 24-hour HH:MM format
#              \u     the username of the current user
#              \v     the version of bash (e.g., 2.00)
#              \V     the release of bash, version + patchelvel (e.g., 2.00.0)
#              \w     the current working directory
#              \W     the basename of the current working directory
#              \!     the history number of this command
#              \#     the command number of this command
#              \$     if the effective UID is 0, a #, otherwise a $
#              \nnn   the character corresponding to the octal number nnn
#              \\     a backslash
#              \[     begin a sequence of non-printing characters, which could be used to embed a terminal  control  sequence
#                     into the prompt
#              \]     end a sequence of non-printing characters
#
#       The  command  number and the history number are usually different: the history number of a command is its position in
#       the history list, which may include commands restored from the history file (see HISTORY below),  while  the  command
#       number  is  the  position in the sequence of commands executed during the current shell session.  After the string is
#
# colors:
# \[...\]   wird benötigt, damit die shell weiß, daß hier kein printable output ist, und die Umbrüche richtig plaziert.
#
# ANSI COLORS
CRE="\[
[K\]"
NORMAL="\[[0;39m\]"
# RED: Failure or error message
RED="\[[1;31m\]"
# GREEN: Success message
GREEN="\[[1;32m\]"
# YELLOW: Descriptions
YELLOW="\[[1;33m\]"
# BLUE: System messages
BLUE="\[[1;34m\]"
# MAGENTA: Found devices or drivers
MAGENTA="\[[1;35m\]"
# CYAN: Questions
CYAN="\[[1;36m\]"
# BOLD WHITE: Hint
WHITE="\[[1;37m\]"
#
# default:
# postgres, oracle, www-data
#
# PS1=$BLUE"machine]->"$NORMAL\\w"$BLUE ø $NORMAL"
PS1=$BLUE"machine]:"$NORMAL\\w"$BLUE > $NORMAL"
#
# root, stefan:
#
case "$UID" in
    '0')
        PS1=$RED"machine:"$NORMAL\\w"$RED # $NORMAL"
    ;;
    '1000')
    PS1=$GREEN"machine:"$BLUE\\w$YELLOW" > "$NORMAL
    ;;
#    default)
#    ;;
esac

e fonte da /etc/bash.bashrcper esempio.

Come strumento aggiuntivo per aiutare la distinzione, puoi sempre modificare i tuoi file con un alias 'edit' o un link simbolico, che punta, a seconda della tua identità (taylor / www-data) a gedit o mousepad, vim o pico. Oppure potresti utilizzare diversi profili dell'editor, almeno in gedit puoi impostare le tue preferenze su testo nero su fondo bianco o testo bianco su fondo nero, ad esempio.

Ho solo una politica del genere per lavorare come root, quindi non sono sicuro di quanto sia adatto a lavorare con i dati www. Combinato con ssh-session per host diversi, che hanno i loro suggerimenti, non mi ha impedito di essere a volte sbagliato, ma se succede, realizzo velocemente, cosa è sbagliato, e succede raramente.

nota: il prompt-script è in parte una copia della manpage di bash.


Funzionerà e non avrà (se usato con attenzione) un impatto negativo sulla sicurezza, ma potrebbe non essere la soluzione più semplice. È una soluzione valida per alcune persone però.
thomasrutter,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.