Problemi relativi alle autorizzazioni con / var / www / html e la mia directory home per la radice del documento di un sito Web


34

Sto cercando di non dare l'autorizzazione 777 nella mia /var/www/htmlcartella, ma voglio modificare i miei file senza sudo. Quindi ho pensato di creare un link simbolico di una cartella nella mia home directory all'interno /var/www/html. L'ho creato usando sudo ln -sT /home/andre/www/moodle/ moodlee l' ls -laoutput è questo:

andre@andre-270E5G:/var/www/html$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Mai  4 10:20 .
drwxr-xr-x 4 root root 4096 Abr 29 14:29 ..
lrwxrwxrwx 1 root root   23 Mai  4 10:20 moodle -> /home/andre/www/moodle/

Quindi, la mia cartella moodle ha le autorizzazioni di lettura, scrittura ed esecuzione per tutti, e non è quello che voglio. Ho usato il comando sudo chmod -R 775 moodle/cercando di cambiarlo, ma è rimasto con le autorizzazioni di lettura, scrittura ed esecuzione a tutti. Ho provato lo stesso con la cartella moodle in /home/andre/www/moodle, ma è rimasto lo stesso. L'output di ls -lain /home/andre/www/è:

andre@andre-270E5G:~/www$ ls -la
total 28
drwxrwxr-x  3 andre andre  4096 Mai  4 10:02 .
drwx------ 49 andre andre 20480 Mai  4 10:01 ..
drwxrwxr-x 41 andre andre  4096 Mai  4 10:02 moodle

Quindi la cartella moodlein /home/andre/www/ha le autorizzazioni che desidero.

Come ulteriore problema, quando localhost/moodleaccedo ottengo l'errore 403 Forbidden.

Cosa sto facendo di sbagliato qui?

Risposte:


63

Non dovresti mai eseguire un sito Web dalla tua home directory . MAI. Altrimenti dovresti dare al server web la possibilità di attraversare/home/per vedere la struttura della directory, ma anche in/home/$USER/(directory home dell'utente, dove possiamo provare a vedere cos'altro esiste nella tua directory utente), così come qualsiasi altra sottocartella lì dentro. Un server Web configurato in modo errato, configurato in modo errato o senza patch può causare una massiccia perdita di dati in questo modo o perdita di credenziali e tali da mettere a rischio i dati personali e gli accessi su cose diverse. L'approccio symlink che stai usando non aiuta neanche per lo stesso motivo del tentativo di dare a Apache le autorizzazioni per la lettura/home/andre/www/moodle- il web server deve essere in grado di attraversare la tua home directory per raggiungere la posizione a cui /var/www/htmlpunta il link simbolico , il che comporta ancora quel rischio per la sicurezza.

In primo luogo, utilizzare sudo cp -r /home/andre/www/moodle/ /var/www/html/. Questo copierà i tuoi file /var/www/htmle li manterrà lontani dalla tua home directory. Ripristineremo quindi le autorizzazioni in modo che tu e il server Web possiate accedere a tutto in quella directory e dare al vostro utente la lettura / scrittura completa su tutti i file e le directory. Quindi, dovrai sempre e solo lavorare /var/www/htmlper il tuo sito.

Questo è in effetti, quattro passaggi, dopo aver copiato i dati in /var/www/html:

  1. Consenti ad Apache di accedere alle cartelle e ai file, in modo che possa servire il sito senza errori 403.
  2. Fornisci al tuo utente "proprietario" i file e le cartelle e datti lettura / scrittura su tutti i file e le cartelle, oltre alla possibilità di attraversare le directory.
  3. (Opzionale ma consigliato) Impostalo in modo tale che qualsiasi file o cartella creati da qui nella struttura della directory abbia il gruppo impostato www-data.
  4. (Facoltativo) Pulizia finale della sicurezza, in cui abbiamo impostato le autorizzazioni in modo che tu e il server Web sia possibile visualizzare i dati del sito, ma altri utenti non possono accedere ai file o alla struttura delle directory per il sito.

(1) Consentire ad Apache l'accesso alle cartelle e ai file.

sudo chgrp -R www-data /var/www/html
sudo find /var/www/html -type d -exec chmod g+rx {} +
sudo find /var/www/html -type f -exec chmod g+r {} +

