Инструменты пользователя

Инструменты сайта


ru:security

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

«ДокуВики» — это веб-приложение и оно часто используется на публичных серверах, доступных из интернета. Это означает, что есть большой риск подвергнуться нападению злонамеренными людьми, чем, например, применение на вашей настольной системе.

«ДокуВики» разработана с учётом требований безопасности. Мы пытаемся найти баланс между дружелюбием к пользователю и безопасностью, но предпочитаем безопасность пользе, когда компромисс не может быть найден.

Эта страница должна дать вам краткий обзор того, на какие аспекты заострить внимание, чтобы удостовериться, что ваша «ДокуВики» безопасна.

Создание отчетов и уведомлений

Если Вы обнаружили проблему безопасности в «ДокуВики», пожалуйста, сообщите нам. Предпочтительные способы:

Для небольших багов предпочтительнее первые два способа. Насчет очень серьезных ошибок, которые могут быть использованы для написания эксплойтов для «ДокуВики», рекомендуем пользоваться приватной перепиской.

Все предыдущие проблемы безопасности описаны в bugtracking system.

В зависимости от серьезности найденной проблемы безопасности, либо она будет исправлена в будущем выпуске (по очень незначительным проблемам), либо будет выпущен срочный bugfix-релиз. В последнем случае пользователи будут проинформированы через механизм проверки обновлений.

Вы должны всегда использовать самую последнюю версию «ДокуВики», поскольку старые версии никогда не исправляются.

Безопасность веб-доступа

«ДокуВики» хранит конфигурацию и данные страницы в файлах. Эти файлы никогда не должны быть доступны непосредственно из сети. Распространяемый tarball содержит ряд .htaccess файлов, которые указывают веб-серверу Apache закрыть доступ к определенным каталогам.

Если вы не используете веб-сервер Apache, или ваш Apache не использует .htaccess-файлы, вы должны вручную защитить свою установку

Следующие директории не должны быть доступны из сети:

  • data
  • conf
  • bin
  • inc (не опасно, когда доступно, хотя…)

Чтобы проверить, должны ли вы настроить права доступа попытайтесь получить доступ к http://yourserver.com/dokuwiki/data/pages/wiki/dokuwiki.txt. Вы не должны получить доступ к файлу по этому пути.

Запрещение доступа к директории в Apache

Самый простой путь состоит в том, чтобы включить .htaccess поддержку в вашей конфигурации Apache. Смотри учебник Apache по .htaccess.

«ДокуВики» уже идет с правильно сконфигурированными .htaccess-файлами. Содержимое файла .htaccess для блокировки доступа к каталогу, в котором он находится, должно быть следующим:

order allow,deny
deny from all

Другой путь состоит в том, чтобы использовать директиву LocationMatch внутри описания VirtualHost. Это немного более эффективно чем файлы .htaccess. Просто ниже директивы Directory, добавьте:

<LocationMatch "/(data|conf|bin|inc)/">
    Order allow,deny
    Deny from all
    Satisfy All
</LocationMatch>

Запрещение доступа к директории в IIS

Доступ к упомянутым каталогам может быть отключен в параметрах конфигурации IIS.

  1. Откройте инструмент конфигурирования: Start → Settings → Control Panel → Administrative Tools → Internet Information Services
  2. Переместитесь к каталогу, который вы хотите защитить: Local Computer → Web Sites → Default Web Site → path to directory
  3. Щелкните правой кнопкой по папке и выберите Properties → Directory Security → IP address and domain name restrictions → Edit…
  4. Выберите «By default, all computers will be: Denied access»

Запрещение доступа к директории в Lighttpd

Используя URL re-write вы можете закрыть доступ к вышеупомянутым директориям. В Вашем файле lighttpd.conf, добавляющем следующее правило подстановки URL, должно быть достаточным, чтобы не пускать людей. Это предполагает, что ваши файлы «ДокуВики» установлены в http://yourwebsite.tld/dokuwiki/. Не забудьте раскомментировать «mod_rewrite» в разделе server.modules.

url.rewrite-once = ( "^/dokuwiki/(data|conf|bin|inc)/+.*" => "/nonexistentfolder" )

Переименование директории data

Защита каталога «data» очень важна. Если вы не можете переместить каталоги из веб-сервера (см. ниже) или не можете сконфигурировать свой веб-сервер, чтобы запретить доступ (см. выше), то вы должны, по крайней мере, усложнить получение имени вашего каталога данных.

