Конфигурация nginx для работы Livestreet

Наша команда активно использует nginx как самостоятельный веб-сервер. Мы с легкостью отказались от apache, и призываем к этому всех наших клиентов.

Для всех неравнодушных к хостингу Livestreet и производительности их сайтов публикуем конфиг для nginx:

root /home/{username}/domains/{parent_domain};

location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}

location ~* /templates/.*\.(tpl|php)$ {
deny all;
}

location /tmp {
deny all;
}

location ~ /\. {
deny all;
}

location ~ \.(tpl|xml|log|sql)$ {
deny all;
}

location ~*  \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 7d;
}

location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors on;
fastcgi_pass unix:/var/run/php5-{domain}.sock;
}


Для ваших PR всегда доступен репозиторий: github.com/elasticweb/nginx-configs

8 комментариев

avatar
Спасибо, протестирую
  • ff00
  • 0
avatar
Конфигурация плохая.

Не используйте try_files — это создает проблемы с безопасностью. К тому же зачем вам проверять листинг директории? Не используйте локейшены с шаблоном по *.php — еще одна дырка, ди и они вам вообще не к чему. Или у вас на одном server_name несколько движков с доступом по index.php?

И не придется городить костыли, типа таких (кстати почему только tpl и php)?
location ~* /templates/.*\.(tpl|php)$ {
deny all;
}
avatar
Аргументируйте, пожалуйста, своё сообщение о проблемах с безопасностью.
avatar
Можно скачать любой файл из директории сервера, или запустить произвольный php файл (включая временные файлы, архивы, конфиги, логи).
avatar
Вы ошибаетесь. Для защиты от этого существует директивы root /path ;, а также disable_symlinks if_not_owner from=$document_root; для большей безопасности.

Представленный конфиг подразумевает правила для директивы server {} конкретного сайта. Все условия для безопасности описываются выше.
avatar
Эээ нет. Вы кажется не поняли.
1. Директива try_files позволяет из директории сервера скачать любой файл. Именно для это вы добавляете вот этот костыль
location ~ \.(tpl|xml|log|sql)$ {
deny all;
}

— это очень плохой подход. Вы не можете знать о том, какие еще файлы могут оказаться в директориях движка и как доступ к ним может повлиять на безопасность. Пример: есть скрипты сканирующие стандартные директории типа config/ на предмет артефактов: config.php запрещен, ок, но у вас например не запрещены такие файлы как .swp .bak .~ и т.д., которые могут создаваться редакторами. А как насчет .gz? .backup? .old? Уверены? А если еще какой-то разработчик будет работать в директории он ничего не оставит? Поэтому такой подход очень плохой. Я запускаю скрипт который будет раз в минуту проверять создание копий config.php со всеми возможными расширениями, и как только он появится у меня будет пароль от БД. (примеров может быть сколько угодно).

2. Вот этот локейшен
location ~ \.php$ {


— разрешает выполнение ЛЮБОГО php файла в серверной директории. То есть представим такую ситуацию — в какой-нибудь поставке какого-нибудь плагина просто тупо лежит уязвимый php скрипт. Да можно хоть специально его туда подложить и раздавать на каких-нибудь левых ресурсах (например раздавать бесплатно платный плагин). Другой пример: предположим каким-то образом разрешена загрузка файлов с расширением php во временные директории внутри серверной директории и мы можем узнать имя файла после загрузки.

И самое главное что все это закрывается элементарно.
avatar
В вашей теории есть доля правды, но try files оптимально использовать для стилей и скриптов js, а также картинок.

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

На счёт скрипта проверяющего все возможные расширения config.php — ситуация скорее параноидальная (без обид).
Для наших клиентов всегда доступен nginx редактор, и в случае необходимости они могут запретить доступ к дополнительным папкам и файлам, усовершенствовав свой конфиг.

Будем рады видеть от вас PR на github.com/elasticweb/nginx-configs.

Спасибо за интересный диалог.
avatar
Вы не поняли главного, что безопасность всегда обеспечивается принципом: «все что не разрешено — запрещено», а не «все что не запрещено — разрешено», который реализован у вас.

На счёт скрипта проверяющего все возможные расширения config.php — ситуация скорее параноидальная (без обид).
Да ну что вы такое говорите, вот беглым поиском пара строчек с access логов моего продуктивного сервера (и такая дребедень постоянно):

(домен изменен)
77.81.***.*** - - [19/Sep/2016:**:**:** +0300] "HEAD /public_html.tar.gz HTTP/1.1" 404 0 "http://example.com/" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; YComp 5.0.2.6; Hotbar 4.2.8.0)"
77.81.***.*** - - [18/Sep/2016:**:**:** +0300] "HEAD /password.txt HTTP/1.1" 404 0 "http://example.com/" "Opera/7.03 (Windows NT 5.0; U) [de]"
77.81.***.*** - - [19/Sep/2016:**:**:** +0300] "HEAD /coin_payments.php.bak HTTP/1.1" 404 0 "http://example.com/" "Mozilla/5.0 (X11; U; Linux i686; es-AR; rv:1.9.0.4) Gecko/2008111317 Linux Mint/5 (Elyssa) Firefox/3.0.4"
77.81.***.*** - - [19/Sep/2016:**:**:** +0300] "HEAD /example.rar HTTP/1.1" 404 0 "http://example.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.02"
77.81.***.*** - - [19/Sep/2016:**:**:** +0300] "HEAD /example.tgz HTTP/1.1" 404 0 "http://example.com/" "Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.8.1.24) Gecko/20100228 SeaMonkey/1.1.19"
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.