Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 17.03.2017 19:20:36

Безопасность сайта

Условная ситуация: нехороший человек неизвестным образом загрузил на сайт вредный код. Можно ли путем изменения chmod для папок как-то от этого уберечься?

Не в сети

#2 17.03.2017 19:24:31

Re: Безопасность сайта

  1. Можно ли путем изменения chmod для папок как-то от этого уберечься?

chown -R www-data:www-data /site/root
chmod -R 0550 /site/root
Дальше chmod -R 0770 для папок, куда сайт должен иметь доступ на запись (кэш и пр.).

Также нужно отключить выполнение скриптов в папках, куда загружается пользовательский контент (аватары и пр.) — обычно он находится внутри public, т.е. там же где index.php, что позволяет выполнять код оттуда, если получится его туда записать.

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

Не в сети

#3 17.03.2017 23:04:39

Re: Безопасность сайта

Proger_XP пишет:

Также нужно отключить выполнение скриптов в папках, куда загружается пользовательский контент (аватары и пр.) - обычно он находится внутри public, т.е. там же где index.php, что позволяет выполнять код оттуда, если получится его туда записать.

Я правильно понял (на примере 'public')?
Для папок внутри можно сделать 770 или 750 (но не 777), для файлов сейчас стоит 644, думаю так и отсавить.

Не в сети

#4 17.03.2017 23:32:51

Re: Безопасность сайта

Тебе надо понять, что это за «770» и как работают права. На самом деле это просто.

У папки или файла есть «владелец» и есть «группа». Три цифры обозначают права для владельца, для группы и для всех остальных (одна цифра это сумма: 4 = чтение, 2 = запись, 1 = выполнение). Не вдаваясь в детали, для папок к каждой цифре также нужно добавлять 1 (выполнение). «Выполнение» вообще в контексте этого вопроса никак не используется (этот флаг не контролирует выполнение PHP-скриптов), т.е. для папок добавляй единицу, а для файлов — нет.

Для веб-сервера владелец это почти всегда www-data (если речь об Ubuntu). Группа тоже чаще всего www-data. Поэтому для владельца и для группы права (цифра) будут идентичные.

Из этого следует, что если ты хочешь запретить запись в папку public, то ты должен выставить минимально необходимые права, что есть:

  • Для владельца = 4 (чтение) + 1 (выполнение, т.к. это папки) = 5
  • Для группы (которая = владельцу) = 4 + 1 = 5
  • Для остальных = 0 (ничего)

Права выше выставляются командой shchmod -R 0550 public (не забудь ноль перед правами, иначе эффект будет неожиданный).

Соответственно, для файлов внутри public должны быть аналогичные права, только без добавленной 1:

  • Для владельца = 4
  • Для группы = 4
  • Для остальных = 0

Команда: shchmod 0440 public/index.php public/....

Для папки с аватарами, с кэшем, с логами и прочим нужны права на запись. То есть для самой папки:

  • Для владельца = 4 (чтение) + 2 (запись) + 1 (выполнение, т.к. это папки) = 7
  • Для группы = 4 + 2 + 1 = 7
  • Для остальных = 0 (ничего)

Давать права на запись без чтения нужно в специфичных случаях, а обычно если даются права на запись, то в итоге получаешь 6 (для файлов) или 7 (для папок).

Таким образом, для папки права будут 0770, а для файлов внутри папки с аватарами и прочим — 0660.

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


Однако всё вышеописаное не отключает выполнение скриптов в этих папках, а только отключает в них запись (что тоже важно). Выполнение нужно отключать в настройках сервера, то есть nginx или Apache, и однозначных рекомендаций тут нет — они зависят от настройки конкретно твоего хоста (для nginx — это блок server, для Apache — VirtualHost).

В твоём случае, наверное, достаточно простого ограничения прав на запись, но всегда хорошо, когда есть разные механизмы обеспечения безопасности — один подвёл (его забыли настроить и другой человеческий фактор), зато другой сработал. Поэтому есть смысл разобраться и с этим.


  1. Для папок внутри можно сделать 770 или 750 (но не 777), для файлов сейчас стоит 644, думаю так и отсавить.

