Назад | Перейти на главную страницу

Как ограничить доступ к root пользователю демона?

У меня Apache 2.4 с PHP 5.5.14 установлен на последней версии Debian. В соответствии с советами и приемами безопасности Apache я установил свой httpd.conf следующим образом:

<Directory />
  AllowOverride none
  Require all denied
</Directory>
<Directory "/var/www">
  Options FollowSymLinks
  AllowOverride none
  Require all granted
</Directory>

Я перезапускаю сервер Apache и запускаю этот PHP-код:

<?php
  $filename = "/etc/passwd";
  $handle = fopen($filename, "r");
  $contents = fread($handle, filesize($filename));
  fclose($handle);
  echo($contents);
?>

Код получает весь файл / etc / passwd, и я считаю это серьезной проблемой безопасности. Я уже пару дней пытался решить эту проблему, просто читая руководства, но мне пока не повезло. Я бы воспринял толчок в правильном направлении, спасибо.

Но имейте в виду, что open_basedir просто ограничит доступ к каталогам для функций PHP и т.п., но не для внешних программ, которые выполняются через PHP. Например:

    <?php
    $file = shell_exec('cat /etc/passwd');
    echo $file;

выведет содержимое /etc/passwd файл без проблем, потому что доступ к файловой системе вызывается не самим PHP, а cat программа. cat управляется www-data пользователь по умолчанию (в Debian), поэтому здесь будут применяться только обычные разрешения на доступ к файлам ОС (т.е. доступ для владельца файла, группы и мира).

Чтобы предотвратить это, вы можете либо

  • отключить такие функции, как exec(), passthru(), system(), shell_exec() которые выполняют команды оболочки через disable_functions в твоем php.ini,
  • изменить права доступа к файлам, чтобы у пользователя, работающего на веб-сервере (или PHP), не было разрешения на чтение файла или
  • поместите Apache или PHP в chroot-тюрьму (хотя сам никогда не пробовал).

В зависимости от конфигурации Apache / PHP и ваших потребностей disable_functions вероятно, самый простой в настройке, но он, скорее всего, сломает такие вещи, как ImageMagick и тому подобное, что часто бывает с exec() (лайк exec('/usr/bin/convert ...') для ImageMagick).

Я тестировал это в Debian Squeeze с Apache и PHP как mod_php из репозиториев и в Ubuntu 14.04 с Apache и PHP, запущенным через php-fpm, а также с пакетами из репозитория. Возможно, это также применимо к PHP в Windows, но я никогда не пробовал этого ... хотя cat /etc/passwd не будет работай :-)

Вы можете использовать параметр open_basedir определено в php.ini. Этот параметр предотвратит доступ сценария PHP к файлу (например, fopen () или включают()) вне каталога, указанного в open_basedir. Видеть эта страница для документации.