Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Условная ситуация: нехороший человек неизвестным образом загрузил на сайт вредный код. Можно ли путем изменения chmod для папок как-то от этого уберечься?
Не в сети
- Можно ли путем изменения chmod для папок как-то от этого уберечься?
chown -R www-data:www-data /site/root
chmod -R 0550 /site/root
Дальше chmod -R 0770 для папок, куда сайт должен иметь доступ на запись (кэш и пр.).
Также нужно отключить выполнение скриптов в папках, куда загружается пользовательский контент (аватары и пр.) — обычно он находится внутри public, т.е. там же где index.php, что позволяет выполнять код оттуда, если получится его туда записать.
Если принять эти меры, то доступ на запись будет только в папки, где выполнять PHP запрещено. Это, конечно, тоже плохо, если доступ каким-то образом будет получен (можно слить исходники сайта например), но всё-таки лучше, чем полная свобода писать куда угодно.
Не в сети
Также нужно отключить выполнение скриптов в папках, куда загружается пользовательский контент (аватары и пр.) - обычно он находится внутри public, т.е. там же где index.php, что позволяет выполнять код оттуда, если получится его туда записать.
Я правильно понял (на примере 'public')?
Для папок внутри можно сделать 770 или 750 (но не 777), для файлов сейчас стоит 644, думаю так и отсавить.
Не в сети
Тебе надо понять, что это за «770» и как работают права. На самом деле это просто.
У папки или файла есть «владелец» и есть «группа». Три цифры обозначают права для владельца, для группы и для всех остальных (одна цифра это сумма: 4 = чтение, 2 = запись, 1 = выполнение). Не вдаваясь в детали, для папок к каждой цифре также нужно добавлять 1 (выполнение). «Выполнение» вообще в контексте этого вопроса никак не используется (этот флаг не контролирует выполнение PHP-скриптов), т.е. для папок добавляй единицу, а для файлов — нет.
Для веб-сервера владелец это почти всегда www-data (если речь об Ubuntu). Группа тоже чаще всего www-data. Поэтому для владельца и для группы права (цифра) будут идентичные.
Из этого следует, что если ты хочешь запретить запись в папку public, то ты должен выставить минимально необходимые права, что есть:
Права выше выставляются командой
shchmod -R 0550 public
(не забудь ноль перед правами, иначе эффект будет неожиданный).
Соответственно, для файлов внутри public должны быть аналогичные права, только без добавленной 1:
Команда:
shchmod 0440 public/index.php public/...
.
Для папки с аватарами, с кэшем, с логами и прочим нужны права на запись. То есть для самой папки:
Давать права на запись без чтения нужно в специфичных случаях, а обычно если даются права на запись, то в итоге получаешь 6 (для файлов) или 7 (для папок).
Таким образом, для папки права будут 0770, а для файлов внутри папки с аватарами и прочим — 0660.
Если не можешь понять, где нужны какие права — выстави для всего корня сайта минимальные права (на чтение), т.е. для всех папок и файлов рекурсивно, затем попробуй запустить сайт и смотря по логам добавляй права на запись для папок, где они требуются.
Однако всё вышеописаное не отключает выполнение скриптов в этих папках, а только отключает в них запись (что тоже важно). Выполнение нужно отключать в настройках сервера, то есть nginx или Apache, и однозначных рекомендаций тут нет — они зависят от настройки конкретно твоего хоста (для nginx — это блок server, для Apache — VirtualHost).
В твоём случае, наверное, достаточно простого ограничения прав на запись, но всегда хорошо, когда есть разные механизмы обеспечения безопасности — один подвёл (его забыли настроить и другой человеческий фактор), зато другой сработал. Поэтому есть смысл разобраться и с этим.
- Для папок внутри можно сделать 770 или 750 (но не 777), для файлов сейчас стоит 644, думаю так и отсавить.
7хх для папок и 6хх для файлов даёт доступ на запись, чего ты и хочешь избежать.
Не в сети
Доброго времени суток!
А вот такой вопрос. Нормально ли для всего сайта rwxrwx---, при условии, что www-data - владелец корневой папки ресурса, а пользователь, от имени которого осуществляются, например, "обновления" на сервере, входит в группу www-data?
С уважением.
Изменено Androbim (30.11.2017 13:02:36)
Не в сети
Если нет особых условий, то права рекомендуется давать только владельцу, отказывая даже единогрупникам, т.е. не боле чем 0755 для папок и 0644 для файлов.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
ри условии, что www-data - владелец корневой папки ресурса, а пользователь, от имени которого осуществляются, например, "обновления" на сервере, входит в группу www-data
а вот такие расклады это как раз "особые условия". и ответ кажется очевиден )))
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
кто делает "обновления", тот и будет владельцем, очевидно. в то же время, скрипты сайта могут создавать свои файлы, как например кеш, загруженные пользовательские файлы, логи и т.п. поэтому как минимум некоторые папки придется дать на запись группе. но п.м.с.м. таки не для всего сайта, а только то, что необходимо.
хорошая паранойя не повредит.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Большое спасибо!
Я правильно понимаю, что, в таком случае, тот же git pull, к примеру, надо выполнять от www-data либо через sudo?
Не в сети
Для "спасибо" есть кнопочка
Я правильно понимаю, что, в таком случае, тот же git pull, к примеру, надо выполнять от www-data либо через sudo?
Да, правильно. Ну или делайте chown -R … и/или chmod -R …
Кстати, имейте в виду при sudo:
можно дать право sudo конкретно для выполнения /usr/bin/git а не на всё подряд
публичный ключ доступа к репе вам надо дать тому кто вызывает git, т.е. www-data, а не пользователю-обновлятору
Изменено artoodetoo (30.11.2017 14:11:52)
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Кнопочку я нажал пару раз :-)
А со вторым Вашим пунктом не совсем понятно.
Я предполагал так. www-data отдельно (только действия от имени сервера), обновления - отдельно. Но коли уж нельзя дать права на запись во все папки группе www-data, то включать туда пользователя-обновлятора, смысла не имеет, а нужно просто заходить под ним, и делать тот же pull через sudo.
Изменено Androbim (30.11.2017 14:18:27)
Не в сети
Я именно про описанный случай и говорю. Когда ты делаешь `sudo -u www-data git pull …` ты обращаешся к git-репозиторию от имени www-data, верно? Так вот, пользователь www-data должен иметь публичный ключ, который зарегистрирован на сервере git.
Я предполагаю, что для доступа ты используешь ключи, а не пароль в командной строке ))) У нас ведь тема о безопасности.
www-data, Карл!
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
А под другим пользователем можно обновиться (git pull) через sudo? Обязательно от имени www-data? Или просто так было бы логичнее?
Сорри, я понял :-) Спасибо!
Изменено Androbim (30.11.2017 14:36:22)
Не в сети
www-data здесь как пример. Просто изначально в твоём коментарии прозвучал он. Ключ к репе нужен тому, от чьего имени вызывается git. Ключ можно привязать к конкретному сервису, не обязательно иметь один на все случаи.
содержимое домашней папки ssh
/home/www-data/.ssh/
config
androbim-bitbucket-ro.pub
содержимое config:
Host bitbucket.com
User git
IdentityFile ~/.ssh/androbim-bitbucket-ro.pub
IdentitiesOnly yes
Теперь когда пользователь www-data (или кто-то через судо от его имени) обращается к репе на Bitbucket, будет использован ключик из файла androbim-bitbucket-ro.pub
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
т.е. не боле чем 0755 для папок и 0644 для файлов.
Для сервера актуально 0750, зачем "миру" даже читать скрипты? А если там пароли/доступы к БД/почтовикам и прочему добру?
В доступе r/w для группы www-data я лично проблем не вижу, т.к. обычно в ней только один пользователь и состоит (сам www-data), так что 0770 не отличается от 07*0.
Не в сети
Я пока сделал 0700, протестил основные моменты, вроде-бы, все работает, и сайт, и консольные.
Не в сети
Страницы 1