Conceda permissões de usuário a www-data owned / var / www

36

Eu tenho uma configuração simples de servidor web para alguns sites, com um layout parecido com:

site1: /var/www/site1/public_html/

site2: /var/www/site2/public_html/

Anteriormente, usei o usuário root para gerenciar arquivos e depois os devolvi www-dataquando terminei (sites do WordPress, necessários para que o WP Uploads funcionasse). Esta provavelmente não é a melhor maneira.

Estou tentando encontrar uma maneira de criar outro usuário (vamos chamá-lo de user1) que tem permissão para editar arquivos no site1, mas não no site2, e não impede que os arquivos sejam de propriedade de www-data. Existe alguma maneira de eu fazer isso?

George Pearce
fonte

Respostas:

70

Se verificarmos a propriedade do site1, encontraremos algo assim,

ls -ld /var/www/site1/
drwxr-xr-x 2 root root 4096 Oct 24 21:06 site1/

Isso significa que o diretório pertence à raiz do usuário, raiz do grupo. Enquanto a raiz do usuário tem permissão de gravação (além de permissões de leitura e execução) no diretório, a raiz do grupo possui apenas permissões de leitura e execução.

Queremos alterar a propriedade do grupo para outro (novo) grupo e adicionar usuário1 a esse grupo específico. Também daremos permissão de gravação para esse grupo específico.

Crie um novo grupo,

sudo addgroup site1

Adicione user1 ao grupo recém-criado,

sudo adduser user1 site1

Verifique se o usuário1 está realmente nesse grupo,

groups user1

A saída deve ser uma lista algo como,

user1 : <other-groups> site1

Agora podemos alterar a propriedade do grupo do diretório pretendido.

sudo chown -vR :site1 /var/www/site1/
changed ownership of `/var/www/site1/' from root:root to :site1

Conceda permissão de gravação para este novo proprietário do grupo,

sudo chmod -vR g+w /var/www/site1/
mode of `/var/www/site1/' changed from 0755 (rwxr-xr-x) to 0775 (rwxrwxr-x)

Verifique se todas as mudanças estão realmente lá,

ls -ld /var/www/site1/
drwxrwxr-x 2 root site1 4096 Oct 24 21:06 /var/www/site1/

Portanto, o diretório agora pertence ao usuário root, grupo site1. O site raiz e o grupo1 do usuário têm permissão de gravação (além das permissões de leitura e execução) no diretório. Qualquer usuário pertencente ao site do grupo1 desfrutará de todos os privilégios concedidos a esse grupo.

Agora faça login como usuário1, vá para o diretório site1 e tente criar um arquivo nesse diretório,

echo "My User1 Site" > index.html 
bash: index.html: Permission denied

Isso falhou, pois provavelmente o grupo principal de usuário1 não é o site1. Então, mude para esse grupo.

newgrp - site1

Tente recriar o arquivo (lembre-se de que você foi movido para o diretório inicial do usuário1 após alterar o grupo), isso deve funcionar agora. Como os arquivos criados terão permissão de leitura mundial, o apache (ou seu servidor da Web) não deverá enfrentar nenhum problema ao acessá-los.

EDITAR

Além disso, conforme indicado por dan08 no comentário, você precisa adicionar www-data ao grupo site1.

sudo adduser www-data site1

Em muitas distribuições (não todas), www-data é o usuário sob o qual o servidor da web Apache é executado. Isso também significa que tudo o que é feito pelo Apache (especialmente incluindo scripts PHP) será feito com as permissões do usuário www-data (e também agrupe www-data) por padrão. O WordPress usa o usuário www-data para gravar arquivos.

Se você quiser ver como o servidor web apache está em execução, emita o comando,

ps aux | grep apache2 | less
Masroor
fonte
11
Você também precisa adicionar www-data ao grupo site1. Ao carregar e alterar arquivos na interface da web do Wordpress. As alterações são feitas pelo Apache usando o usuário www-data. portanto, privilégios de leitura não são suficientes na maioria das vezes.
Dan
3
A Permission deniedmensagem não é devida ao "grupo principal", mas sim ao usuário ainda não estar nesse grupo (no que diz respeito ao sistema operacional). Se você efetuar logoff e logon novamente, funcionará conforme o esperado (sem execução newgrp - site1).
precisa saber é o seguinte
Como exatamente isso seria diferente de dar www-datapermissões de grupo de escrita se você acabar tendo que adicionar www-dataa site1de qualquer maneira?
Matt
@MattBorja Sua pergunta não é muito clara. Você está perguntando o que há de errado em fornecer ao grupo chamado www-data' write permissions? If that is the question, www-data 'não é um grupo, é um usuário. Informe-me se eu entendi mal sua pergunta.
Masroor
Eu acho que isso não é uma configuração segura porque os usuários podem acessar os sites uns dos outros via script php, por exemplo, um gerenciador de arquivos php.
Qdinar
7