Чтобы сделать так, переименуйте свой каталог данных на что-то сложное (например, длинная строка букв и чисел) и переконфигурируйте свою опцию savedir в вашем файле «conf/local.php».

Перемещение каталогов из DocRoot

Самый безопасный способ избежать любого доступа к упомянутым каталогам состоит в том, чтобы переместить их вне так называемого «Document Root» Вашего веб-сервера.

Предупреждение: Если вы планируете использовать установщик, вы должны установить свой wiki исполняемый сценарий install.php прежде, чем вы сделаете этот шаг. Если перемещение каталогов будет сделано до, то выполнение установщика прервется.

Директория data

  1. Переместите директорию «data» (и все ее содержимое) из document root
  2. Отредактируйте настройку savedir, чтобы указать на новое расположение каталога «data».

Например, если директория «data» перемещена в ».home/yourname/data», добавьте следующую строку в «conf/local.php»:

$conf['savedir'] = '/home/yourname/data/';

Директория conf

  1. Переместите директорию «conf» (и все ее содержимое) из document root
  2. Создайте файл preload.php в каталоге «inc» и установите «DOKU_CONF» на новое расположению каталога «conf».

Например, если каталог «conf» перемещен в /home/yourname/conf, создайте следующую запись в «inc/preload.php»:

inc/preload.php
<?php
// Не изпользуйте закрывающий php тег. Это вызывает проблему с каналами,
// помимо прочего. Для получения дополнительной информации по этой проблеме, пожалуйста, см:
// http://www.dokuwiki.org/devel:coding_style#php_closing_tags
 
define('DOKU_CONF','/home/yourname/conf/');

Директория bin

Каталог bin содержит CLI инструменты. Если у Вас нет доступа к шеллу на вашем сервере вы можете просто удалить каталог и его содержимое. Иначе только переместите его из document root. Никакая дальнейшая конфигурация не нужна.

Директория inc

В настоящий момент нет никакого легкого способа переместить этот каталог из document root. Но так как он не содержит уязвимых данных, не стоит прилагать каких-то усилий для этого.

Параметры конфигурации «ДокуВики»

«ДокуВики» содержит несколько параметров конфигурации, которые оказывают влияние на различные аспекты безопасности установки. Пожалуйста, изучите документацию по каждой настройке, чтобы понять, что они делают и каковы предложенные настройки.

  • allowdebug — отключение отладочной информации во избежание системной утечки информации :!:
  • fmode, dmode — устанавливает права на файлы, создаваемые «ДокуВики»; также читайте информацию об установке прав;
  • fetchsize — настройка кэширования внешних данных;
  • fullpath — показывать полный путь имён для страниц;
  • usewordblock — предотвращения спама используя чёрный список;
  • mailguard — избегание почтовых роботов сбора адреса;
  • iexssprotect — защита от проблем в XSS в пределах Internet Explorer’а;
  • htmlok — включение HTML;
  • phpok — включение PHP;
  • hidepages — скрытие определённых страниц от индексации и поиска;
  • safemodehack (англ.) — работа при ограничениях безопасного режима.

Безопасность плагинов

DokuWiki имеет много разрабатываемых сообществом плагинов. Плагины добавляют новую функциональность к DokuWiki, добавляя новый код. Это означает, что у кода есть фактически полный доступ к Вашему серверу. В дополнении плагины распространяются отдельно от DokuWiki полностью оперативным способом. Они не подвергаются такому же вниманию, который получает кодовая база DokuWiki. Таким образом, необходимо принять необходимые меры безопасности до установки плагинов.

Вот некоторые подсказки, чтобы помочь вам с выбором плагинов, которые вы устанавливаете.

  • Если можете, ознакомьтесь самостоятельно с исходным кодом плагина до его установки.
  • Если сомневаетесь, спросите в списке рассылки.
  • Плагины устанавливаются в DokuWiki в каталог «lib», который напрямую доступен из-вне. Необходимо очень внимательно просматривать код таких плагинов и закрывать доступ к ним через файл .htaccess.
  • Плагины созданы разработчиками, напрямую не связанными с проектом DokuWiki - они могут быть неопытными, иметь злые намерения или могут разместить исходный код плагина на сервер, который был скомпрометирован. Будьте осторожны когда вы кому-то доверяете!
  • Просмотрите страницу плагина для выявления упомянутых предупреждений безопасности и обновляйте плагин, когда его новый выпуск станет доступным.

См. также: Как сообщить о проблеме безопасности в плагине

Дополнительное чтение

Всё, что ниже, можно удалить

Угрозы безопасности

Чтобы быть в курсе выявленных проблем с безопасностью в «ДокуВики», пожалуйста, подпишитесь на рассылку проекта «ДокуВики» на freshmeat.net (для подписки нужен работающий адрес электронной почты).

Все выявленные проблемы с безопасностью можно найти в системе отслеживания ошибок.

Как сообщить о проблеме с безопасностью

Если вы нашли ошибку, связанную с безопасностью в «ДокуВики», пожалуйста, сообщите в первую очередь ведущему разработчику проекта (AndiAndreas Gohr
Andi

Berlin Germany
) через его личный электронный адрес, он указан на этой странице.

Если ошибка некритическая, вы так же можете создать заявку об ошибке, но она будет общедоступной!

Обеспечение безопасности «ДокуВики» во время установки

По умолчанию, при установке «ДокуВики» открыта всем для чтения и изменения. Как только вы установили «ДокуВики», возможно кто-то уже получил к ней доступ. Поэтому во время самой установки желательно ограничить доступ другим посетителям.

Если вы используете веб-сервер Apache, вы можете организовать такой доступ добавлением нижеследующих строк в начало файла .htaccess, находящегося в корне установки «ДокуВики»:

Deny from all
Allow from 192.168.1.1

Замените «192.168.1.1» на свой IP-адрес (с которого будете выполнять установки и настройку). Если вы не знаете своего IP-адреса, то его можно посмотреть, зайдя на WhatsMyIP.org

:!: Если ваш адрес используется и другими людьми (единый прокси школ или провайдеров типа AOL, локальная сеть и т. п.), то все компьютеры, использующие этот адрес, будут иметь доступ к «ДокуВики».

Не забудьте убрать добавленные в файл .htaccess строки прежде, чем вы запустите для всех свою вики.

Обеспечение безопасности при настройке «ДокуВики»

На следующие параметры конфигурационного файла следует обратить особое внимание при настройке «ДокуВики»:

fmode / dmode

(То есть разрешения создания файлов и папок.) Установите их как можно более закрытыми. Это важное условие обеспечения безопасности установки «ДокуВики»! Пожалуйста, прочитайте страницу о разрешениях.

Отключение вывода отладочных сообщений

(Требуется — слишком важная и потенциально опасная информация, чтобы разрешить её видеть всем)

В папке config «ДокуВики» исправьте файл conf/local.php (создайте, если его там нет) и добавьте строку:

$conf['allowdebug']  = 0;

Предотвращение копирования удалённого содержимого

Ссылки в вики на внешнее содержимое, например, на внешние картинки, заставляют ваш веб-сервер копировать эти картинки на ваш веб-сервер через специальный скрипт lib/exe/fetch.php в целях обеспечения нормальной производительности и возможности «на лету» менять размеры таких картинок. Существует возможность ограничить закачку из внешних источников по размеру файлов с помощью опции $conf['fetchsize'] (задаётся в байтах). Установка этой опции в 0 позволит не закачивать ничего извне, т. е. отключить кэширование.

Установка некоторых страниц вики в режим «только чтение»

Посмотрите этот раздел ЧаВО.

Другие настройки

В добавление к настройкам, перечисленным на этой странице, нижеперечисленные настройки также могут нарушить безопасность и/или конфиденциальность. Однако это неисчерпывающий список.

Обеспечение безопасности каталогов

Следующие пункты очень рекомендуются — даже если они помечены как опциональные, стоит потратить на них некоторое время.

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

Для этого, исходя из стандартного для UNIX корневого каталога /, предположим, что ваш рабочий каталог на сервере будет /home/yourname, а корневой каталог сайтов, скажем, /home/yourname/www, то следует сделать папку /home/yourname/dokuwiki, которая должна быть вне корневого каталога сайта и расположить часть ru: в ней, как описано ниже. (т.е. размещать не всю ru: в папку сайта, а только часть, а другую часть расположить в отдельной, недоступной через браузер папке).

Каталог ./bin

(Требуется — хотя он защищен настройками .htaccess нет ни одной причины выкладывать его в публичный доступ.)

:!: Уберите bin из каталога сайтов или просто удалите эту папку. Эта папка содержит скрипты, запускаемые только из командной строки и не должны быть публичными.

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

The ./data directory

(Опционально — каталог защищён настройками .htaccess, но это не всегда безопасное решение.)

Уберите каталоги data, media и attic из каталога сайтов.

Простейший способ сделать это такой:

  1. переместите каталог data (и всё его содержимое) вне корневого каталога сайтов;
  2. измените настройку savedir, указав в ней путь к новому расположениею каталога data.

Для примера, если каталог data перемещён в /home/yourname/data, добавьте следующую строку в conf/local.php:

$conf['savedir'] = '/home/yourname/data';

Каталоги media и attic расположены внутри каталога data, соответственно вышепроделанные шаги обеспечат также и их безопасность.

Каталог ./conf

(Опционально - каталог защищен настройками .htaccess, но это не всегда безопасное решение)

Уберите подкаталог настроек из каталога сайта. Это немного труднее сделать в текущей версии «ДокуВики», самый легкий путь — это использовать auto-prepend-file настройку файла ini в PHP, для загрузки простейшего PHP-скрипта, который будет указывать на новое положение каталога настроек.

Создайте файл вида (путь будет другим для вашей системы) /home/yourname/dokuwiki/prepend.php содержащий:

<?php
define('DOKU_CONF','/home/yourname/dokuwiki/conf/');

(Тег для закрытия PHP не указан специально! Не нужно добавлять ?> в конце)

Переместите каталог conf в /home/yourname/dokuwiki/, чтобы получился такой путь — /home/yourname/dokuwiki/conf.

Теперь измените файл .htaccess, расположеный в корневом каталоге сайта (т. е. /home/yourname/www/.htaccess), и добавьте следущее:

php_value auto_prepend_file "/home/yourname/dokuwiki/prepend.php"

Это заставит PHP запускать скрипт prepend.php перед любым другим скриптом. Указание этой константы перекрывает получение её «ДокуВикой» через скриптinc/init.php.

Каталог ./inc

(Опционально — каталог защищен настройками .htaccess, но это не всегда безопасное решение.)

Теоретические тут не должно быть ничего опасного, но в то же время нет причин оставлять код в этом каталоге публично открытым, лучше поберечься, чем потом каятся. Имейте в виду ,что этот шаг потребует шелла (доступа к командной строке) сервера, когда для почти всех остальных шагов достаточно FTP-клиента.

Итак, предположим, что вы выполнили предыдущий шаг по перемещению каталога config вне корневого каталога сайта, тогда вам нужно просто добавить еще одну строку в файл prepend.php:

<?php
define('DOKU_CONF','/home/yourname/dokuwiki/conf/');
define('DOKU_INC','/home/yourname/dokuwiki/');

Переместите каталог inc в /home/yourname/dokuwiki, чтобы получилось /home/yourname/dokuwiki/inc. Кроме того вам также нужно перенести каталог lib, после чего сделать символическую ссылку в корневой каталог сайта, т. е.:

$ mv /home/yourname/www/dokuwiki/lib /home/yourname/dokuwiki
$ ln -s /home/yourname/dokuwiki/lib /home/yourname/www/dokuwiki/lib

Эти команды создадут символическую ссылку на каталог lib в корневом каталоге вашего сайта, в то же время позволив правильно работать переопределению DOKU_INC.

Общие настройки PHP

FIXME это должно быть объединено в config:php и ссылаться отсюда.

Нижеследующие является «хорошим тоном». Хорошее описание по общей защите PHP можно найти в Главе 3 Apache Security, также главу 3 можно бесплатно скачать в формате PDF отсюда.

Если вы запускаете «ДокуВики» и PHP на сервере, которым вы полностью управляете, то можно рассмотреть вариант использования т. н. chroot-«тюрьмы». Имеется много разрозненных руководств в сети, как это сделано, однако наиболее полным (точным) и эффективным, скорее всего, является Apache + Chroot + FastCGI + PHP FAQ.

Вы можете включить это в своём главном файле .htaccess, находящемся в корне — /home/yourname/www/.htaccess.

Отдельный файл ошибок

(Опционально это хорошая идея — чем больше информации вы получите об атакующем, тем лучше.)

Добавьте следующее в файл .htaccess, находящийся в корневом каталоге вашего сайта (т. е. /home/yourname/www/.htaccess — каталог, который отвечает на HTTP—запросы и содержит файлы index.php и doku.php).

# Disable display of public PHP error messages
php_flag display_errors "off"

