Я работаю со свежей установкой PHP Laravel и заметил, что право собственности на все файлы и папки в общедоступном каталоге было рекурсивно изменено на пользователя веб-сервера www-data. Ниже представлен обзор файлов и владельцев общедоступной папки:
vagrant@dev:/laravel-app/public$ ls -al
total 20
drwxr-xr-x 2 www-data www-data 4096 Aug 10 09:19 .
drwxr-xr-x 12 www-data www-data 4096 Sep 15 10:39 ..
-rw-r--r-- 1 www-data www-data 0 Aug 10 09:19 favicon.ico
-rw-r--r-- 1 www-data www-data 603 Aug 10 09:19 .htaccess
-rw-r--r-- 1 www-data www-data 1710 Aug 10 09:19 index.php
-rw-r--r-- 1 www-data www-data 24 Aug 10 09:19 robots.txt
Нужно ли удалять разрешения на запись, чтобы сделать файловую структуру приложения более безопасной?
@brombeer вопрос, заданный два дня назад, помечен как «мнение» и закрыт. Как вы думаете, может ли быть 2 мнения по этому вопросу?
Правильное разрешение — 755 (drwxr-xr-x) для каталогов и 644 (-rw-r--r--) для файлов.
@LK77 LK77 Спасибо за предложение. А вот если для файлов выбрать 644. 6 означает чтение и запись. Это означает, что вы оставляете возможность записи для владельца, а владельцем в этом примере является www-data.
Это не предложение, это стандартное разрешение в экосистеме PHP, куда бы вы ни посмотрели, оно всегда 755/644, иногда 750/640, но это все. Я предполагаю, что если никто не удаляет разрешение w, это потому, что оно не повышает безопасность. Если у пользователя уже есть доступ к www-данным, у вас, я думаю, более серьезная проблема.
@ Lk77 перечитай мой комментарий еще раз. Вы ошиблись в своем предложении - 644 означает: 6 - читать и писать. первое число описывает разрешения владельца. владелец - www-data. Это означает, что вы собираетесь предоставить права на запись исходному коду веб-сервера.
@YanDatsiuk Я правильно прочитал, 6 означает rw для www-данных, и это так и есть, и это означает, что исходный код действительно будет иметь разрешение на запись, я только предполагаю, что это не рассматривается как проблема безопасности
@ Lk77, значит, вы утверждаете, что разрешение на чтение и запись для www-данных нормально и безопасно? Вы прочитали название этого вопроса?
Давайте продолжим обсуждение в чате.
@ Lk77, это звучит как плохой дизайн. Разрешений на чтение и выполнение должно быть достаточно. Исходный код не должен быть доступен для записи веб-серверу. Для этого редко, если вообще когда-либо, есть веская причина.
@ADyson в моих тестах владелец файла в любом случае сможет изменить права доступа к файлу, поэтому в этом случае веб-сервер не должен быть владельцем файла. Возможно, это звучит плохо, но это то, что я нашел в качестве рекомендуемого разрешения для php-файлов в Интернете, я не нашел ни одной статьи, рекомендующей устанавливать разрешения ниже 640. Возможно, лучше установить право собственности как root:www-data
@ Lk77 Lk77 Я не говорил о конкретном коде разрешения, который нужно использовать, а только об общем принципе, согласно которому веб-сервер не должен иметь возможности записывать в файлы. Однако ФП хочет, чтобы это произошло, зависит от них. Однако я предполагаю, что учетная запись веб-сервера, вероятно, не является хорошей идеей владеть файлами, она должна просто иметь возможность читать и выполнять их. И если учетная запись веб-сервера не является владельцем, то с 640 он не сможет их выполнить.
php-файлы не являются исполняемыми файлами, поэтому разрешение x не требуется, я пробовал с -r--r----- 1 lk77 www-data 20 Sep 18 11:13 test.php и sudo -u www-data php test.php работает нормально, поэтому минимальное разрешение — 440
Я суммирую все вышеизложенные идеи: лучшее решение на данный момент — установить разрешения 440, а также сменить владельца на другого пользователя: -r--r----- 1 root www-data 1883 Sep 18 11:34 index.php
@ADyson -- Source code should not be writable by the webserver -- Я могу вспомнить два конкретных случая (1) при автоматических обновлениях Wordpress: код изменяет код; но (2) в более широком смысле, где пользователю веб-сервиса нужен доступ, это действительно зависит от вашего приложения и дизайна. Например, Laravel и многие другие системы (небольшие по масштабу) используют файловую систему для таких вещей, как ведение журнала и кэширование, и даже загрузка хранилища или создание отчетов. В более крупных приложениях имеет смысл использовать Redis для кэширования или S3 для хранения файлов. Но не в небольших приложениях.
@JasonOlson ну, включение ведения журнала и кэширования не означает, что исходный код должен быть доступен для записи, для этого требуется только, чтобы файл журнала и кеш были доступны для записи. А что касается WordPress... ну, я понимаю вашу точку зрения, однако Wordpress также хорошо известен как одна из платформ, которая чаще всего становится жертвой различных форм хакерских атак и атак путем внедрения кода... трудно представить, что установка, в которой исходный код может быть перезаписан учетной записью веб-сервера, но это в некоторой степени не способствует этому.






Нет. Ну, вроде того. Иногда ничего не поделаешь. Но вы используете Laravel, поэтому ответ — нет.
Почему мы не хотим разрешить запись в файлы исходного кода:
В общем, файлы не должны быть доступны для записи веб-сервером, поскольку это значительно снижает как поверхность атаки, так и максимальный ущерб, который может нанести хакер. Например, даже если пользователь каким-то образом воспользуется недостатком безопасности в одном из ваших плагинов, чтобы иметь возможность загружать файлы, он не сможет загрузить замену index.php с keylogger или javascript-based bitcoin miner внутри, если сам веб-сервер не предоставляет доступ на запись.
Почему мы все равно можем захотеть разрешить запись в файлы исходного кода:
ОДНАКО. Некоторые CMS раздражаются, если у них нет доступа для записи. Например, в Wordpress есть чрезвычайно удобная кнопка Install updates, которая не будет работать, если у веб-сервера нет доступа на запись (поскольку он не может обновлять файлы без доступа на запись), и в такой ситуации вам понадобится для загрузки обновлений через FTP (или через этап клонирования, или как работает ваш DevOps).
В то время как, например, Drupal использует инструмент командной строки под названием composer для установки обновлений, но поскольку композитор запускается из командной строки через пользователя ssh, самому веб-серверу не требуется доступ для записи.
(Wordpress придерживается идеи, что мы не всегда можем ожидать, что каждый веб-администратор будет знать, как подключиться к серверу по SSH, поэтому он просто принимает повышенный риск безопасности ради удобных для пользователя обновлений.)
Исключения:
Тем не менее, многие CMS, такие как Wordpress или Drupal, позволяют администраторам загружать файлы (например, изображения или PDF-файлы). Для этих CMS сервер ДОЛЖЕН иметь доступный для записи каталог с именем uploads, который сервер может изменять.
Иногда им также необходимо иметь возможность записи в другие папки, например, у плагинов caching может быть каталог, который они используют.
Каждый отдельный тип веб-сайта будет иметь несколько разные каталоги, поэтому, как правило, вы можете спросить у Google, какие должны быть правильные разрешения для вашего веб-сайта.
Итог для Laravel:
Laravel запускает обновления через композитор, а это значит, что ВЫ будете запускать обновления. Так что нет, вашему веб-серверу не нужен доступ для записи. Правильные разрешения:
Пользователь: YourUsername
Группа: www-data
Каталоги: 2755
Файлы: 644
Однако каталог cache и каталог storage ДОЛЖНЫ быть доступны для записи серверу, поэтому мы изменим их на 2775 и 664...
Это должно сделать это:
cd /path/to/laravel-project/
sudo chown -r YourUsername:www-data .
sudo find ./ -type f -exec chmod 644 {} \;
sudo find ./ -type d -exec chmod 2755 {} \;
sudo chmod -R g+w storage
sudo chmod -R g+w bootstrap/cache
Почему именно требуются разрешения на выполнение? Это кажется ненужным и допустимым для PHP. Кроме того, этот подход предполагает (без указания/спрашивания?), ведут ли они журналирование на основе файлов (по умолчанию в Laravel), разрешают загрузку или любое количество других вещей, при которых существует намеренный доступ к локальному диску из приложения. Одним из основных модулей Laravel является компонент файловой системы, который, хотя и не является исключительным для локального хранилища, безусловно, иллюстрирует тот факт, что многим сайтам требуются системы хранения.
@JasonOlson Why exactly does it require execute permissions Для правильной работы каталогам необходимы разрешения на выполнение, но PHP этого не делает... поэтому мы не предоставили PHP выполнение. (644 не позволяет выполнить.) --- RE: Остальное - Да, эти настройки предназначены для типичной настройки. Я полагаю, что ВОЗМОЖНО, например. ОП не хочет разрешать администраторам добавлять изображения на веб-сайты, но большинство веб-сайтов выглядят лучше с изображениями, а это означает, что им необходимо разрешить загрузку файлов или всегда находиться рядом с редактором контента. (Полагаю, если только все не делается в STAGE.)
@JasonOlson Если вы чувствуете необходимость отключить функции, которые вам не нужны, и хотите дополнительно детализировать свои разрешения, я полагаю, вы МОЖЕТЕ использовать laravel.com/docs/10.x/structure для просмотра каждой каталог и решите, нужен ли он вам. Но многие разработчики не уверены ТОЧНО, какие каталоги им нужны, поэтому настройки «Разрешить Laravel писать в те каталоги, в которые он хочет, и блокировать все, в что Laravel не хочет писать» являются стандартной практикой.
TLDR; Удаление разрешений на запись для пользователя www-data в Laravel не рекомендуется. Это не дает никакой практической пользы в плане безопасности, поскольку Laravel полагается на доступ на запись для таких важных задач, как ведение журнала, кэширование и принятие пользовательских загрузок. Хотя можно использовать принцип наименьшего доступа, он нестандартен и может привести к проблемам с будущими изменениями кода. Опасения по поводу того, что злоумышленники получат доступ к www-data, должны привести к более широким соображениям безопасности, а для нескольких веб-сайтов на одном сервере лучше изолировать учетные записи пользователей.
Предоставление пользователю www-data права на запись в ваши файлы служит жизненно важной цели в Laravel. Он обеспечивает необходимые функции, такие как создание файлов журнала и кэша, компиляция шаблонов Blade, управление загрузкой файлов и упрощение создания файлов, например создание и хранение PDF-файлов локально. В зависимости от метода развертывания дополнительные задачи обслуживания файлов также могут требовать доступа для записи.
Стоит отметить, что в документации Laravel прямо указано: «Laravel может потребовать настройки некоторых разрешений: папок внутри и доступа на запись со стороны веб-сервера».
Хотя теоретически вы можете принять принцип наименьшего доступа и тщательно назначить разрешения на запись только для каталогов и файлов, которые, как ожидается, будут изменены, этот подход отличается от стандартной настройки. Следовательно, будущие изменения в вашем коде, такие как добавление компонента, требующего доступа на запись, могут привести к неожиданным проблемам, потенциально вызывающим сбои кода из-за ошибок прав доступа к файлам.
Опасения по поводу того, что злоумышленники получат доступ к пользователю www-data и выполнят несанкционированный код, должны побудить к всестороннему пересмотру методов обеспечения безопасности серверов. Предоставление доступа на запись — это лишь один аспект, и существуют более широкие уязвимости, которые необходимо устранить. Более того, поскольку пользователь строго ограничен и не разрешает интерактивный вход в систему, основной вектор атаки — через ваш код, и решение проблем безопасности должно включать в себя нечто большее, чем просто разрешения на запись файлов.
Важное исключение возникает при размещении нескольких веб-сайтов или виртуальных хостов на одном сервере. В этом сценарии крайне важно изолировать учетные записи пользователей для каждого веб-сайта, чтобы предотвратить доступ кода одного веб-сайта к коду другого веб-сайта или его изменение. Однако изоляцию учетных записей пользователей не следует рассматривать как простое удаление доступа на запись; он включает в себя настройку отдельных пользовательских сред для каждого веб-сайта для обеспечения безопасности и независимости.
Ирония вашего заявления заключается в том, что если вы отключите доступ для записи, вы фундаментально нарушите встроенные функции автоматического обновления Woocommerce. Таким образом, тем самым вы будете продвигать отсутствие возможности автоматического обновления сторонних плагинов. Более того, большинство крупных взломов Woo привели к утечке данных независимо от доступа на запись к пути.
@JasonOlson: На самом деле автоматические обновления (также WordPress) небезопасны, поэтому ирония заключается в формулировке вашего заявления. Но это более длительное обсуждение, вероятно, выходит за рамки данной темы, так что, к вашему сведению и без обид, мы не можем решить все проблемы сразу для программного обеспечения, которое мы представляем, только в их начале.
Каталоги storage и bootstrap/cache должны быть доступны для записи Laravel. Мы установим для них разрешения 0775, предоставив владельцу и группе разрешения на чтение, запись и выполнение, в то время как другие смогут только читать и выполнять.
Кроме того, если вы session, cache driver являетесь файлом, а filesystem driver похожи на s3, то вам не нужно разрешение 755 для хранения, вам нужно только дать разрешение на storage/framework/view.
Об этом уже спрашивали два дня назад и есть ответ, что-то изменилось с тех пор?