Crie dois grupos: site1grpesite2grp

sudo groupadd site1grp && sudo groupadd site2grp

Adicione www-dataaos dois grupos.

sudo adduser www-data site1grp && sudo adduser www-data site2grp

Adicione usuário1 e usuário2 aos grupos apropriados

sudo adduser user1 site1grp && sudo adduser user2 site2grp

Altere a permissão das pastas do site para que o proprietário do usuário seja www-data e o proprietário do grupo seja o grupo apropriado

sudo chown -R www-data:site1grp /var/www/site1  && sudo chown -R www-data:site2grp /var/www/site2

Agora www-datatem permissões de usuário e grupo nos dois sites e cada usuário tem permissões de grupo para o respectivo site.

Dan
fonte
4

Para aqueles que têm a pasta raiz do wordpress na pasta inicial:

Ubuntu / apache

  1. Adicione seu usuário ao grupo www-data:

    CRÉDITO Concedendo permissões de gravação ao grupo de dados www

    Você deseja chamar usermodseu usuário. Então isso seria:

    sudo usermod -aG www-data yourUserName
    

    Supondo que o www-datagrupo exista

  2. Verifique se seu usuário está em www-datagrupo:

    groups yourUserName
    

    Você deve obter algo como:

    yourUserName : yourUserGroupName www-data
    

    yourUserGroupName geralmente é semelhante ao seu nome de usuário

  3. Alterar recursivamente a propriedade do grupo da pasta, mantendo a propriedade do usuário

    chown yourUserName:www-data -R yourWebSiteFolder/*
    
  4. Mude o diretório para yourWebSiteFolder

    cd yourWebSiteFolder
    
  5. Altere recursivamente as premissas de grupo das pastas e subpastas para ativar as permissões de gravação:

    find . -type d -exec chmod -R 775 {} \;
    

    modo de /home/yourUserName/yourWebSiteFolder/'alterado de 0755 (rwxr-xr-x)para0775 (rwxrwxr-x)

  6. Altere recursivamente as premissas de grupo dos arquivos e subarquivos para ativar as permissões de gravação:

    find . -type f -exec chmod -R 664 {} \;
    

    O resultado deve ser algo como:

    WAS:
    -rw-r--r--  1 yourUserName www-data  7192 Oct  4 00:03 filename.html
    CHANGED TO:
    -rw-rw-r--  1 yourUserName www-data  7192 Oct  4 00:03 filename.html
    

    Equivalente a:

    chmod -R ug+rw foldername
    

    As permissões serão como 664 ou 775.

Jadeye
fonte
3

Você precisa criar um novo grupo para o chamado "novo usuário" e adicionar os dados de www e o "novo usuário" a esse grupo:

sudo gpasswd -a new_user new_group

Em seguida, você pode alterar o proprietário new_usere o grupo para new_group:

sudo chown -R new_user:new_group /var/www/site1

Em seguida, você precisará conceder acesso em nível de grupo ao site1. www-data ainda poderá acessar o site, porque pertence ao new_group, enquanto new_user não poderá acessar site2, porque ele não pertencerá ao grupo www-data, proprietário do site2.

errikos
fonte
Sua resposta é confusa, ao "dar acesso ao site1 ao nível do grupo", você quis dizer "alterar o grupo do site1 para new_group" ou alterar o modo ( chmod)? Sua resposta não menciona o modo em nenhum lugar que possa fazer a diferença de estar seguro (ou quebrar coisas).
Lekensteyn
Eu quis dizer mudar o modo ( chmod) revogando todas as permissões para OUTROS.
errikos
1

Assumindo que todos os arquivos já pertencem ao www-datausuário (você pode verificá-lo com o ls -slahcomando) quem pertence ao www-datagrupo (próxima coluna após o nome de usuário na lista de arquivos), basta adicionar seu usuário ao mesmo www-datagrupo para permitir a edição desses arquivos

# usermod -aG www-data username

para usuário existente ou

# adduser username www-data

para um recém-criado

vladkras
fonte