7хх для папок и 6хх для файлов даёт доступ на запись, чего ты и хочешь избежать.

Не в сети

#5 30.11.2017 13:00:58

Re: Безопасность сайта

Доброго времени суток!

А вот такой вопрос. Нормально ли для всего сайта rwxrwx---, при условии, что www-data - владелец корневой папки ресурса, а пользователь, от имени которого осуществляются, например, "обновления" на сервере, входит в группу www-data?

С уважением.

Изменено Androbim (30.11.2017 13:02:36)

Не в сети

#6 30.11.2017 13:24:06

Re: Безопасность сайта

Если нет особых условий, то права рекомендуется давать только владельцу, отказывая даже единогрупникам, т.е. не боле чем 0755 для папок и 0644 для файлов.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#7 30.11.2017 13:26:12

Re: Безопасность сайта

Androbim пишет:

ри условии, что www-data - владелец корневой папки ресурса, а пользователь, от имени которого осуществляются, например, "обновления" на сервере, входит в группу www-data

а вот такие расклады это как раз "особые условия". и ответ кажется очевиден )))


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#8 30.11.2017 13:31:36

Re: Безопасность сайта

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

хорошая паранойя не повредит.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#9 30.11.2017 13:35:43

Re: Безопасность сайта


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#10 30.11.2017 13:51:22

Re: Безопасность сайта

Большое спасибо!
Я правильно понимаю, что, в таком случае, тот же git pull, к примеру, надо выполнять от www-data либо через sudo?

Не в сети

#11 30.11.2017 14:02:23

Re: Безопасность сайта

Для "спасибо" есть кнопочка wink

Я правильно понимаю, что, в таком случае, тот же git pull, к примеру, надо выполнять от www-data либо через sudo?

Да, правильно. Ну или делайте chown -R … и/или chmod -R …

Кстати, имейте в виду при sudo:

  1. можно дать право sudo конкретно для выполнения /usr/bin/git а не на всё подряд

  2. публичный ключ доступа к репе вам надо дать тому кто вызывает 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.

Не в сети

#12 30.11.2017 14:13:36

Re: Безопасность сайта

Кнопочку я нажал пару раз :-)
А со вторым Вашим пунктом не совсем понятно.
Я предполагал так. www-data отдельно (только действия от имени сервера), обновления - отдельно. Но коли уж нельзя дать права на запись во все папки группе www-data, то включать туда пользователя-обновлятора, смысла не имеет, а нужно просто заходить под ним, и делать тот же pull через sudo.

Изменено Androbim (30.11.2017 14:18:27)

Не в сети

#13 30.11.2017 14:28:25

Re: Безопасность сайта

Я именно про описанный случай и говорю. Когда ты делаешь `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.

Не в сети

#14 30.11.2017 14:34:25

Re: Безопасность сайта

А под другим пользователем можно обновиться (git pull) через sudo? Обязательно от имени www-data? Или просто так было бы логичнее?

Сорри, я понял :-) Спасибо!

Изменено Androbim (30.11.2017 14:36:22)

Не в сети

#15 30.11.2017 14:46:20

Re: Безопасность сайта

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.

Не в сети

#16 30.11.2017 22:46:38

Re: Безопасность сайта

т.е. не боле чем 0755 для папок и 0644 для файлов.

Для сервера актуально 0750, зачем "миру" даже читать скрипты? А если там пароли/доступы к БД/почтовикам и прочему добру?

В доступе r/w для группы www-data я лично проблем не вижу, т.к. обычно в ней только один пользователь и состоит (сам www-data), так что 0770 не отличается от 07*0.

Не в сети

#17 01.12.2017 07:11:00

Re: Безопасность сайта

Я пока сделал 0700, протестил основные моменты, вроде-бы, все работает, и сайт, и консольные.

Не в сети

Подвал раздела