Autorizzazione SFTP negata sui file di proprietà di www-data


23

Ho un server abbastanza standard configurato con Apache e PHP. Un'app in esecuzione crea file e questi sono di proprietà dell'utente Apache www-data. I file che carichi tramite SFTP sono di proprietà del mio stesso utente charlesr. Tutti i file fanno parte del www-datagruppo. Il mio problema è che non posso modificare o sovrascrivere nessuno dei file tramite SFTP di proprietà www-data, anche se charlesrfa parte del www-datagruppo. Posso modificare i file senza problemi tramite una sessione SSH.

Quindi non sono sicuro di cosa fare. Come autorizzo la mia sessione SFTP a modificare i www-datafile di proprietà?

Per un po 'di background, queste sono le note che ho scritto per me stesso durante l'impostazione del server:

Now set up permissions on `/var/www` where your files are served from by
default:

$ sudo adduser $USER www-data
$ sudo chgrp -R www-data /var/www
$ sudo chmod -R g+rw /var/www
$ sudo chmod -R g+s /var/www

Now log out and log in again to make the changes take hold.

The previous set of commands does the following:

1. adds the current user ($USER) to the `www-data` group;
2. changes `/var/www` to belong to the `www-data` group;
3. adds read/write permissions to the group that `/var/www` belongs to;
4. sets the SGID bit on `/var/www`; this final point bears some explaining.

E poi continuo a spiegarmi cosa significa impostare il bit SGID (cioè tutti i file creati /var/wwwdiventano automaticamente parte del www-datagruppo).


AGGIORNARE

Sembra che il problema sia stato causato dall'app stessa o, più specificamente, dal framework dell'applicazione ( Kohana ) che imposta alcuni file che scrive su 0644 (rw-r - r--); cioè non scrivibile in gruppo. Questo, unito al fatto che anche i file sono di proprietà, www-datasignificava che non potevo modificare i file tramite SFTP quando ho effettuato l'accesso come charlesr. Non sono sicuro del motivo per cui ho potuto modificare i file tramite SSH. La mia ipotesi è che devo aver usato sudo.

Ecco la strategia dei permessi che ora uso grazie al instancabile aiuto di Marty Fried , che ha sottolineato i difetti della mia strategia precedente e mi ha anche aiutato a marinare nel mondo dei permessi di Linux fino a quando non l'ho finalmente criticato. Grazie Marty!

Panoramica

  • I file e le directory in /var/wwwdovrebbero essere di proprietà diroot:webmasters
  • Tutti gli sviluppatori dovrebbero essere membri del webmastersgruppo
  • Tutte le directory in /var/wwwdevono essere impostate su: 2775o u=rwx,g=rwxs,o=rx(rwxrwx-rx)
  • Tutti i file in /var/wwwdevono essere impostati su: 0664o ug=rw,o=r(rw-rw-r--)

Di seguito dovrebbero essere di proprietà www-data:webmasters(ovvero queste sono le directory su cui Apache deve poter scrivere):

  • applicazione / cache
  • applicazione / logs
  • caricare
  • client_helpers / upload

COME

Per impostare le autorizzazioni per /var/wwwla provenienza dei file per impostazione predefinita:

  1. sudo addgroup webmasters
  2. sudo adduser $USER webmasters
  3. sudo chown -R root:webmasters /var/www
  4. sudo find /var/www -type f -exec chmod 664 {} \;
  5. sudo find /var/www -type d -exec chmod 775 {} \;
  6. sudo find /var/www -type d -exec chmod g+s {} \;
  7. sudo chown -R www-data:webmasters application/cache/ [eccetera...]

Ora disconnettersi e accedere nuovamente per rendere effettive le modifiche.

La serie precedente di comandi esegue le seguenti operazioni:

  1. Crea un nuovo gruppo chiamato webmasters; tutti gli utenti che necessitano dell'accesso in scrittura ai file dell'app verranno aggiunti a questo gruppo.
  2. aggiunge l'utente corrente ( $USER) al webmastersgruppo.
  3. cambia il proprietario di /var/wwwin roote il gruppo in webmastersgruppo.
  4. aggiunge 664 autorizzazioni (-rw-rw-r--) a tutti i file in /var/www.
  5. aggiunge 775 autorizzazioni (drwxrwxr-x) a tutte le directory in /var/www.
  6. imposta il bit SGID /var/wwwe tutte le relative directory; questo ultimo punto porta alcune spiegazioni. Nota anche che puoi anche mettere un 2 nella parte anteriore del tuo chmod ottale (es. 2644) per fare la stessa cosa.
  7. imposta il proprietario su www-data(utente di Apache) e il gruppo della directory fornita su webmaster. Questo assicura che la directory sia scrivibile da Apache e da chiunque nel webmastersgruppo. Fai lo stesso per tutte le altre directory che devono essere scrivibili.

