Краткий ответ: да
Ответ на этот вопрос однозначно да , и сказать иначе совершенно безответственно .
Длинный ответ: пример из реальной жизни
Позвольте мне привести очень реальный пример с моего очень реального сервера, где перемещение wp-config.php
за пределы корневого веб-узла специально предотвращало захват его содержимого .
Баг:
Взгляните на это описание ошибки в Plesk (исправлено в 11.0.9 MU # 27):
Plesk сбрасывает переадресацию поддоменов после синхронизации подписки с планом хостинга (117199)
Звучит безобидно, верно?
Ну, вот что я сделал, чтобы вызвать эту ошибку:
- Настройте поддомен для перенаправления на другой URL (например,
site.staging.server.com
на site-staging.ssl.server.com
).
- Изменен тарифный план подписки (например, конфигурация PHP).
Когда я сделал это, Plesk установил для субдомена значения по умолчанию: обслуживание содержимого ~/httpdocs/
без активных интерпретаторов (например, PHP).
И я не заметил. Неделями.
Результат:
- В
wp-config.php
веб-корне запрос на /wp-config.php
загрузку файла конфигурации WordPress.
- За
wp-config.php
пределами веб-рута появляется запрос на /wp-config.php
скачивание совершенно безвредного файла. Настоящий wp-config.php
файл не может быть загружен.
Таким образом, очевидно, что перемещение wp-config.php
за пределы корневого веб-узла имеет реальные преимущества в плане безопасности в реальном мире .
Как перейти wp-config.php
в любое место на вашем сервере
WordPress автоматически найдет один файл над вашей установкой WordPress для вашего wp-config.php
файла, так что если вы его переместили, все готово!
Но что, если вы переместили его куда-нибудь еще? Легко. Создайте новый wp-config.php
в каталоге WordPress с помощью следующего кода:
<?php
/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
/** Location of your WordPress configuration. */
require_once(ABSPATH . '../phpdocs/wp-config.php');
(Обязательно измените указанный выше путь к фактическому пути вашего перемещенного wp-config.php
файла.)
Если вы столкнулись с проблемой open_basedir
, просто добавьте новый путь к open_basedir
директиве в вашей конфигурации PHP:
open_basedir = "/var/www/vhosts/example.com/httpdocs/;/var/www/vhosts/example.com/phpdocs/;/tmp/"
Это оно!
Разбирая аргументы в обратном
Каждый аргумент против wp-config.php
выхода за пределы корня сети основывается на ложных предположениях.
Аргумент 1: если PHP отключен, он уже
Единственный способ, которым кто-то увидит, что содержимое [ wp-config.php
] - это если они обойдут ваш сервер PHP-интерпретатором ... Если это произойдет, у вас уже есть проблемы: у них есть прямой доступ к вашему серверу.
ЛОЖЬ : сценарий, который я описал выше, является результатом неправильной конфигурации, а не вторжения.
Аргумент 2: Случайное отключение PHP является редким и, следовательно, незначительным
Если у злоумышленника достаточно прав для изменения обработчика PHP, вы уже облажались. Случайные изменения очень редки в моем опыте, и в этом случае было бы легко изменить пароль.
ЛОЖЬ : сценарий, который я описал выше, является результатом ошибки в общей части серверного программного обеспечения, влияющей на общую конфигурацию сервера. Это вряд ли «редко» (и, кроме того, безопасность означает беспокойство по поводу редкого сценария).
WTF : смена пароля после вторжения вряд ли поможет, если во время вторжения была обнаружена конфиденциальная информация. Действительно, мы все еще думаем, что WordPress используется только для случайных блогов, а злоумышленники заинтересованы только в порчи? Давайте позаботимся о том, чтобы защитить наш сервер, а не просто восстановить его после того, как кто-нибудь войдет.
Аргумент 3: Отказ в доступе wp-config.php
достаточно хорош
Вы можете ограничить доступ к файлу через конфигурацию вашего виртуального хоста или
.htaccess
- эффективно ограничить внешний доступ к файлу таким же образом, как это делает перемещение за пределы корня документа.
FALSE : Представьте , что ваш сервер по умолчанию для виртуального хоста являются: нет PHP, нет .htaccess
, allow from all
(вряд ли необычное в производственной среде). Если ваша конфигурация каким-то образом сбрасывается во время обычной операции - например, при обновлении панели - все вернется в состояние по умолчанию, и вы будете выставлены.
Если ваша модель безопасности дает сбой, когда параметры случайно сбрасываются до значений по умолчанию, вам нужно больше безопасности.
WTF : Почему кто-то специально рекомендует меньшее количество уровней безопасности? Дорогие машины не просто имеют замки; у них также есть сигнализация, иммобилайзеры и GPS-трекеры. Если что-то стоит защищать, делай это правильно.
Аргумент 4: Несанкционированный доступ wp-config.php
не имеет большого значения
Информация о базе данных действительно единственная конфиденциальная информация в [ wp-config.php
].
ЛОЖЬ : ключи аутентификации и соли могут быть использованы при любом количестве возможных атак.
WTF : Даже если учетные данные базы данных были единственными wp-config.php
, вы должны быть напуганы злоумышленником, который заполучит их.
Аргумент 5: перемещение wp-config.php
вне веб-корня фактически делает сервер менее безопасным
Вам все еще нужно разрешить WordPress доступ [ wp-config.php
], поэтому вам нужно развернуть, open_basedir
чтобы включить каталог над корнем документа.
ЛОЖЬ : Предположим, wp-config.php
что в httpdocs/
, просто переместите его ../phpdocs/
, и установите, open_basedir
чтобы включить только httpdocs/
и phpdocs/
. Например:
open_basedir = "/var/www/vhosts/example.com/httpdocs/;/var/www/vhosts/example.com/phpdocs/;/tmp/"
(Не забудьте всегда указывать /tmp/
или свой tmp/
каталог пользователя , если он у вас есть.)
Вывод: файлы конфигурации всегда должны всегда находиться вне корневого веб-каталога.
Если вы заботитесь о безопасности, вы выйдете wp-config.php
за пределы своего веб-корня.