Разрешение файлов с помощью nginx [закрыто]

Я новичок в мире веб-серверов, так что терпите меня.

Я пытаюсь создать свой собственный API для мобильного приложения с использованием Ubuntu, Nginx и Lumen.

Все шло хорошо, пока я не пришел загрузить изображения из мобильного приложения на свой веб-сервер и сохранить URL-адрес в серверной части базы данных mysql .

Предположим, моя папка проекта называется TestProject , и я хочу сохранить изображения в папке Testproject / public / Images / user_id / img.png .

Какие разрешения я должен использовать, чтобы только веб-сервер мог записывать папки и изображения, а кто-либо другой мог читать изображения только через URL-запрос?

Обновите, чтобы уточнить:

Меня больше всего беспокоит то, что безопасность (я не хочу, чтобы они удаляли, добавляли или выполняли файлы на моем сервере), поэтому для большей ясности мой сценарий выглядит следующим образом:

  • Пользователь мобильного приложения отправляет изображения и user_id (будет использоваться как имя подпапки) через почтовый запрос http / https.
  • На стороне сервера код PHP-Lumen получит изображения и сохранит их в папке Testproject / public / Images / user_id / img.png (как я упоминал ранее, этот шаг должен выполняться только через Интернет. пользователь сервера; теперь у меня только root ), а затем сохраняю URL-адрес изображения в базе данных MySQL.
  • Все пользователи мобильных приложений могут читать все изображения по URL (в мобильном приложении приложение считывает среднее значение загрузки по запросу http / https).

Мое предлагаемое решение:

Создание нового суперпользователя и сделать его владельцем всех папок проекта и дать ему права на чтение и запись папок и файлов (что я не знаю, как это сделать) и дать миру разрешение только на чтение всех файлов в папке / images (что я тоже не знаю, как это сделать).

0
задан 2 January 2018 в 15:03

2 ответа

Из того, что я могу сказать (и почти невозможно определить, что вы действительно пытаетесь решить / достичь - если что-то, вероятно, является проблемой XY ), то, что вы пытаетесь сделать, это сделайте так, чтобы веб-сервер мог читать / записывать папки и файлы, но чтобы «конечная точка», которую вы получили для клиентов, могла только читать данные. Вы не можете получить его обоими способами, не вращая два совершенно разных веб-сервера с совершенно разными наборами разрешений. Как было сказано в другом ответе, это не защищает вас от защиты вашего основного веб-сервера для чтения / записи от атак.


Из моей интерпретации вы, похоже, хотите, чтобы веб-сервер и соответствующий бэкэнд обрабатывали только доступ к файлам и URL-адресам обслуживания для клиентов конечной точки, которые фактически загружаются (для изображений и т. д.). Это не больше, чем основные разрешения веб-сервера, о которых я говорил в другом ответе. который я связал в комментариях (и ниже в конце этого ответа.)


Это краткое изложение шагов, которые вам необходимо получить, чтобы получить базовую структуру разрешений файловой системы веб-сервера для , Вы не должны были делать намного больше, чем это. Если вы это сделаете, то это зависит от того, как вы пишете свой бэкэнд для обработки разрешений, и выходит за рамки того, что здесь ответственно.

Шаг 1: Поместите каталог проекта в доступное для веб-сервера место, например, в папку под /var/www/ для имени сайта.

sudo mkdir /var/www/PROJECTDIR

Шаг 2: Поместите туда все свои файлы проекта (от имени пользователя root).

Шаг 3: Изменить владельца структуры каталога для нового каталога на www-data:www-data для веб-сервера.

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

Шаг 4: Дайте www-data пользователю / группе права на чтение / запись / выполнение для всех каталогов и права на чтение / запись для всех файлов в каталоге проекта.

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

Шаг 5: Готово.

Похоже, вам не нужны какие-либо другие учетные записи пользователей в самой системе (не-root-пользователи, другие системные пользователи и т. Д.), Чтобы видеть что-либо в подкаталогах здесь, так что вышеприведенное выполнит это.

Кажется, вам также не нужны какие-либо специальные разрешения , потому что написанное вами бэкэнду нужно правильно обработать, должен ли данный запрос в свою очередь возвращать данный URL для данного изображения в система. Если у него нет такого типа обработки разрешений, это проблема для вашего отдельного бэкенда, а не проблема NGINX и не проблема системных прав доступа к файлам.

Обратите внимание, что, как я сказал выше, это тот же набор инструкций из другого ответа , который в основном делает то же самое.

2
ответ дан 2 January 2018 в 15:03

Эти два требования внешне противоречивы:

Какие разрешения я должен использовать, чтобы только веб-сервер мог писать папки и изображения, а кто-либо другой может только читать изображения с помощью только URL-запроса ?

Процесс веб-сервера отвечает как за прием, организацию и хранение новых изображений, так и за их последующий поиск. необходимо права на запись для выполнения первой задачи. Единственный способ обойти это - запустить отдельные веб-серверы для хранения и поиска с разными привилегиями, однако я не уверен, что вы надеетесь получить благодаря этому: злоумышленник все еще может атаковать сервер загрузки изображений, имеющий права записи.

1
ответ дан 2 January 2018 в 15:03

Другие вопросы по тегам:

Похожие вопросы: