Quais são as permissões de diretório recomendadas?

145

Estou me preparando para implantar um site Drupal 7 e não consigo encontrar nenhuma documentação sobre como as permissões recomendadas de arquivo e diretório com consciência de segurança devem ser definidas.

Especificamente default/files/(também subdiretórios?) settings.php, .htaccessE qualquer outra coisa que eu deva estar ciente.

ack
fonte
11
Há também uma resposta aqui: drupal.stackexchange.com/questions/52695/…
Free Radical
Existe um blog que explica isso lindamente e cobre todos os aspectos de uma maneira abstrata. technologymythbuster.blogspot.com/2018/06/...
Kalpesh Popat

Respostas:

69

Seu servidor da web deve poder ler todos os arquivos, mas não gravar neles. Se o site envolver o upload de arquivos, dê ao servidor permissão para gravar apenas nessa pasta.

Mais informações sobre como configurar isso, bem como algumas coisas que podem acontecer se você não o fizer, estão disponíveis nos documentos do Drupal .

Paul Jones
fonte
13
Isso não se aplica ao diretório sites / default / files, que deve ser gravável pelo servidor da web ou você terá muitos problemas.
ROOBY
3
@rooby A segunda frase esclarece isso.
Kenorb
14
Embora diga "Se o seu site envolve o upload de arquivos", esse não é o único motivo para você precisar de acesso de gravação ao diretório de arquivos. Um exemplo muito comum é a agregação js / css, que consiste em usuários independentes que estão carregando arquivos. Outros módulos também podem esperar que o diretório seja gravável.
rooby 16/02
91

Essa página drupal como tantas é muito longa e confusa. Mas ele contém este post de Jason, que acertou a unha na cabeça:

Postado por Jason Sale em 1 de novembro de 2010 às 12:40

Obrigado por escrever isso e tudo, mas tudo o que eu e 99% das pessoas que lêem esta página realmente querem é uma lista de números ao lado de uma lista de pastas.

  • /default em 755
  • /default/files incluindo todas as subpastas e arquivos no 744 (ou 755)
  • /default/themes incluindo todas as subpastas e arquivos no 755
  • /default/modules incluindo todas as subpastas e arquivos no 755
  • /default/settings.phpe /default/default.settings.phpem 444
ErichBSchulz
fonte
7
O tópico é longo e confuso. A página se encaixa na realidade da situação.
greggles
17
... dos documentos Drupal! E é por isso que precisa ser alterado para algo simples e compreensível imediatamente! Especialmente quando se trata de segurança. APENAS PORQUE é sobre segurança! Porque pertence a todos nós. Um servidor infectado não é apenas um problema do usuário inexperiente do Drupal. É um problema de todos nós então. Portanto, não é muito útil manter documentos complexos e mal escritos, inspirados pelo narcisismo dos desenvolvedores, para mostrar complexidade e complexidade e como eles podem lidar com isso. Não vejo razão para deixar de fora um gráfico simples da árvore de permissões de arquivo. webchick concorda com isso.
N
3
Por que ter 755 em / default / files? Isso não deve sempre ser 744, apenas no caso de alguém conseguir fazer upload de algo mal-intencionado, invadindo o front-end (ou por uma configuração ruim)? Existe alguma razão para ter 755? E o / tmp?
Webrips
11
O arquivo settings.php deve ser 440. "Outros" não podem ver o settings.php. 740 se você quiser escrever nele sem comandos sudo.
precisa
só por curiosidade, por que o arquivo .htaccess nos arquivos e na pasta tmp precisa ser escrito pelo servidor da web? não é seguro marcá-lo 444 como settings.php. A razão pela qual estou perguntando é se o arquivo junkfile.php pode ser carregado pelo hacker na pasta de arquivos via servidor da Web, e o arquivo .htaccess pode ser substituído. Estou certo?
kiranking
82

Minha prática em torno da criação de um novo site Drupal em um servidor é ter um usuário que faça parte do grupo de servidores Web (normalmente Apache) e que esse usuário possua todos os arquivos Drupal. No Ubuntu, estes são os comandos para configurar isso:

# 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