Questo imposta in modo ricorsivo il 'gruppo' in modo che sia www-dataper le cartelle e i file. Ciò fornisce quindi al server Web l'autorizzazione a ricorrere e ottenere l'accesso alla struttura delle directory radice dei documenti del sito ( +xsolo per le directory). Inoltre, garantisce che il server Web disponga delle autorizzazioni di lettura per tutti i file, in modo da poter ricevere i dati del sito.

Ci possono essere alcuni casi in cui devi autorizzare il server web a scrivere un file o una directory - questo può essere ottenuto facendo sudo chmod g+w /var/www/html/PATH(dove si PATHtrova il percorso del file o della cartella nella struttura della directory dove devi applicare il autorizzazioni di scrittura per il server Web).

AVVISO : ci sono molti casi in cui ciò può esporre informazioni "sicure" sulla configurazione di un sito (come credenziali di accesso al database, ecc.) E si dovrebbero rimuovere le autorizzazioni di accesso "altro" a quei dati su quei singoli file o directory con quanto segue: sudo chmod o-rwx /var/www/html/FILEPATH(sostituendo FILEPATHcon il percorso relativo alla /var/www/htmlcartella per il file).

Si noti inoltre che potrebbe essere necessario rieseguire questi comandi in futuro se i "nuovi file" presentano 403 problemi, al fine di fornire le autorizzazioni corrette al server Web per poter accedere ai file e alle cartelle creati o copiati e il www-datagruppo non viene impostato correttamente.


(2) Concedi i privilegi di lettura / scrittura al proprietario alle cartelle e ai file e consenti all'accesso alle cartelle di attraversare la struttura della directory.

sudo chown -R USER /var/www/html/
sudo find /var/www/html -type d -exec chmod u+rwx {} +
sudo find /var/www/html -type f -exec chmod u+rw {} +

Sostituisci USERnel primo comando con il tuo nome utente!

