Я новичок в мире веб-серверов, так что терпите меня.
Я пытаюсь создать свой собственный API для мобильного приложения с использованием Ubuntu, Nginx и Lumen.
Все шло хорошо, пока я не пришел загрузить изображения из мобильного приложения на свой веб-сервер и сохранить URL-адрес в серверной части базы данных mysql
.
Предположим, моя папка проекта называется TestProject
, и я хочу сохранить изображения в папке Testproject / public / Images / user_id / img.png
.
Какие разрешения я должен использовать, чтобы только веб-сервер мог записывать папки и изображения, а кто-либо другой мог читать изображения только через URL-запрос?
Обновите, чтобы уточнить:
Меня больше всего беспокоит то, что безопасность (я не хочу, чтобы они удаляли, добавляли или выполняли файлы на моем сервере), поэтому для большей ясности мой сценарий выглядит следующим образом:
Testproject / public / Images / user_id / img.png
(как я упоминал ранее, этот шаг должен выполняться только через Интернет. пользователь сервера; теперь у меня только root ), а затем сохраняю URL-адрес изображения в базе данных MySQL.Мое предлагаемое решение:
Создание нового суперпользователя и сделать его владельцем всех папок проекта и дать ему права на чтение и запись папок и файлов (что я не знаю, как это сделать) и дать миру разрешение только на чтение всех файлов в папке / images
(что я тоже не знаю, как это сделать).
Из того, что я могу сказать (и почти невозможно определить, что вы действительно пытаетесь решить / достичь - если что-то, вероятно, является проблемой 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 и не проблема системных прав доступа к файлам.
Обратите внимание, что, как я сказал выше, это тот же набор инструкций из другого ответа , который в основном делает то же самое.
Эти два требования внешне противоречивы:
Какие разрешения я должен использовать, чтобы только веб-сервер мог писать папки и изображения, а кто-либо другой может только читать изображения с помощью только URL-запроса ?
Процесс веб-сервера отвечает как за прием, организацию и хранение новых изображений, так и за их последующий поиск. необходимо права на запись для выполнения первой задачи. Единственный способ обойти это - запустить отдельные веб-серверы для хранения и поиска с разными привилегиями, однако я не уверен, что вы надеетесь получить благодаря этому: злоумышленник все еще может атаковать сервер загрузки изображений, имеющий права записи.