Depois de configurada, eu irei entrar como usuário e instalar o Drupal em / var / www / example / docroot ou similar, e depois criar o diretório de arquivos manualmente e copiar o arquivo settings.php. Uma vez que efetuamos login como nosso exemplo de usuário antes de copiar no Drupal, nossa propriedade e permissões de arquivo devem ser automaticamente configuradas corretamente em todos os arquivos e scripts principais do Drupal (incluindo arquivos .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

Agora vamos configurar o diretório de arquivos.

# 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

Em seguida, configuraremos as permissões para que o servidor da Web possa sempre gravar em qualquer arquivo que esteja nesse diretório. Fazemos isso usando 2775 em nosso comando chmod. O 2 significa que o ID do grupo será preservado para quaisquer novos arquivos criados neste diretório. O que isso significa é que www - data sempre será o grupo em qualquer arquivo, garantindo assim que o servidor da Web e o usuário sempre tenham permissões de gravação para quaisquer novos arquivos colocados nesse diretório. Os primeiros 7 significam que o proprietário (exemplo) pode R (Ler) W (Gravar) e X (Executar) qualquer arquivo aqui. O segundo 7 significa que o grupo (www-data) também pode RW e X qualquer arquivo nesse diretório. Finalmente, o 5 significa que outros usuários podem arquivos R e X, mas não podem escrever.

 chmod 2775 sites/default/files

Se houver arquivos existentes nesse diretório, verifique se o servidor da Web possui permissões de gravação neles.

 chmod g+w -R sites/default/files

Agora o Drupal está pronto para ser instalado. Quando terminar, é MUITO importante voltar ao settings.php e garantir que todos os usuários tenham apenas permissões de leitura.

 chmod 444 sites/default/settings.php

É isso aí! Essa configuração garante que você evite situações em que o usuário que possui o diretório ou o servidor da Web não possa gravar / alterar / remover arquivos no diretório de arquivos.

q0rban
fonte
não é seguro definir .htacess como 444 jsut como settings.php? de qualquer maneira, esse arquivo raramente é atualizado no núcleo drupal.
kiranking
Você pode definir .htaccess como 444, mas isso adicionará dor de cabeça extra ao atualizar o núcleo do Drupal e não tornará seu site mais seguro.
Q0rban
30

A pasta de arquivos do Drupal deve ser gravável pelo servidor da web. A maneira mais segura de fazer isso é mudar o grupo e torná-lo gravável, assim:

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

A pasta de upload de arquivos à parte, a mais segura é chmod 644 para todos os arquivos, 755 para diretórios.

Isso pode ser realizado assim (quando executado na pasta do site Drupal, o .caminho é atual):

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

Lembre-se de que você precisará definir chmod g+wnovamente após executar o comando acima, pois eles redefinirão o chmod em todos os arquivos e pastas.

mikl
fonte
2
Esta resposta assume: você está no ubuntu. Seu site é o único em execução nesse servidor. Ele também resolve o problema apenas uma vez, em vez de fazê-lo acontecer automaticamente (por exemplo, alterando o umask).
greggles
Não necessariamente o Ubuntu, e ainda é uma medida útil, mesmo se houver vários sites em execução no mesmo servidor. Alterar o umask (que, espero, já deve ter essas configurações) não é algo que eu recomendo para pessoas que não conhecem bem o Linux. Eu sei que isso não é uma segurança perfeita, mas não vamos deixar que o perfeito seja o inimigo do bem aqui.
Mikl 6/09/15
Em um multisite, eu corro chgrp -R www-data sites/*/filese chmod -R g+w sites/*/filespara me livrar dos erros da página de status.
Leymannx
20

Qualquer conselho para "chmod blah" ou "chown X" não tem sentido sem saber: qual é o usuário padrão: group nos arquivos e qual usuário e grupos seu servidor web executa.

Os Drupal Docs aos quais os usuários se vincularam são bastante bons sobre o assunto, mas um outro recurso é o Módulo de revisão de segurança, que ajuda a garantir que você tenha tudo definido corretamente.

greggles
fonte
9

Responderei considerando o caso em que os arquivos são criados no servidor usando FTP, usando credenciais diferentes daquela sob a qual o servidor da web é executado (normalmente, o Apache é executado como ninguém / ninguém). Isso significa que o usuário que possui os arquivos criados manualmente antes de executar o instalador do Drupal (que inclui também os arquivos carregados no servidor do arquivo Drupal) não é o usuário usado para executar o servidor da Web (nem o nome de usuário nem o grupo correspondem) . Este cenário também se aplica ao caso em que esses arquivos são criados usando SSH.

  • O arquivo settings.php deve ser gravável no instalador do Drupal, mas, uma vez concluída a instalação, é sugerido que seja somente leitura (o instalador sugere isso, e o Drupal verifica periodicamente se o arquivo é realmente somente leitura). No cenário que estou descrevendo, a permissão deste arquivo deve ser pelo menos 644.
  • Os arquivos .htaccess (que estão presentes em pelo menos dois locais) devem ter a permissão 644. O usuário que criou o arquivo ainda poderá substituí-lo, caso uma próxima versão do Drupal venha com um arquivo .htaccess que foi atualizado (já aconteceu uma vez, quando foi adicionada uma linha a esse arquivo para evitar um problema de segurança). Também é possível definir as permissões para 444, mas, nesse caso, as permissões devem ser alteradas novamente para 644 quando o arquivo precisar ser atualizado.
  • O diretório que contém os arquivos criados pelos módulos (o default/filesdiretório) deve ser (para o usuário designado aos processos do servidor da web, que é o usuário designado aos scripts PHP em execução nesse servidor da web):
    • legível
    • gravável
    • atravessável (os módulos devem poder alcançar default/files/<directory-used-by-the-module>/<sub-directory-used-by-the-module>)
kiamlaluno
fonte
depois de ler o encadeamento em drupal.org/node/244924 e especificamente drupal.org/node/244924#comment-8186447, nenhum dos métodos diferentes forneceu como obter arquivos sendo carregados com apenas 660 RW-RW ---- ie. sem bit de execução. Não é o principal problema de segurança?
precisa saber é o seguinte
8

Permissões recomendadas de arquivo / diretório:

  • O webroot do Drupal deve ser legível em todo o mundo (consulte: updater.inc ): 0755
  • para diretórios de upload públicos: 0755 ou 0775
  • para diretórios de upload privados: 0750 ou 0770
  • para arquivos públicos enviados: 0644 ou 0664
  • para arquivos enviados privados: 0640 ou 0660
  • para .htaccess nos diretórios de upload (consulte: file_create_htaccess () ): 0444 (padrão) ou 0644
  • para settings.php somente leitura para todos (e outros arquivos confidenciais): 0440
  • para todos os outros diretórios da web: 0755
  • para todos os outros arquivos da web: 0644

Propriedade recomendada de arquivo / diretório:

  • O proprietário de todos os diretórios / arquivos de upload deve ser definido como usuário do Apache,
  • O proprietário de todos os diretórios / arquivos da web / fontes deve ser definido como usuário não Apache,
  • (opcionalmente) o grupo de todas as fontes deve ser definido como grupo Apache,

Aqui estão as variáveis ​​que controlam as permissões padrão de arquivo / diretório para novos itens:

file_chmod_directory: 0775
file_chmod_file: 0664

Aqui está um script para corrigir permissões: fix-permissions.sh


Consulte Mais informação:


Aqui está o script que estou usando para corrigir permissões no host remoto para diretórios públicos / privados:

#!/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: O código acima tentará recuperar o grupo Apache e configurá-lo como GET_HTTP_GROUPvariável.

kenorb
fonte
muito bom cheat-sheet, marcado. Bom trabalho ..
kiranking 14/09/16
4

Este script shell é encontrado na parte inferior desta página: https://www.drupal.org/node/244924

Eu o executo ocasionalmente para garantir que minhas permissões sejam configuradas corretamente.

#!/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.
Richard Robinson
fonte
2

Além disso, se você estiver executando o fastcgi, o php executará como o usuário e terá acesso a todos os arquivos aos quais o usuário tem acesso, a menos que você tente deliberadamente evitar isso.

G.Martin
fonte
1

Isso me ajudou com meus problemas de permissão OSX. Encontrei-o em https://www.drupal.org/node/244924#comment-3741738 pelo usuário do protoplasma. Eu era como ele tendo problemas após uma migração.

[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
cayerdis
fonte
-3

Existe um módulo chamado Revisão de segurança que verifica se seu site é seguro ou não. Eu também encontrei um link muito bom para definir permissões de site.

Manikandan
fonte