Facciamo tre cose qui. Innanzitutto, impostiamo il tuo utente come "Proprietario" di tutti i file e le directory in /var/www/html. Successivamente, impostiamo le autorizzazioni di lettura e scrittura per le cartelle e ti consentiamo di accedere alle cartelle per accedervi (l' +xelemento sugli elementi della directory). Quindi impostiamo tutti i file per avere le autorizzazioni di lettura / scrittura per il proprietario, che abbiamo appena impostato.


(3) (Opzionale) Assicurati che ogni nuovo file dopo questo sia stato creato www-datacome utente 'access'.

sudo find /var/www/html -type d -exec chmod g+s {} +

Questo imposta il bit "set gid" per il gruppo nelle directory. I file e le cartelle creati all'interno di queste directory avranno sempre www-datacome gruppo, consentendo l'accesso al web server.


(4) (Facoltativo) Pulizia finale della sicurezza, se non si desidera che altri utenti possano vedere i dati

Abbiamo bisogno che il tuo utente veda le directory e i file. Abbiamo bisogno anche del web server per farlo. Potremmo non volere che altri utenti del sistema (tranne root) vedano i dati. Quindi non concedere loro tale accesso e renderlo tale che solo l'utente e il server Web possano vedere i dati.

sudo chmod -R o-rwx /var/www/html/

NOTA: non sarà necessario rieseguirlo in un secondo momento o modificare qui le autorizzazioni per la categoria "altro". Se gli "altri" utenti non riescono a raggiungere /var/www/html/(non hanno il +xbit necessario /var/www/htmlper attraversare la struttura della directory e della struttura di file, né il +rbit per leggere gli elenchi di file), quindi le autorizzazioni sugli elementi sotto quella directory per gli altri utenti o ai gruppi non importa davvero troppo.


Esiste anche una soluzione leggermente meno invasiva, anche se non è garantito che funzioni per tutti i nuovi file, né è garantito che funzioni su tutti i file system , includendo liste di controllo dell'accesso ai file. Questo ti consente di lasciare la proprietà dei file www-dataper cose, ma ti dà diritti di proprietario effettivi, a tutti gli effetti, anche se non possiedi personalmente i file.

Questa soluzione è un po 'meno invasiva e ti consente di avere una directory e tutti i file all'interno di proprietà di www-data:www-datao root:www-datama anche darti l'accesso. Utilizza gli elenchi di controllo di accesso , che consentono a più utenti di disporre delle autorizzazioni senza impostare singoli gruppi. Ciò consente anche agli utenti del sistema rooto di www-datapossedere i file, ma consente anche di aggiungere ulteriori autorizzazioni caso per caso e ottimizzare le autorizzazioni per determinati utenti in modo che possano leggere le cose ma non modificarle e così via.

Supponendo che stiamo ancora lavorando /var/www/html/, e non vogliamo ficcanaso utenti diversi da noi e dal sistema (e ovviamente dalla radice) per vedere i nostri dati, dovremo fare le seguenti cose:

  1. Restituire la proprietà all'utente del sistema web server www-data.
sudo chown -R www-data: www-data / var / www / html
  1. Consentire in modo ricorsivo di leggere / scrivere sui file, offrendo agli altri utenti (escluso www-datae rootovviamente) nessun accesso ai file.
sudo find / var / www / html -type f -exec setfacl -mu: YOURUSERNAME: rw -m altro :: --- {} \;
  1. Concediti ricorsivamente lettura / scrittura / attraversamento delle directory, rimuovi l'accesso alle cartelle per altri utenti (esclusi www-datae root) e imposta questo come ACL "predefinito" per i nuovi file nelle directory.
sudo find / var / www / html -type d -exec setfacl -d -mu: YOURUSERNAME: rwx -mo :: --- {} \;
  1. Dobbiamo anche impostare il setgidbit per tutte le directory, in modo che se si crea un file il server web possa ancora accedervi come www-datatramite le autorizzazioni di gruppo.
sudo find / var / www / html -type d -exec chmod g + x {} \;

E ora hai accesso a tutte le directory e non devi toglierti l'accesso, il www-datache aiuta poiché il server web può ancora creare file ovunque sia necessario (come frontend basati su PHP che hanno le loro directory cache e simili bisogno di essere creato e scritto per il corretto funzionamento).

L'unica avvertenza: se si creano manualmente nuovi file, è necessario chown di conseguenza per dare la proprietà al server web. È semplice sudo chown www-data:www-data filenamee gli elenchi di controllo degli accessi dovrebbero comunque permetterti di avere diritti di proprietario effettivi sul file.

Esistono diversi casi in cui ho dovuto eseguire questa operazione come amministratore di sistema per un tipo di accesso non standard senza modificare i proprietari di un determinato file. Funziona, ma ha i suoi mal di testa, poiché non tutti i file system supportano gli elenchi di accesso ai file.


2
@ AndréCarvalho +xai file darebbe autorizzazioni eseguibili e non vogliamo che i file PHP vengano eseguiti, necessariamente, attraverso la riga di comando PHP o come eseguibili sul server stesso - li vogliamo elaborati dal parser PHP nel web server (e noi non è necessario disporre dei file PHP per consentire +xal parser PHP di leggerli ed elaborarli). Le directory hanno bisogno +xper consentire l'attraversamento attraverso le directory - vale a dire, se una directory non è +xe non sono root, non riesco ad accedere alla directory, che è il problema che hai avuto con Apache non funziona con i tuoi symlink e la tua home directory.
Thomas Ward

1
@ AndréCarvalho www-dataè un gruppo di sistema - non è un gruppo per utenti standard.
Thomas Ward

1
@JunaidQadirShekhanzai Impossibile fornire poiché le impostazioni delle persone differiscono notevolmente dai loro ambienti di cui hanno bisogno e da molti altri fattori. Un tale "file shell" sarebbe impossibile da produrre dato che esistono componenti opzionali . Potrei provare a creare uno script Python in grado di farlo, ma ci imbattiamo ancora in cose come restrizioni di sistema, attività opzionali, percorsi variabili, ecc.
Thomas Ward

1
@ T.Todua non è quello che ho detto. Ho detto che non dovresti mai eseguire un sito dalla (leggi: dall'interno) la tua directory "home" - cioè, non dovresti eseguire nulla /home/USER/...su un server web. Hai frainteso e frainteso il significato delle parole che uso. /var/www/*è un luogo relativamente "sicuro" per cui eseguire i siti Web perché è una cartella / spazio dedicato per esso. Tuttavia, /var/www/htmlNON è sicuro perché è scritto da server web durante l'installazione e simili e porta a ostruire dati importanti (quindi utilizzare /var/www/SUBDIRECTORYcon i singoli sottoconti del sito)
Thomas Ward

1
Ho modificato la formulazione per chiarezza.
Thomas Ward

2

L'idea di utilizzare i collegamenti simbolici per risolvere un problema di autorizzazione è errata e non può funzionare. Le autorizzazioni visualizzate per il collegamento simbolico sono per lo più irrilevanti, non possono essere utilizzate per aggirare le autorizzazioni della directory "reale". La creazione di un collegamento simbolico da /var/www/html/moodlea /home/andre/www/moodle/non elude le autorizzazioni per /home/andre/www/moodle/. Chiunque voglia fare cose /var/www/html/moodlepuò farlo solo se ha i permessi necessari per /home/andre/www/moodle/.

La tua esecuzione di sudo chmod -R 775 moodle/effettivamente ha avuto un effetto, ma diversamente da quello che pensavi non cambiasse l'autorizzazione del link simbolico, ma del target del link simbolico /home/andre/www/moodle/.

L'errore 403 che ricevi nel server web è probabilmente perché il tuo server web non ha le autorizzazioni necessarie per entrare /home/andre. Questo non è "un ulteriore problema", ma a causa dello stesso problema di autorizzazione.

Quindi, invece di utilizzare i collegamenti simbolici, è necessario individuare le autorizzazioni che consentono di modificare i file e il server Web per accedervi (o addirittura modificarli, a seconda dell'applicazione). Che cosa sono esattamente queste autorizzazioni, dipende dal tuo esatto caso d'uso (applicazione e configurazione del server).

In generale, penso che sia una buona idea possedere i file e disporre delle autorizzazioni rw, il server Web ha accesso in lettura ai file solo tramite le autorizzazioni di gruppo e tutti gli altri utenti non hanno alcun accesso.

Un esempio di autorizzazione (che potrebbe non funzionare nel tuo caso d'uso a causa di informazioni mancanti):

andre@fermat:/var/www/html$ ls -al moodle/
total 0
drwxr-x--- 2 andre www-data 60 mai  4 16:20 .
drwxr-xr-x 3 root  root     80 mai  4 16:20 ..
-rw-r----- 1 andre www-data  0 mai  4 16:20 index.html

Puoi vedere che la directory ha abbastanza accesso per te come proprietario per inserirla e modificarne il contenuto, il web server (nel gruppo www-data) può entrare e leggere. I file stessi sono leggibili e scrivibili dall'utente (proprietario) e leggibili sul server Web (nel gruppo www-data). Tutti gli altri utenti non hanno alcun accesso.

Ancora una volta, prendi questo solo come esempio. L'utente / gruppo esatto del server Web dipende dalla configurazione. E la tua applicazione (moodle) potrebbe richiedere autorizzazioni diverse, devi consultare la sua documentazione.


D'accordo, ma questo non è troppo utile se non sanno come impostare correttamente le autorizzazioni e si imbatteranno anche in altri problemi.
Thomas Ward

@ThomasW .: Quindi la domanda su come impostare correttamente le autorizzazioni dovrebbe essere una nuova domanda, comprese le informazioni necessarie, come la configurazione del server web, il modo desiderato di modificare i file e le esigenze dell'applicazione.
mastov,

o scritto come una risposta corretta - che sto facendo ora. Inoltre non dovresti mai eseguire nulla da / home / USER / per un sito Web, ha accesso a molti altri dati "utente" se il web server non è correttamente corretto o configurato.
Thomas Ward

@mastov Capito. Risolvi molte domande che ho avuto con la tua spiegazione.
André Carvalho,

2

Ottima risposta di Thomas Ward https://askubuntu.com/a/767534/717860

Puoi eseguire tutti i passaggi consigliati in soli 3 comandi anziché 8 comandi:

3 comandi:

sudo chown -R ubuntu:www-data /var/www
sudo find /var/www -type d -exec chmod 2750 {} \+
sudo find /var/www -type f -exec chmod 640 {} \+

fare lo stesso lavoro dei seguenti 8 comandi:

sudo chgrp -R www-data /var/www
sudo find /var/www -type d -exec chmod g+rx {} +
sudo find /var/www -type f -exec chmod g+r {} +
sudo chown -R ubuntu /var/www/
sudo find /var/www -type d -exec chmod u+rwx {} +
sudo find /var/www -type f -exec chmod u+rw {} +
sudo find /var/www -type d -exec chmod g+s {} +
sudo chmod -R o-rwx /var/www/
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.