Quali sono le autorizzazioni di directory consigliate?


145

Mi sto preparando per distribuire un sito Drupal 7 e non riesco a trovare alcuna documentazione su quali dovrebbero essere le autorizzazioni di file e directory consigliate per la sicurezza consigliate.

In particolare default/files/(sub anche le directory?), settings.php, .htaccessE qualsiasi altra cosa che dovrei essere a conoscenza.



C'è un blog che lo spiega magnificamente e ne copre ogni aspetto in modo astratto. technologymythbuster.blogspot.com/2018/06/…
Kalpesh Popat

Risposte:


69

Il tuo server web dovrebbe essere in grado di leggere tutti i file ma non di scriverli. Se il tuo sito prevede il caricamento di file, dai al server il permesso di scrivere solo in quella cartella.

Maggiori informazioni su come configurarlo, così come alcune cose che possono accadere in caso contrario, sono disponibili nei documenti di Drupal .


13
Questo non è vero per la directory sites / default / files, che deve essere scrivibile dal server web o si avranno molti problemi.
rooby

3
@rooby La seconda frase lo chiarisce.
Kenorb,

14
Anche se dice "Se il tuo sito comporta il caricamento di file", ma non è questo l'unico motivo per cui potresti aver bisogno di accedere in scrittura alla directory dei file. Un esempio molto comune è l'aggregazione js / css, ovvero gli utenti non collegati che caricano file. Altri moduli possono anche aspettarsi che quella directory sia scrivibile.
Rooby,

91

Quella pagina drupal come tante è molto lunga e confusa. Ma contiene questo post di Jason, che ha colpito l'unghia sulla testa:

Postato da Jason Sale il 1 novembre 2010 alle 12:40 pm

Grazie per aver scritto questo e tutto il resto, ma tutto ciò che io e il 99% delle persone che leggono questa pagina vogliono davvero è un elenco di numeri accanto a un elenco di cartelle.

  • /default il 755
  • /default/files comprese tutte le sottocartelle e i file su 744 (o 755)
  • /default/themes comprese tutte le sottocartelle e i file su 755
  • /default/modules comprese tutte le sottocartelle e i file su 755
  • /default/settings.phpe /default/default.settings.phpil 444

7
L'argomento è lungo e confuso. La pagina si adatta alla realtà della situazione.
Greggles,

17
... dei documenti Drupal! Ed è per questo che deve essere cambiato immediatamente in qualcosa di semplice e comprensibile! Soprattutto quando si tratta di sicurezza. PERCHÉ si tratta di sicurezza! Perché appartiene a tutti noi. Un server infetto non è solo un problema per l'utente Drupal inesperto. Quindi è un problema per tutti noi. Quindi non è molto utile tenere aggiornati i documenti complessi e scritti male ispirati al narcisismo degli sviluppatori per mostrare complessità e complessità e quanto è bravo loro stessi a gestirlo. Non vedo il punto per tralasciare un semplice albero grafico dei permessi dei file. webchick è d'accordo su questo.
nilsun,

3
Perché avere 755 su / default / files? Non dovrebbe sempre essere 744 nel caso in cui qualcuno riesca a caricare qualcosa di dannoso hackerando il front-end (o attraverso una configurazione errata)? C'è qualche motivo per avere 755? Che dire di / tmp?
Webdrips del

1
Il file settings.php dovrebbe essere 440. "Altri" non dovrebbe essere in grado di vedere settings.php. 740 se si desidera poter scrivere su di esso senza i comandi sudo.
Bryden,

solo curioso perché il file .htaccess nei file e nella cartella tmp deve essere scritto dal server web? non è sicuro contrassegnarlo come 444 come settings.php. Il motivo che sto chiedendo è se junkfile.php può essere caricato dall'hacker nella cartella dei file tramite il server web, quindi il file .htaccess potrebbe essere sostituito. ho ragione?
kiranking,

82

La mia pratica sulla creazione di un nuovo sito Drupal su un server è quella di avere un utente che fa parte del gruppo server Web (in genere Apache) e che quell'utente possieda tutti i file Drupal. Su Ubuntu, questi sono i comandi per ottenere quella configurazione:

# Create a new example user, setting up /var/www/example as their home dir.
useradd -s /bin/bash -d /var/www/example -m example

# Now add that user to the Apache group. On Ubuntu/Debian this group is usually
# called www-data, on CentOS it's usually apache.
usermod -a -G www-data example

# Set up a password for this user.
passwd example

Dopo averlo configurato, accederò come tale utente e installerò Drupal su / var / www / example / docroot o simili, quindi creerò manualmente la directory dei file e copierò il file settings.php. Poiché eseguiamo l'accesso come nostro utente di esempio prima di copiare in Drupal, la proprietà e le autorizzazioni dei nostri file dovrebbero essere automaticamente configurate correttamente su tutti i file e script Drupal principali (inclusi i file .htaccess).

su - example
cd docroot
cp sites/default/default.settings.php sites/default/settings.php

# Temporarily give the web server write permissions to settings.php
chgrp www-data sites/default/settings.php
chmod g+w sites/default/settings.php

Ora impostiamo la directory dei file.

# Create the directory.
mkdir sites/default/files

# Now set the group to the Apache group. -R means recursive, and -v means 
# verbose mode.
chgrp -Rv www-data sites/default/files

Successivamente imposteremo le autorizzazioni in modo che il server Web possa sempre scrivere su qualsiasi file che si trova in questa directory. Lo facciamo usando 2775 nel nostro comando chmod. Il 2 significa che l'id del gruppo verrà conservato per tutti i nuovi file creati in questa directory. Ciò significa che i dati www saranno sempre il gruppo su tutti i file, garantendo in tal modo che il server Web e l'utente disporranno sempre delle autorizzazioni di scrittura per tutti i nuovi file inseriti in questa directory. Il primo 7 indica che il proprietario (esempio) può R (Leggi) W (Scrivere) e X (Esegui) tutti i file qui. Il secondo 7 indica che il gruppo (dati www) può anche RW e X qualsiasi file in questa directory. Infine, il 5 indica che altri utenti possono file R e X, ma non scrivere.

 chmod 2775 sites/default/files

Se ci sono file esistenti in questa directory, assicurarsi che il server Web abbia dei permessi di scrittura su di essi.

 chmod g+w -R sites/default/files

Ora Drupal è pronto per essere installato. Al termine, è MOLTO importante tornare a settings.php e assicurarsi che tutti gli utenti dispongano solo delle autorizzazioni di lettura.

 chmod 444 sites/default/settings.php

Questo è tutto! Questa impostazione consente di evitare qualsiasi situazione in cui l'utente che possiede la directory o il server Web non è in grado di scrivere / modificare / rimuovere i file nella directory dei file.


non è sicuro impostare .htacess su 444 jsut come settings.php? comunque quel file viene raramente aggiornato in drupal core.
kiranking,

Puoi impostare .htaccess su 444, ma aggiungerà ulteriore mal di testa durante l'aggiornamento di Drupal core e non renderà il tuo sito più sicuro.
q0rban,

30

La cartella dei file Drupal dovrebbe essere scrivibile dal server web. Il modo più sicuro per farlo è cambiare il gruppo e renderlo scrivibile, in questo modo:

chgrp www-data sites/default/files
chmod g+w sites/default/files

A parte la cartella di caricamento dei file, la più sicura è chmod 644 per tutti i file, 755 per le directory.

Ciò potrebbe essere realizzato in questo modo (quando eseguito nella cartella del sito Drupal, .è per il percorso corrente):

find . -type f | xargs chmod 644
find . -type d | xargs chmod 755

Ricorda che dovrai eseguire di chmod g+wnuovo l' impostazione dopo aver eseguito il comando sopra, poiché quelli ripristineranno il chmod su tutti i file e le cartelle.


2
Questa risposta presuppone: sei su Ubuntu. Il tuo sito è l'unico in esecuzione su quel server. Inoltre risolve il problema solo una volta invece di farlo accadere automaticamente (ad esempio cambiando la umask).
Greggles,

Non necessariamente Ubuntu, ed è ancora una misura utile, anche se ci sono più siti in esecuzione sullo stesso server. Cambiare umask (che si spera dovrebbe già avere queste impostazioni) non è qualcosa che consiglierei a persone non esperte in Linux. So che questa non è una sicurezza perfetta, ma non permettiamo che perfetto sia il nemico del bene qui.
mikl

Su un sito multiplo corro chgrp -R www-data sites/*/filese mi libero chmod -R g+w sites/*/filesdegli errori della pagina di stato.
leymannx,

20

Qualsiasi consiglio a "chmod blah" o "chown X" non ha senso senza sapere: quale utente predefinito: gruppo è presente nei file e quale utente e quali gruppi viene eseguito il server web.

I Drupal Docs a cui sono collegati altri sono abbastanza buoni sull'argomento, ma un'altra risorsa è il Security Review Module che aiuta a garantire che tutto sia impostato correttamente.


9

Risponderò considerando il caso in cui i file vengano creati sul server tramite FTP, utilizzando credenziali diverse da quella in cui è in esecuzione il server Web (normalmente, Apache funziona come nessuno / nessuno). Ciò significa che l'utente che possiede i file creati manualmente prima di eseguire il programma di installazione di Drupal (che include anche i file caricati sul server dall'archivio Drupal) non è l'utente utilizzato per eseguire il server Web (né il nome utente né il gruppo corrispondono) . Questo scenario si applica anche al caso in cui tali file vengano creati utilizzando SSH.

  • Il file settings.php deve essere scrivibile dal programma di installazione di Drupal, ma una volta completata l'installazione, si consiglia di renderlo di sola lettura (il programma di installazione suggerisce che, e Drupal controllerà periodicamente se il file è realmente di sola lettura). Nello scenario che sto descrivendo, l'autorizzazione di questo file dovrebbe essere almeno 644.
  • I file .htaccess (che sono presenti in almeno due posizioni) dovrebbero avere l'autorizzazione 644. L'utente che ha creato il file dovrebbe essere comunque in grado di sovrascrivere il file, nel caso in cui una versione successiva di Drupal includa un file .htaccess che è stato aggiornato (è già successo una volta, quando è stata aggiunta una riga a quel file per evitare un problema di sicurezza). È anche possibile impostare le autorizzazioni su 444, ma in tal caso, le autorizzazioni devono essere ripristinate a 644 quando il file deve essere aggiornato.
  • La directory contenente i file creati dai moduli (la default/filesdirectory) deve essere (per l'utente assegnato ai processi del server Web, che è quindi l'utente assegnato agli script PHP in esecuzione su quel server Web):
    • leggibile
    • scrivibile
    • attraversabile (i moduli devono essere in grado di raggiungere default/files/<directory-used-by-the-module>/<sub-directory-used-by-the-module>)

dopo aver letto il thread su drupal.org/node/244924 e in particolare drupal.org/node/244924#comment-8186447 nessuno dei diversi metodi ha fornito come ottenere file caricati per avere solo 660 RW-RW ---- cioè. senza bit di esecuzione. Non è il principale problema di sicurezza?
Kirking,

8

Autorizzazioni consigliate per file / directory:

  • Drupal webroot dovrebbe essere leggibile da tutti (vedi: updater.inc ): 0755
  • per le directory di upload pubbliche: 0755 o 0775
  • per directory di upload private: 0750 o 0770
  • per i file caricati pubblici: 0644 o 0664
  • per file privati ​​caricati: 0640 o 0660
  • per .htaccess nelle directory di upload (vedi: file_create_htaccess () ): 0444 (impostazione predefinita) o 0644
  • per settings.php in sola lettura per tutti (e altri file riservati): 0440
  • per tutte le altre directory web: 0755
  • per tutti gli altri file Web: 0644

Proprietà consigliata di file / directory:

  • il proprietario di tutte le directory / file di caricamento deve essere impostato su utente Apache,
  • il proprietario di tutte le directory / file web / fonti dovrebbe essere impostato su un utente non Apache,
  • (facoltativamente) il gruppo di tutte le fonti dovrebbe essere impostato sul gruppo Apache,

Ecco le variabili che controllano le autorizzazioni dir / file predefinite per i nuovi elementi:

file_chmod_directory: 0775
file_chmod_file: 0664

Ecco alcuni script per la correzione delle autorizzazioni: fix-permissions.sh


Leggi di più:


Ecco lo script che sto usando per correggere le autorizzazioni sull'host remoto per le directory pubbliche / private:

#!/bin/sh -e
# Script to correct public/private directory and files permissions.
[ -z "$1" ] && { echo Usage: $0 @remote.dst; exit 1; }

DST="$1" && shift
GET_HTTP_GROUP='ps axo user,group,comm | egrep "(apache|httpd)" | grep -v ^root | uniq | cut -d\  -f 1'

drush $* $DST ssh 'PUB=$(drush dd %files) && PRIV=$(drush dd %private) && AGROUP=$('"$GET_HTTP_GROUP"') && chgrp -vR $AGROUP $PUB $PRIV && chmod -vR u+rwX,g+rwX,o+rX $PUB $PRIV'

Nota: sopra il codice tenterà di recuperare il gruppo Apache e impostarlo su GET_HTTP_GROUPvariabile.


cheat-sheet molto bello, con segnalibro. Bel lavoro ..
Kirking

4

Questo script della shell si trova in fondo a questa pagina: https://www.drupal.org/node/244924

Lo eseguo di tanto in tanto per assicurarmi che le mie autorizzazioni siano impostate correttamente.