# Log all PHP errors to a file in private directory (and not in the DokuWiki data dir either!)
# here you'd need to create the directory and the file then make sure the file has world write
# permissions
php_flag error_log "/home/yourname/logs/errors.log"

# Don't keep reporting the same error again and again (keep log file smaller)
php_flag ignore_repeated_errors On

# DokuWiki generates a lot of notices... best prevent reporting them
# in .htaccess files E_ALL, E_NOTICE have no effect, you must use the
# values from http://www.php.net/manual/en/function.error-reporting.php
# E_ALL & ~E_NOTICE => 2047 - 8 => 2039 (Note: E_ALL is different for 5.2.x and above, see
# http://www.php.net/manual/en/ref.errorfunc.php#errorfunc.constants.errorlevels.e-all)
php_flag error_reporting 2039

Вам нужно создать папку и файл ошибок, указанных выше. Это можно сделать (зайдя в шелл) примерно так:

$ mkdir ~/logs
$ touch ~/logs/errors.log
$ chmod 662 ~/logs/errors.log

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

$ tail -100 ~/logs/errors.log > ~/logs/errors.log

Эта команда оставит в файле только последние 100 строк, удалив все остальное — вы можете добавить эту команду, к примеру, в еженедельную обработку cron.

Включение safe_mode и open_basedir

Инструкции для «ДокуВики», работающей под Linux/Unix и Apache. Тестировалось на CentOS 4.4

Два параметра очень важны для безопасности PHP: 1)

  • safe_mode — ограничивает выполнение системных команд из PHP (работает в PHP3, PHP4, PHP5);
  • open_basedir — ограничивает скрипты PHP открытием файлов только из определенного каталога.

Добавьте следующие строки в свой httpd.conf, также иногда их надо добавить и в файл /wiki/.htaccess тоже:

# DokuWiki is installed in       : /var/www/html/wiki/
# your PHP pear packages are in  : /usr/share/pear/
# PHP is installed in            : /usr/lib/php4/
# use a new tmp directory in     : /var/www/html/wiki/tmp/
<Directory /var/www/html/wiki>
    php_admin_flag safe_mode On
    php_admin_value safe_mode_exec_dir "/usr/lib/php4"
    php_admin_value safe_mode_include_dir "/usr/share/pear/"
    php_admin_value open_basedir "/var/www/html/wiki/:/var/www/wiki/:/usr/share/pear/"
    php_admin_value upload_tmp_dir "/var/www/html/wiki/tmp/"
</Directory>

Затем вам нужно настроить все разрешение папок вики, например, следующей Linux/Unix-командой:

# chown apache:apache -R /var/www/html/wiki/

Если вы не имеете аккаунта с шеллом или используете ftp для заливки «ДокуВики», все разрешение должны быть настроены автоматически. В этих случаях не нужно запускать команду chown.

FIXME Is the above line something one has to do with telnet? My presence provider doesn't provide a command line… Over-all, all I got out of this page was to delete the .bin directory and moving the ./data directory. By the way, I've been unable to delete the old ./data on the server with FileZilla; it tells me «directory not empty» and when I go to the subdirectories, and to the files in them, all my attempts to delete seem to result in PWD commands. No apparent way to get rid of them. The rest of the stuff on this page either didn't work for me, or was too obscure to follow. Need to explain things with dummies in mind. We dummies are a majority ;-)

Don't know whether there are ftp-clients with the ability to change owner and group attributes as with chown on the command line, but probably your provider will not grant you the right to change owner and group attributes of your files. This also may be the reason why you can't get rid of 'your' files in the data dir (presumably they aren't yours ;-) ). If you set the fmode/dmode param too restrictive (lesser okt. values than 666/777, esp. in 3rd position) you won't be able to del files written and hence owned by the webserver (i.e. files created via DokuWiki) cf. permissions, fmode and hosted /Leif

Assuming your webserver is Apache and is running as the user Apache. This is needed because safe_mode runs the PHP script as the user that is the owner of the .php files.

1) Примечание: использование safe_mode / open_basedir предмет дискуссий. Fundamentally it is not 100% secure (lots of workarounds such as DokuWiki's own safemode bypass) and it sometimes complicates configurations / installations of some applications, etc. See PHP's safe_mode or how not to implement security. Furthermore, safe mode has been dropped from PHP6, it's already gone from the PHP6 CVS branch, if general you're probably better of chrooting your PHP (see link in this page here)
ru/security.txt · Последние изменения: 2014/04/01 20:44 — Aleksandr