permissão de arquivos com nginx [closed]

0

Sou novo no mundo dos servidores da web, então, por favor, tenha paciência comigo.

Estou tentando criar minha própria API para aplicativos para dispositivos móveis usando o Ubuntu, o Nginx e o Lumen.

Tudo estava indo bem até que eu vim fazer o upload de imagens do aplicativo móvel para o meu servidor web e salvar o URL no backend do banco de dados mysql .

Vamos supor que minha pasta de projeto tenha o nome TestProject e que eu queira salvar as imagens em Testproject/public/Images/user_id/img.png .

Quais permissões eu devo usar para fazer apenas o servidor web capaz de escrever as pastas e imagens, e qualquer outra pessoa só pode ler as imagens apenas por solicitação de URL?

Atualização para esclarecer:

Minha principal preocupação é a segurança (não quero excluir, adicionar ou executar arquivos no meu servidor), para ficar mais claro que meu cenário é o seguinte:

  • O usuário do aplicativo para dispositivos móveis envia as imagens e user_id (a serem usadas como nome da subpasta) por meio da solicitação de postagem http / https.
  • No código PHP-Lumen do lado do servidor receberá as imagens e as salvará em Testproject/public/Images/user_id/img.png (como mencionei antes, essa etapa deve ser feita apenas pelo usuário do servidor web; agora tenho apenas raiz ) e, em seguida, salve o URL da imagem no banco de dados MySQL.
  • Todos os usuários de aplicativos para dispositivos móveis podem ler todas as imagens via URL (em dispositivos móveis app lê download médio via solicitação http / https).

Minha solução sugerida:

Criando um novo superusuário e tornando-o o proprietário de todas as pastas do projeto, dando-lhe as permissões para ler e gravar pastas e arquivos (que eu não sei como fazer) e dar permissão ao mundo para ler apenas todos os arquivos dentro da pasta /images (que eu também não sei como fazer).

    
por Ali Adil 02.01.2018 / 01:15

2 respostas

2

Pelo que eu posso dizer (e é quase impossível determinar o que você realmente está tentando resolver / alcançar - se houver alguma coisa, provavelmente é um ), o que você está tentando fazer é fazer com que o servidor possa ler / gravar pastas e arquivos, mas que o 'endpoint' que você tenho para os clientes só podem ler dados. Você não pode ter as duas coisas sem girar dois servidores Web completamente separados com conjuntos de permissões completamente diferentes. Como foi dito em outra resposta, isso não protege você de ter seu principal servidor de leitura / gravação protegido contra ataques.

A partir da minha interpretação, o que você parece querer é permitir que o servidor da Web e o back-end correspondente acessem os arquivos e as URLs de serviço para que os clientes do nó de extremidade carreguem (para imagens, etc.). Isso não é mais do que as permissões do servidor Web básico que eu toquei em outra resposta. que eu liguei nos comentários (e abaixo no final desta resposta).

Este é um resumo das etapas necessárias para obter uma estrutura de permissões do basic servidor de arquivos do sistema da Web para isso. Você não deveria ter que fazer muito mais que isso. Se você fizer isso, é a maneira como você escreve seu back-end para lidar com as permissões e está além do escopo do que pode ser respondido aqui.

Etapa 1: coloque o diretório do projeto em um local acessível por servidor da web, como uma pasta em /var/www/ para o nome do site.

sudo mkdir /var/www/PROJECTDIR

Etapa 2: coloque todos os seus arquivos de projeto lá (como o usuário root para começar).

Etapa 3: altere a propriedade da estrutura de diretório do novo diretório para www-data:www-data para o servidor da Web.

sudo chown -R www-data:www-data /var/www/PROJECTDIR

Etapa 4: conceda privilégios de leitura / gravação / execução a www-data usuário / grupo para todos os diretórios e privilégios de leitura / gravação para todos os arquivos, dentro do diretório do projeto.

sudo find /var/www/PROJECTDIR -type d -exec chmod 770 {} \;
sudo find /var/www/PROJECTDIR -type f -exec chmod 660 {} \;

Passo 5: está feito.

Você não parece precisar de nenhuma outra conta de usuário no próprio sistema (usuários não-root, outros usuários do sistema, etc.) para poder ver qualquer coisa dentro dos subdiretórios aqui, então o acima irá realizar isso.

Você também não precisa de nenhuma permissão especial , pois cabe ao back-end que você escreveu manipular adequadamente se uma determinada solicitação deve, por sua vez, retornar uma determinada URL para uma determinada imagem no sistema. Se não tiver esse tipo de tratamento de permissões, isso é um problema para o seu back-end individual, não um problema do NGINX e não um problema de filepermissions do sistema.

Note que, como eu disse acima, este é o mesmo conjunto de instruções do outra resposta que basicamente faz o mesmo.

    
por Thomas Ward 02.01.2018 / 19:47
1

Esses dois requisitos são superficialmente contraditórios:

% bl0ck_qu0te%

O processo do servidor da Web é responsável pela recepção, organização e armazenamento de novas imagens e pela sua recuperação posterior. Ele precisa escrever privilégios para executar a primeira tarefa. A única maneira de contornar isso é executar servidores web separados para armazenamento e recuperação com diferentes privilégios, no entanto, não tenho certeza do que você espera obter com isso: um atacante ainda pode atacar o servidor de upload de imagens que possui privilégios de gravação. >     

por David Foerster 02.01.2018 / 18:30