Risposte:


10

Ubuntu.com ha guide server piuttosto buone, come la guida di Apache . Dove hai preso le tue procedure che hai scritto così attentamente? Non ho mai dovuto affrontare così tanti problemi per nessuno dei server che ho configurato, anche se sono aperto alla possibilità di non averlo fatto bene - inoltre, non ho effettivamente installato server per tutto ciò che è molto pubblico o molto grande, quindi potrebbero esserci delle falle nella sicurezza che non conosco.

Tuttavia, non ho mai avuto bisogno di essere un membro del gruppo www-data, e nessun file sorgente in www è di proprietà di www-data. La mia comprensione è che questo viene usato da Apache solo per i propri file e non avrà i permessi di scrittura su nessuno degli altri file stessi, perché in teoria nessun file importante consentirà ai dati www di avere i permessi di scrittura. Immagino che i file di proprietà di www-data darebbero l'autorizzazione di sola lettura a tutti gli altri e nessuno dovrebbe avere l'autorizzazione di scrittura per i suoi file. Potrei sbagliarmi, ovviamente, e se lo sono, spero che qualcuno mi dica e mi indichi la documentazione effettiva che spiega in modo diverso (non in un forum in cui un utente casuale di Internet come me ha prodotto istruzioni che funzionassero per lui).

Forse mi manca qualcosa, ma il tuo problema dovrebbe essere abbastanza semplice. L'utente che ha effettuato l'accesso utilizzando sftp deve essere un membro del gruppo www-data e i file che si sta tentando di modificare devono disporre delle autorizzazioni di scrittura per il gruppo www-data. Non ha senso per me che puoi modificare i file usando ssh, ma non usando sftp; sei sicuro di accedere allo stesso account per entrambi? In sftp, puoi inserire comandi come !groupselencare i tuoi gruppi o!whoami controllare quale nome di accesso stai usando. I risultati dovrebbero corrispondere a ciò che vedi usando ssh (con gli stessi comandi meno il punto esclamativo).

Dovresti anche essere in grado di usare chmod, chown, chgrp da sftp se hai il permesso di farlo.

A proposito, penso che la tua lista abbia almeno un comando abbastanza cattivo:

sudo chmod -R g+rw /var/www

Questo dà al mondo il permesso di scrivere per ogni file e cartella in / var / www. Sembra una cattiva idea. Normalmente, solo root ha l'autorizzazione in scrittura per queste directory, a meno che quelle specifiche non necessitino di maggiori autorizzazioni, di solito solo singole directory.

Nota: questo è stato un errore da parte mia. Grazie a DonalLafferty per averlo sottolineato, specifica "g", non "a", quindi cambia solo le autorizzazioni di gruppo. I miei vecchi occhi stanchi (o un brutto carattere) devono averlo letto come "a".

Modifiche per chiarimenti

Normalmente, i file creati da Apache sono di sola lettura sia per il gruppo www-data che per tutti gli altri utenti, come i file di proprietà di root in / var / www. Quindi, non ci dovrebbero essere motivi per rendere qualcuno membro dei dati www. Il problema è dare a tutti l'accesso in scrittura, che è un caso diverso. Questo dovrebbe essere fatto rendendo disponibili directory specifiche all'interno del tuo sito, e semplicemente usando chmod, o con sudo, poiché è probabilmente di proprietà di root, o rendendo tu stesso il proprietario e non usando sudo.

Se hai più sviluppatori che hanno bisogno di accedere a tutto il sito, cioè quando vuoi creare un utente + gruppo come "webmaster", rendilo il proprietario del sito, dai i permessi di scrittura a quel gruppo e fai tutti i membri degli sviluppatori di quel gruppo. Quindi l'elenco per le directory del sito sarebbe qualcosa del tipo:

drwxrwxr-x  ##  webmasters     webmasters   #### ####-##-## ##:##  mysite.com

Altre modifiche

Da allora ho capito che non hai davvero bisogno di creare un utente "webmaster", solo un gruppo. Quindi i file possono essere di proprietà di root: webmaster, ovvero root è il proprietario, ma webmaster è il gruppo.

In risposta alle domande seguenti, i file scritti da Apache saranno di proprietà di www-data e raggrupperanno www-data. Normalmente questi file non sono qualcosa in cui scrivi, quindi i non membri dei dati www possono avere accesso in sola lettura - penso che dipenda dalle autorizzazioni della directory. Se hai bisogno di un accesso più che occasionale alla scrittura, aggiungere te stesso al gruppo potrebbe essere utile. Di solito rendi scrivibili in tutto il mondo directory specifiche per i contenuti salvati da Apache. Considera anche che la maggior parte dell'hosting web condiviso che esegue Apache senza accesso alla shell non avrebbe nemmeno un modo per creare gruppi.

