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

163

Voglio smettere di usare sudo ogni volta che lavoro in /var/www . Come lo posso fare? Voglio semplicemente mettere tutti i miei siti in questa directory e lavorare con loro senza troppa pena.

    
posta TaylorOtwell 01.06.2011 - 05:43

8 risposte

230

La maggior parte delle risposte qui non sono state scritte pensando alla sicurezza. È bello avere la sensazione che eseguire sudo ogni volta non sia molto saggio. Se fai un refuso (ad es. ( non esegui ) sudo rm -rf / var/www/dir ), potresti cestinare il tuo sistema.

Nota: A partire da Apache 2.4.7 / Ubuntu 14.04, /var/www è stato spostato su /var/www/html Adatta i comandi di questa risposta di conseguenza.

See:

Cattive idee:

  • chmod 777 (sagarchalise) - questo permette a chiunque abbia accesso al tuo sistema di scrivere nelle directory e nei file e quindi consentire all'intruso di eseguire qualsiasi codice sotto l'utente www-data
  • chgrp -R www-data $HOME (cob): questo consente a www-data di leggere o scrivere qualsiasi file nella home directory. Questo non tiene conto della regola del minimo privilegio
  • chown -R $USER:$USER /var/www (kv1dr) - a meno che il mondo abbia le autorizzazioni di lettura su /var/www , il server web in esecuzione in www-data non sarà in grado di leggere (servire) i file. Se il file è un documento HTML semplice 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 di seguito, ho concesso i privilegi di scrittura www-data . Tuttavia, /usr/share/doc/base-passwd/users-and-groups.txt.gz afferma:

% Bl0ck_qu0te%

Laddove possibile, non concede le autorizzazioni di scrittura al gruppo www-data . www-data deve essere in grado di leggere i file in modo che il server web possa servirlo. L'unico caso in cui www-data ha bisogno di autorizzazioni di scrittura è per le directory che memorizzano i caricamenti e altre posizioni che devono essere scritte.

Soluzione 1

Aggiungi te stesso al gruppo www-data e imposta il bit setgid sulla directory /var/www in modo che tutti i nuovi file creati ereditino anche questo gruppo.

sudo gpasswd -a "$USER" www-data

Correggi i file creati in precedenza (assumendo 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: usa 640 o 2750 e manualmente chmod g+w file-or-dir che deve essere scritto dal webserver)

Soluzione 2

Crea un link simbolico per ogni progetto nella tua home directory. Supponi che il tuo progetto si trovi a ~/projects/foo e vuoi che si trovi a /var/www/foo , corri:

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

Se la tua directory home non ha bit execute (descend) impostato per other (per motivi di sicurezza), cambia il gruppo di% in www-data , ma imposta solo il bit execute (no leggere scrivere). Fai lo stesso per la cartella ~/projects poiché potrebbe contenere altri progetti oltre a www. (Non hai bisogno di sudo se hai precedentemente aggiunto il tuo utente al gruppo www-data .)

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

Imposta il gruppo su www-data su ~/projects/foo e consenti al server web di leggere e scrivere su file e file + directory e scendere nelle 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 metti manualmente i file e le directory chmod che devono essere modificabili dall'utente del webserver. Il bit setgid dovrebbe essere aggiunto solo se vuoi che ogni nuovo file creato in ~/projects/foo sia accessibile al gruppo.

Da ora in poi, puoi accedere al tuo sito a http://localhost/foo e modificare i file di progetto in ~/projects/foo .

Vedi anche

risposta data Lekensteyn 01.06.2011 - 11:48
9

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

    
risposta data fragos 01.06.2011 - 09:06
6

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 /var/www/ file senza problemi.

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

    
risposta data Azendale 01.07.2011 - 02:41
5

cosa non fare

  • Non impostare permessi file per 777 (scrivibili per il mondo)

    Questo è un difetto di sicurezza significativo, specialmente se abiliti lo scripting lato server come PHP. I processi non privilegiati non dovrebbero essere in grado di scrivere su file che potrebbero influenzare il sito Web o, nel caso di script sul lato server in uso, eseguire codice arbitrario.

  • Non aggiungerti come membro del gruppo www-data e dargli permessi di scrittura

    Lo scopo di quel gruppo è che è un gruppo non privilegiato che il server elabora esegue come. Dovrebbero solo avere accesso in lettura ai file del sito web ove possibile, per gli stessi motivi di cui sopra.

  • Non modificare le autorizzazioni dei processi di Apache

    I processi figlio di Apache vengono eseguiti come www-data utente e gruppo per impostazione predefinita e questo non deve essere modificato. Questo è solo un modo per non concedere loro permessi di scrittura sul filesystem.

    In determinate circostanze vuoi che i tuoi script sul lato server siano in grado di scrivere su file, nel qual caso solo quei file dovrebbero essere resi scrivibili da www-data e occorre prestare attenzione per garantire la sicurezza.

Dos

  • Imposta i file di tua proprietà

    Se sei l'unico, o il solito, a modificare determinati file sul sito web, allora ha perfettamente senso assumere la proprietà di quei file. Imposta il proprietario su <your username> .

    Non devi modificare le autorizzazioni del server per questo, poiché il server continuerà ad ottenere l'accesso di sola lettura anche quando i file sono di tua proprietà.

  • Scegli un luogo adatto per ospitare i file (utilizzando DocumentRoot )

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

  • Se vuoi consentire l'accesso in scrittura gruppo , crea un nuovo gruppo per lo scopo

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

risposta data thomasrutter 24.11.2016 - 00:43
5

È così semplice. Non è necessario abilitare apache 'UserDir' (sconsigliato), né fare confusione con i gruppi 'www-data' (gruppo apache nel caso in Fedora)

Crea la directory del tuo progetto all'interno di /var/www/html

cd /var/www/html
sudo mkdir my_project

Quindi aggiungi 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 di tua scelta. Non più sudos :)

    
risposta data Gayan Weerakutti 06.08.2016 - 09:49
1

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

    
risposta data Daniel 01.06.2011 - 05:59
1

È possibile avviare una sessione www in un terminale

sudo su www-data

Combinato con un prompt di colore diverso *, per rendere più ovvio che è la shell di un utente diverso, e una politica sempre per mettere il corrispondente xterm (e editor e così via) - per esempio - il desktop virtuale 4 , così ti ci abitui, per evitare confusione.

*) Per un prompt di colore diverso con un carattere diverso, crea 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.bashrc per 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 usare diversi profili di editor, almeno in gedit puoi ad esempio impostare le tue preferenze su testo nero su fondo bianco o testo bianco su fondo nero.

Ho solo una tale politica per lavorare come root, quindi non sono sicuro di quanto sia adatto per lavorare con www-data. Combinato con ssh-sessions a diversi host, che hanno i loro prompt, non mi ha impedito di essere a volte sbagliato, ma se succede, mi rendo conto velocemente, cosa è sbagliato, e succede raramente.

nota: lo script di richiesta è in parte una copia della manpage di bash.

    
risposta data user unknown 01.06.2011 - 17:49
-1

On questa pagina del mio sito Copro i comandi per cambiare il permesso in /var/www tra apache e il pi utente ma è essenziale

sudo chown -R pi /var/www

quindi un riavvio di apache

sudo service apache2 restart
    
risposta data Nathan Dickson 24.11.2016 - 00:27

Leggi altre domande sui tag