#!/bin/bash
# Help menu
print_help() {
cat <<-HELP
This script is used to fix permissions of a Drupal installation
you need to provide the following arguments:
1) Path to your Drupal installation.
2) Username of the user that you want to give files/directories ownership.
3) HTTPD group name (defaults to www-data for Apache).
Usage: (sudo) bash ${0##*/} --drupal_path=PATH --drupal_user=USER --httpd_group=GROUP
Example: (sudo) bash ${0##*/} --drupal_path=/usr/local/apache2/htdocs --drupal_user=john --httpd_group=www-data
HELP
exit 0
}
if [ $(id -u) != 0 ]; then
  printf "**************************************\n"
  printf "* Error: You must run this with sudo. *\n"
  printf "**************************************\n"
  print_help
  exit 1
fi
drupal_path=${1%/}
drupal_user=${2}
httpd_group="${3:-www-data}"
# Parse Command Line Arguments
while [ $# -gt 0 ]; do
  case "$1" in
    --drupal_path=*)
      drupal_path="${1#*=}"
      ;;
    --drupal_user=*)
      drupal_user="${1#*=}"
      ;;
    --httpd_group=*)
      httpd_group="${1#*=}"
      ;;
    --help) print_help;;
    *)
      printf "***********************************************************\n"
      printf "* Error: Invalid argument, run --help for valid arguments. *\n"
      printf "***********************************************************\n"
      exit 1
  esac
  shift
done
if [ -z "${drupal_path}" ] || [ ! -d "${drupal_path}/sites" ] || [ ! -f "${drupal_path}/core/modules/system/system.module" ] && [ ! -f "${drupal_path}/modules/system/system.module" ]; then
  printf "*********************************************\n"
  printf "* Error: Please provide a valid Drupal path. *\n"
  printf "*********************************************\n"
  print_help
  exit 1
fi
if [ -z "${drupal_user}" ] || [[ $(id -un "${drupal_user}" 2> /dev/null) != "${drupal_user}" ]]; then
  printf "*************************************\n"
  printf "* Error: Please provide a valid user. *\n"
  printf "*************************************\n"
  print_help
  exit 1
fi
cd $drupal_path
printf "Changing ownership of all contents of "${drupal_path}":\n user => "${drupal_user}" \t group => "${httpd_group}"\n"
chown -R ${drupal_user}:${httpd_group} .
printf "Changing permissions of all directories inside "${drupal_path}" to "rwxr-x---"...\n"
find . -type d -exec chmod u=rwx,g=rx,o= '{}' \;
printf "Changing permissions of all files inside "${drupal_path}" to "rw-r-----"...\n"
find . -type f -exec chmod u=rw,g=r,o= '{}' \;
printf "Changing permissions of "files" directories in "${drupal_path}/sites" to "rwxrwx---"...\n"
cd sites
find . -type d -name files -exec chmod ug=rwx,o= '{}' \;
printf "Changing permissions of all files inside all "files" directories in "${drupal_path}/sites" to "rw-rw----"...\n"
printf "Changing permissions of all directories inside all "files" directories in "${drupal_path}/sites" to "rwxrwx---"...\n"
for x in ./*/files; do
    find ${x} -type d -exec chmod ug=rwx,o= '{}' \;
    find ${x} -type f -exec chmod ug=rw,o= '{}' \;
done
echo "Done setting proper permissions on files and directories"
Copy the code above to a file, name it "fix-permissions.sh" and run it as follows:
sudo bash fix-permissions.sh --drupal_path=your/drupal/path --drupal_user=your_user_name

Note: The server group name is assumed "www-data", if it differs use the --httpd_group=GROUP argument.

2

Inoltre, se stai eseguendo fastcgi, php esegue AS come utente e avrà accesso a tutti i file a cui l'utente ha accesso a meno che tu non provi deliberatamente a evitarlo.


1

Questo mi ha aiutato con i miei problemi di autorizzazione OSX. L'ho trovato in https://www.drupal.org/node/244924#comment-3741738 dall'utente protoplasma. Ero come se avesse problemi dopo una migrazione.

[root@localhost]cd /path_to_drupal_installation/sites
[root@localhost]find . -type d -name files -exec chmod ug=rwx,o= '{}' \;
[root@localhost]find . -name files -type d -exec find '{}' -type f \; | while read FILE; do chmod ug=rw,o= "$FILE"; done
[root@localhost]find . -name files -type d -exec find '{}' -type d \; | while read DIR; do chmod ug=rwx,o= "$DIR"; done

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.