Como configurar permissões do linux para a pasta WWW?

61

Resumo atualizado

O diretório / var / www é de propriedade de root:root , o que significa que ninguém pode usá-lo e é totalmente inútil. Como todos nós queremos um servidor web que realmente funcione (e ninguém deveria estar logado como "root"), então precisamos consertar isso.

Apenas duas entidades precisam de acesso.

  1. PHP / Perl / Ruby / Python todos precisam acessar as pastas e arquivos, pois eles criam muitos deles (por exemplo, /uploads/ ). Essas linguagens de script devem estar rodando sob o nginx ou apache (ou até mesmo alguma coisa como FastCGI para PHP).

  2. Os desenvolvedores

Como eles conseguem acesso? Eu sei que alguém, em algum lugar fez isso antes. Com muitos bilhões de sites por aí, você pensaria que haveria mais informações sobre esse assunto.

Eu sei que o 777 é uma permissão completa de leitura / gravação / execução para o proprietário / grupo / outro. Portanto, isso não parece ser necessário correto, pois concede permissões completas aos usuários aleatórios.

Quais permissões precisam ser usadas em /var/www para que:

  1. Controle de origem como git ou svn
  2. Usuários em um grupo como "websites" ( ou até mesmo adicionados a "www-data" )
  3. Servidores como o apache ou lighthttpd
  4. E PHP / Perl / Ruby

todos podem ler, criar e executar arquivos (e diretórios) lá?

Se eu estiver correto, os scripts Ruby e PHP não serão "executados" diretamente, mas passados para um intérprete. Portanto, não há necessidade de permissão de execução em arquivos em /var/www ...? Portanto, parece que a permissão correta seria chmod -R 1660 , o que tornaria

  1. todos os arquivos podem ser compartilhados por essas quatro entidades
  2. todos os arquivos não executáveis por engano
  3. bloqueia totalmente todos os outros membros do diretório
  4. defina o modo de permissão como "fixo" para todos os arquivos futuros

Isso está correto?

Atualização 1: Acabei de perceber que os arquivos e diretórios podem precisar de permissões diferentes - eu estava falando sobre os arquivos acima, por isso não sei quais seriam as permissões do diretório.

Atualização 2: A estrutura de pastas de /var/www é alterada drasticamente, já que uma das quatro entidades acima sempre adiciona (e algumas vezes remove) pastas e subpastas com muitos níveis de profundidade. Eles também criam e removem arquivos para os quais as outras 3 entidades podem precisar de acesso de leitura / gravação. Portanto, as permissões precisam fazer as quatro coisas acima para arquivos e diretórios. Como nenhum deles precisa de permissão de execução (veja a pergunta sobre ruby / php acima) eu diria que rw-rw-r-- permission seria tudo o que é necessário e completamente seguro já que essas quatro entidades são executadas por pessoal confiável (veja # 2) e todos os outros usuários no sistema só têm acesso de leitura.

Atualização 3: Isso é para máquinas de desenvolvimento pessoal e servidores de empresas privadas. Não há "clientes da Web aleatórios", como um host compartilhado.

Atualização 4: Este artigo de slicehost parece ser o melhor para explicar o que é necessário para configurar permissões para sua pasta www. No entanto, não tenho certeza de qual usuário ou grupo apache / nginx com PHP OR svn / git executará como e como alterá-los.

Atualização 5: Eu (acho) finalmente encontrei uma maneira de fazer tudo isso funcionar (resposta abaixo). No entanto, não sei se esta é a maneira correta e segura de fazer isso. Portanto, eu comecei uma recompensa. A pessoa que tem o melhor método de proteger e gerenciar o diretório www ganha.

    
por Xeoncross 22.03.2010 / 02:21

7 respostas

47

Depois de mais pesquisas, parece que outra (possivelmente a melhor maneira) de responder isso seria configurar a pasta www assim.

  1. sudo usermod -a -G developer user1 (adicione cada usuário ao grupo de desenvolvedores)
  2. sudo chgrp -R developer /var/www/site.com/ para que os desenvolvedores possam trabalhar lá
  3. sudo chmod -R 2774 /var/www/site.com/ para que apenas os desenvolvedores possam criar / editar arquivos (outro / mundo pode ler)
  4. sudo chgrp -R www-data /var/www/site.com/uploads para que o www-data (apache / nginx) possa criar uploads.

Como git é executado como qualquer usuário que esteja chamando, então, desde que o usuário esteja no grupo "desenvolvedor", ele deve ser capaz de criar pastas, editar arquivos PHP e gerenciar o repositório git.

Nota: No passo (3): '2' em 2774 significa 'set Group ID' para o diretório. Isso faz com que novos arquivos e sub-diretórios criados dentro dele herdem o ID do grupo do diretório pai (em vez do grupo primário do usuário). Referência: link

    
por 25.03.2010 / 22:27
8

Não tenho certeza se está "certo", mas aqui está o que faço no meu servidor:

  • / var / www contém uma pasta para cada site.
  • Cada site tem um proprietário designado, que é definido como o proprietário de todos os arquivos e pastas no diretório do site.
  • Todos os usuários que mantêm o website são colocados em um grupo para o website.
  • Este grupo é definido como o proprietário do grupo de todos os arquivos e pastas no diretório.
  • Quaisquer arquivos ou pastas que precisam ser escritos pelo servidor da Web (ou seja, PHP) têm seu proprietário alterado para www-data, o usuário no qual o apache é executado.

Tenha em mente que você deve ter o bit de execução ativado nos diretórios para que você possa listar o conteúdo.

    
por 22.03.2010 / 03:52
6

Depois de fazer mais pesquisas, parece que o git / svn TOOLS NÃO é um problema, uma vez que são executados como qualquer usuário que os esteja usando. (No entanto, os daemons git / svn são um assunto diferente!) Tudo que eu criei / clonei com git tinha minhas permissões e a ferramenta git estava listada em /usr/bin que se encaixa nessa tese.

Permissões do Git resolvidas.

As permissões do usuário parecem ser solucionáveis adicionando todos os usuários que precisam acessar o diretório www ao grupo www-data que o apache (e o nginx) executam como.

Então, parece que uma resposta para essa pergunta é assim:

Por padrão, /var/www é de propriedade de root:root e ninguém pode adicionar ou alterar arquivos lá.

1) Alterar o proprietário do grupo

Primeiro, precisamos alterar o grupo de diretórios www a ser de propriedade de "www-data" em vez do grupo "root"

sudo chgrp -R www-data /var/www

2) Adicionar usuários ao www-data

Em seguida, precisamos adicionar o usuário atual (e qualquer outra pessoa) ao grupo de dados www

sudo usermod -a -G www-data demousername

3) CHMOD www diretório

Altere as permissões de modo que SOMENTE o proprietário (root) e todos os usuários do grupo "www-data" possam rwx (ler / gravar / executar) arquivos e diretórios ( ninguém mais deveria ser capaz de acessar isto ).

sudo chmod -R 2770 /var/www

Agora, todos os arquivos e diretórios criados por qualquer usuário que tenha acesso (ou seja, no grupo "www-data") serão legíveis / graváveis pelo apache e, portanto, pelo php.

Isso está correto? E quanto aos arquivos que o PHP / Ruby cria - os usuários do www-data podem acessá-los?

    
por 24.03.2010 / 04:15
5

A aderência não é herança de permissões. A aderência em um diretório significa que apenas o proprietário de um arquivo, ou o proprietário do diretório, pode renomear ou excluir esse arquivo no diretório, apesar das permissões informarem o contrário. Assim 1777 em / tmp /.

No Unix clássico, não há herança de permissões com base no sistema de arquivos, apenas na umask do processo atual. Em * BSD, ou Linux com setgid no diretório, o campo de grupo dos arquivos recém-criados será definido como o mesmo do diretório pai. Para mais alguma coisa, você precisa olhar para as ACLs, com a ACL 'padrão' nos diretórios, o que permite que você tenha permissões herdadas.

Você deve começar definindo:  * o que os usuários têm acesso ao sistema  * qual é o seu modelo de ameaça

Por exemplo, se você estiver fazendo hospedagem na Web com vários clientes e não quiser que eles vejam os arquivos uns dos outros, você poderá usar um grupo comum "webcusts" para todos esses usuários e um modo de diretório de 0705. os arquivos servidos pelo processo do servidor web ( não em "webcusts") verão os outros perms e serão permitidos; os clientes não podem ver os arquivos uns dos outros e os usuários podem mexer em seus próprios arquivos. No entanto, isso significa que, no momento em que você permitir CGI ou PHP, você terá para garantir que os processos sejam executados como usuário específico (boa prática, para vários usuários em um host, por exemplo). prestação de contas). Caso contrário, os clientes poderiam mexer nos arquivos uns dos outros fazendo com que um CGI o fizesse.

No entanto, se o usuário em tempo de execução de um site for o mesmo do proprietário do site, você terá problemas para não proteger o conteúdo de usuários abusivos em caso de falha de segurança no script. É onde os hosts dedicados ganham, para que você possa ter um usuário em tempo de execução distinto do proprietário do conteúdo estático e não precisar se preocupar tanto com a interação com outros usuários.

    
por 22.03.2010 / 04:37
2

Eu acredito que a melhor maneira de fazer isso é usando ACLs Posix. Eles são confortáveis para trabalhar e oferecem todas as funcionalidades que você precisa.

link

Aqui está um guia sobre como usar as ACLs. Dependendo da sua distribuição, seu kernel já pode incluir o suporte da ACL.

link

    
por 26.03.2010 / 11:44
1

O proprietário do arquivo deve ser a pessoa que o cria, enquanto o grupo deve ser www-data. O modo para diretórios / arquivos é, em geral, 755/644. Enquanto para diretórios e arquivos o grupo precisa de acesso de escrita, o mod é 775/664. Suponha que o paddy seja o desenvolvedor. No total isso faz:

chown -R paddy:www-data /var/www/websiteindevelopment
chmod -R 755 /var/www/websiteindevelopment
chmod -R 775 /var/www/websiteindevelopment/directorywritablebygroup
find /var/www/websiteindevelopment -type f -perm 755 -print -exec chmod 644 {} \;  
find /var/www/websiteindevelopment -type f -perm 775 -print -exec chmod 664 {} \;
    
por 24.09.2012 / 20:08
0

Adicionando à resposta do @Xeoncross, eu acho que seria bom configurar permissões em arquivos e diretórios separadamente.

sudo find /var/www -type d -exec chmod 775 {} \;  # Change permissions of directories to rwxrwxr-x
sudo find /var/www -type f -exec chmod 664 {} \;  # Change file permissions to rw-rw-r--

Isso permitirá que desenvolvedores criem e modifiquem diretórios em / var / www. O que parece importante porque os desenvolvedores podem precisar criar diretórios adicionais ou remover um diretório que não seja mais necessário.

Ele também permitirá que desenvolvedores criem e modifiquem arquivos de código (leia HTML, arquivos PHP e similares). Mas, ainda assim, só permitirá acesso somente leitura para todos os outros.

    
por 09.12.2016 / 06:38