Установка Suhosin на Debian/Ubuntu
Введение
В этом руководстве показано, как установить расширение Suhosin и как применить Suhosin-патч к исходникам PHP5 на Debian Etch / Ubuntu. Подход использует исходный пакет PHP, из которого собран текущий php5 в системе, — это позволяет сохранить корректные конфигурационные опции и совместимость с apt.
Важно: описываемая процедура перекомпиляции относится к ветке PHP5 и старым версиям дистрибутивов (Debian Etch, Ubuntu старых выпусков). Для современных дистрибутивов и PHP рекомендуется проверять актуальную документацию Suhosin и пакеты в репозиториях.
Что потребуется
- root-доступ или sudo
- Доступ в интернет для скачивания исходников и патча
- Набор инструментов для сборки пакетов Debian
Кратко: apt-get install php5-suhosin, затем при необходимости перекомпиляция PHP5 с применением патча Suhosin.
1. Установка готового пакета Suhosin
Если Suhosin доступен как пакет в ваших репозиториях, установите его командой:
apt-get install php5-suhosinЭто самый быстрый и безопасный способ: пакет устанавливается через apt, обновления придут через пакетный менеджер.
2. Установка Suhosin как патча к PHP5 (перекомпиляция из исходников)
Если вам нужен патч (а не только расширение), необходимо перекомпилировать PHP5. Набросок процесса:
- Установить инструменты сборки и зависимости.
- Скачать исходный пакет php5 из репозиториев apt.
- Скачать подпись Hardened PHP и импортировать ключ.
- Скачать подходящий патч Suhosin для вашей версии PHP.
- Распаковать и применить патч к исходникам.
- Собрать .deb-пакеты с помощью dpkg-buildpackage.
- Установить полученные .deb.
2.1 Установить инструменты сборки
apt-get install dpkg-dev build-essential2.2 Скачать исходники PHP5
Переключаемся в /usr/src и получаем исходники, из которых был собран текущий пакет:
cd /usr/src
apt-get source php52.3 Импортировать подпись Hardened PHP
wget http://www.hardened-php.net/hardened-php-signature-key.asc
gpg --import < hardened-php-signature-key.asc2.4 Скачать патч Suhosin
Перейдите на страницу загрузки Suhosin (http://www.hardened-php.net/suhosin/download.html) и выберите патч, соответствующий вашей версии PHP. В примере ниже использована версия PHP 5.2.0 — для неё загружается патч:
wget http://www.hardened-php.net/suhosin/_media/suhosin-patch-5.2.0-0.9.6.2.patch.gz2.5 Применить патч
Распакуйте патч и примените его к каталогам с исходниками:
gunzip suhosin-patch-5.2.0-0.9.6.2.patch.gz
cd php5-5.2.0
patch -p 1 -i ../suhosin-patch-5.2.0-0.9.6.2.patchЕсли patch завершился без ошибок, можно переходить к сборке.
2.6 Собрать .deb-пакеты
В каталоге с исходниками выполните:
dpkg-buildpackagedpkg-buildpackage попытается собрать пакеты и, вероятно, сообщит об отсутствующих зависимостях для сборки модулей PHP. Пример вывода и список зависимостей может выглядеть так:
server1:/usr/src/php5-5.2.0# dpkg-buildpackage
dpkg-buildpackage: source package is php5
dpkg-buildpackage: source version is 5.2.0-8+etch1
dpkg-buildpackage: source changed by sean finney <[email protected]>
dpkg-buildpackage: host architecture i386
dpkg-buildpackage: source version without epoch 5.2.0-8+etch1
dpkg-checkbuilddeps: Unmet build dependencies: apache-dev (>= 1.3.23) apache2-prefork-dev (>= 2.0.53-3) bison chrpath debhelper (>= 3) firebird2-dev flex (>= 2.5.4) freetds-dev libapr1-dev (>= 1.2.7-8) libbz2-dev (>= 1.0.0) libc-client-dev libcurl3-openssl-dev | libcurl3-dev libdb4.4-dev libexpat1-dev (>= 1.95.2-2.1) libfreetype6-dev libgcrypt11-dev libgd2-xpm-dev (>= 2.0.28-3) libjpeg62-dev libkrb5-dev libldap2-dev libmcrypt-dev libmhash-dev (>= 0.8.8) libmysqlclient15-dev | libmysqlclient12-dev libncurses5-dev libpam0g-dev libpcre3-dev (>= 6.6) libpng12-dev libpq-dev | postgresql-dev libpspell-dev librecode-dev libsnmp9-dev | libsnmp-dev libsqlite0-dev libt1-dev libtidy-dev libwrap0-dev libxmltok1-dev libxml2-dev (>= 2.4.14) libxslt1-dev (>= 1.0.18) re2c unixodbc-dev
dpkg-buildpackage: Build dependencies/conflicts unsatisfied; aborting.
dpkg-buildpackage: (Use -d flag to override.)Если вы увидите подобную ошибку, установите указанные зависимости (символ | означает альтернативу — можно установить любую из предложенных пакетов). Пример команды для установки часто требуемых пакетов:
apt-get install apache-dev apache2-prefork-dev bison chrpath debhelper firebird2-dev flex freetds-dev libapr1-dev libbz2-dev libc-client-dev libcurl3-dev libdb4.4-dev libexpat1-dev libfreetype6-dev libgcrypt11-dev libgd2-xpm-dev libjpeg62-dev libkrb5-dev libldap2-dev libmcrypt-dev libmhash-dev libmysqlclient15-dev libncurses5-dev libpam0g-dev libpcre3-dev libpng12-dev libpq-dev libpspell-dev librecode-dev libsnmp9-dev libsqlite0-dev libt1-dev libtidy-dev libwrap0-dev libxmltok1-dev libxml2-dev libxslt1-dev re2c unixodbc-devПосле установки зависимостей запустите сборку ещё раз:
dpkg-buildpackageСборка может занять значительное время. В конце возможны предупреждения о подписях — их можно проигнорировать, если пакеты успешно собраны.
2.7 Просмотр результатов сборки
Перейдите в /usr/src и посмотрите полученные .deb-файлы и исходники:
cd /usr/src
ls -lПример вывода каталога после сборки (сохранён для наглядности):
server1:/usr/src# ls -l
total 21792
-rw-r--r-- 1 root src 1351 2005-07-05 13:02 hardened-php-signature-key.asc
-rw-r--r-- 1 root src 2419598 2007-03-29 16:37 libapache2-mod-php5_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 2418714 2007-03-29 16:37 libapache-mod-php5_5.2.0-8+etch1_i386.deb
drwxr-xr-x 20 root root 4096 2007-03-29 16:37 php5-5.2.0
-rw-r--r-- 1 root src 1044 2007-03-29 16:37 php5_5.2.0-8+etch1_all.deb
-rw-r--r-- 1 root src 124228 2007-03-29 16:02 php5_5.2.0-8+etch1.diff.gz
-rw-r--r-- 1 root src 1739 2007-03-29 16:02 php5_5.2.0-8+etch1.dsc
-rw-r--r-- 1 root src 5689 2007-03-29 16:38 php5_5.2.0-8+etch1_i386.changes
-rw-r--r-- 1 root src 8583491 2006-11-07 13:34 php5_5.2.0.orig.tar.gz
-rw-r--r-- 1 root src 4771850 2007-03-29 16:37 php5-cgi_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 2405518 2007-03-29 16:37 php5-cli_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 215058 2007-03-29 16:37 php5-common_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 24464 2007-03-29 16:37 php5-curl_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 350954 2007-03-29 16:37 php5-dev_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 33416 2007-03-29 16:37 php5-gd_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 34496 2007-03-29 16:37 php5-imap_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 44322 2007-03-29 16:37 php5-interbase_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 17232 2007-03-29 16:37 php5-ldap_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 12822 2007-03-29 16:37 php5-mcrypt_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 5046 2007-03-29 16:37 php5-mhash_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 64902 2007-03-29 16:37 php5-mysql_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 33410 2007-03-29 16:37 php5-odbc_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 50652 2007-03-29 16:37 php5-pgsql_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 8628 2007-03-29 16:37 php5-pspell_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 4756 2007-03-29 16:37 php5-recode_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 11302 2007-03-29 16:37 php5-snmp_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 34454 2007-03-29 16:37 php5-sqlite_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 18392 2007-03-29 16:37 php5-sybase_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 16478 2007-03-29 16:37 php5-tidy_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 36450 2007-03-29 16:37 php5-xmlrpc_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 12260 2007-03-29 16:37 php5-xsl_5.2.0-8+etch1_i386.deb
-rw-r--r-- 1 root src 310194 2007-03-29 16:37 php-pear_5.2.0-8+etch1_all.deb
-rw-r--r-- 1 root src 95588 2007-03-06 10:37 suhosin-patch-5.2.0-0.9.6.2.patch2.8 Установка только нужных пакетов
Установите те .deb-пакеты, которые вам действительно нужны. В примере автор не устанавливает php5-cgi и php5-cli (так как используется модуль Apache), а также не устанавливает пакеты для Apache 1.3 (libapache-mod-php5). Вместо этого устанавливается libapache2-mod-php5 для Apache 2.2:
dpkg -i libapache2-mod-php5_5.2.0-8+etch1_i386.deb php5_5.2.0-8+etch1_all.deb php5-common_5.2.0-8+etch1_i386.deb php5-curl_5.2.0-8+etch1_i386.deb php5-dev_5.2.0-8+etch1_i386.deb php5-gd_5.2.0-8+etch1_i386.deb php5-imap_5.2.0-8+etch1_i386.deb php5-interbase_5.2.0-8+etch1_i386.deb php5-ldap_5.2.0-8+etch1_i386.deb php5-mcrypt_5.2.0-8+etch1_i386.deb php5-mhash_5.2.0-8+etch1_i386.deb php5-mysql_5.2.0-8+etch1_i386.deb php5-odbc_5.2.0-8+etch1_i386.deb php5-pgsql_5.2.0-8+etch1_i386.deb php5-pspell_5.2.0-8+etch1_i386.deb php5-recode_5.2.0-8+etch1_i386.deb php5-snmp_5.2.0-8+etch1_i386.deb php5-sqlite_5.2.0-8+etch1_i386.deb php5-sybase_5.2.0-8+etch1_i386.deb php5-tidy_5.2.0-8+etch1_i386.deb php5-xmlrpc_5.2.0-8+etch1_i386.deb php5-xsl_5.2.0-8+etch1_i386.debdpkg автоматически перезапустит Apache при необходимости.
3. Проверка установки
Откройте страницу phpinfo в браузере (например, http://192.168.0.100/info.php). При корректной установке Suhosin вы увидите упоминания Suhosin в двух местах на странице phpinfo — это индикатор того, что расширение и/или патч активны.


Важно: если Suhosin не отображается, проверьте логи Apache/PHP, убедитесь, что установлены правильные пакеты и что php.ini или дополнительные конфигурационные файлы загружают модуль Suhosin.
4. Настройка Suhosin
Suhosin работает из коробки с разумными настройками, но его поведение можно тонко настроить. Документация по конфигурации доступна по адресу: http://www.hardened-php.net/suhosin/configuration.html
Примечание: перед изменением параметров сохраните текущие настройки и тестируйте изменения в контролируемой среде.
Когда этот подход не подходит
- Если вы используете современные версии PHP (7.x, 8.x) — Suhosin ориентирован на старые ветки PHP и может быть несовместим.
- На серверах с критичным аптаймом нежелательно перекомпилировать рабочий PHP без тестовой среды. Лучше сначала протестировать сборку в CI или на стенде.
- Если пакет php5-suhosin доступен в репозитории и устраивает по версии, предпочтительнее использовать готовый пакет.
Чек-лист для администратора (быстрая шпаргалка)
- Сделать резервную копию конфигураций и сайтов
- Установить dpkg-dev и build-essential
- Скачать исходники php5: apt-get source php5
- Скачать и импортировать hardened-php-signature-key.asc
- Скачать патч Suhosin, соответствующий версии PHP
- Применить patch -p 1 -i ../suhosin-*.patch
- Установить отсутствующие зависимости для сборки
- Выполнить dpkg-buildpackage и установить .deb через dpkg -i
- Проверить phpinfo на наличие Suhosin
Критерии приёмки
- Suhosin отображается как расширение в phpinfo в двух местах.
- Сайты корректно отрабатывают под новым модулем (нет фатальных ошибок).
- Логи Apache/PHP не содержат критических ошибок после перезапуска.
Роль-based рекомендации
- Системный администратор: собрать пакеты в тестовой среде, подготовить план отката (сохранить старые .deb).
- Разработчик: проверить совместимость кода с усиленными ограничениями Suhosin (вводимые ограничения на request/headers/ввод).
- DevOps/CI: автоматизировать сборку и тестирование с помощью скриптов сборки и тестовых окружений.
Итог
Установка Suhosin может быть простой — через пакет php5-suhosin, или более гибкой — через применение патча к исходникам PHP и сборку собственных .deb. Второй подход даёт контроль над конфигурацией, но требует времени и аккуратности при установке зависимостей и тестировании. Всегда тестируйте изменения в стенде и имейте план отката.
Ссылки
- Suhosin: http://www.hardened-php.net/suhosin/index.html
- PHP: http://www.php.net
- Debian: http://www.debian.org
- Ubuntu: http://www.ubuntu.com