Ma Apache può leggere file anche di proprietà di root. Quasi tutti i file hanno un accesso leggibile dal mondo, ma non scrivibile. Quindi, a meno che tu non voglia cambiare questo, Apache non ha bisogno di essere nel gruppo dei webmaster.

Questa è tutta una configurazione base di Linux, non proprio Apache. Apache si preoccupa solo dell'accesso dall'interno del server Web, ed è impostato dai file di configurazione. Per questo motivo, il link alla documentazione di Ubuntu che ho incluso nel mio post dovrebbe essere considerato una fonte migliore di un wiki pubblico.

A proposito, il ricettario di O'Reilly Apache dice "Le directory dei documenti, come htdocs, cgi-bin e icone, dovranno avere le autorizzazioni impostate in un modo che abbia più senso per il modello di sviluppo del tuo particolare sito web, ma in nessuna circostanza nessuna di queste directory o file in esse contenuti deve essere scrivibile dall'utente del server web. "

Infine, l'utilizzo di ACL è un buon modo per impostare le autorizzazioni dei file se è necessario un maggiore controllo. Potrebbe anche essere un buon modo per impostarli sempre, ed è qualcosa che dovrei indagare.


Ciao @ marty-fried, grazie per la risposta, mi dà molto da provare. Ri. le tue domande. Ho messo insieme le informazioni da varie fonti (quindi perché le ho scritte nella mia guida per uso personale) e non ricordo la fonte esatta. Sebbene non abbia usato questa particolare fonte (soluzione 1) (l'ho appena trovata), fornisce una buona logica per la mia decisione. Nella guida di Apache che menzioni, raccomanda di creare un gruppo chiamato "webmaster", ma se lo facessi, come farebbe Apache a scrivere /var/wwwsenza aggiungerlo anche a quel gruppo?
Charles Roper,

E io non devo dare altri utenti l'accesso a /var/wwwcosì ho pensato che dà accesso al gruppo www-datae fare tutti un membro di tale gruppo sarebbe una buona soluzione. Ora riesco a vedere il problema di Apache che è in grado di sovrascrivere qualsiasi file. Dato che solo 2 sviluppatori (incluso me stesso) hanno accesso al codice, è relativamente sicuro a breve termine.
Charles Roper,

1
Grazie Marty. Questa parte del ricettario di Apache mi ha fatto ridere: "Dovresti essere consapevole che se chiedi a 12 persone i modi corretti per impostare i permessi dei file sul tuo server Apache, otterrai una dozzina di risposte diverse". Mi hai dato quasi tutto ciò di cui ho bisogno per fare progressi ora. Grazie mille per il tuo tempo. :-)
Charles Roper,

1
Ho imparato anche un po ', motivo per cui mi piacciono le discussioni approfondite - di solito aiuta a chiarire alcune parti sfocate. Sono principalmente un programmatore a cui viene chiesto di risolvere problemi e creare siti Web, quindi sto sempre imparando modi migliori per fare le cose. Sentiti libero di chiedere se ci sono altre domande.
Marty Fried,

1
AFAIK, sudo chmod -R g + rw / var / www dà accesso al 'gruppo'. Usa 'a + rw' per l'accesso al mondo.
Donal Lafferty,

7

Ho notato che non avevi usato chown.

Per impostare correttamente la proprietà dei file / cartelle è possibile impostare l'intera directory in questo modo: chown -R www-data:www-data

Questo imposta la proprietà su gruppo www-datae utentewww-data

Inoltre, puoi farlo come soluzione temporanea:

chmod 777 /var/data/<filename> o chmod 777 /var/data/<foldername>

modificare i file secondo necessità, quindi

chmod 644 /var/data/<filename> o chmod 755 /var/data/<foldername>

Fare attenzione a utilizzare l'opzione "-R", poiché modifica anche le autorizzazioni di tutti i file e le cartelle secondari.

664 sono le autorizzazioni di file standard di Apache e 755 le autorizzazioni di cartella standard.

Spero che sia di aiuto :)

Stella


Ciao, grazie per il tempo dedicato a rispondere, è molto apprezzato. Tuttavia, non aiuta davvero. Chown dei file li rende TUTTI immodificabili quando si utilizza SFTP (quindi un po 'l'opposto di quello che sto cercando!). Non riesco davvero a usare la soluzione alternativa di chmod perché a) Non ho i permessi per chmod in SFTP; b) Non voglio davvero accedere tramite SSH, modificare le autorizzazioni, eseguire il mio SFTP, cambiare indietro, ecc .; e c) alcuni file hanno permessi diversi per motivi di sicurezza, quindi non posso comunque farlo in massa.
Charles Roper,

Che cosa è /var/data? Inoltre, quale directory stai suggerendo di usare il comando chown -R www-data:www-data? Spero di no /var/www.
Marty Fried,
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.