Установка Suhosin
Что это и зачем
Suhosin — это надёжный набор патчей и расширение для PHP, повышающее безопасность. Патч встраивается в исходники PHP и требует пересборки RPM-пакетов; расширение подключается отдельно. Короткое определение: Suhosin — защита уровня интерпретатора PHP.
Требования и примечания
- Тестируйте на стенде перед продакшеном.
- Используется CentOS 5.3 и PHP 5.1.6 в примерах; адаптируйте версии под вашу систему.
- Потребуются права root и набор dev-пакетов для сборки.
Важно: не изменяйте пути и имена файлов, указанные в командах, если вы не уверены в последствиях. При изменении версии PHP адаптируйте имена RPM и патчей.
Подготовка: ключ подписи Hardened-PHP
Сначала скачайте и импортируйте ключ подписи проекта Hardened-PHP в ключницу GPG:
wget http://www.hardened-php.net/hardened-php-signature-key.asc
gpg --import < hardened-php-signature-key.ascСкачивание исходников RPM PHP5
Скачайте соответствующий пакет PHP5.src.rpm в /usr/src и установите его в систему билд-структур RPM:
cd /usr/src
wget http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/5.3/updates/SRPMS/php-5.1.6-23.2.el5_3.src.rpmЕсли вы используете оригинальную ветку os/ вместо updates/, подгоните имя rpm в дальнейших шагах.
rpm -ivh php-5.1.6-23.2.el5_3.src.rpmЕсли появятся предупреждения о mockbuild, их можно игнорировать:
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using rootПодготовка Suhosin-патча
Скачайте патч Suhosin подходящий для вашей версии PHP в каталог SOURCES сборочного дерева RPM:
cd /usr/src/redhat/SOURCES
wget http://www.hardened-php.net/suhosin/_media/suhosin-patch-5.1.6-0.9.6.patch.gzПроверьте MD5-сумму загрузки:
md5sum suhosin-patch-5.1.6-0.9.6.patch.gzЕсли MD5 совпадает, проверьте цифровую подпись:
wget http://www.hardened-php.net/suhosin/_media/suhosin-patch-5.1.6-0.9.6.patch.gz.sig
gpg suhosin-patch-5.1.6-0.9.6.patch.gz.sigВы должны увидеть в выводе строку примерно такого вида:
gpg: Good signature from "Hardened-PHP Signature Key"Важно: продолжайте только если подпись корректна.
Применение патча к спецификации RPM
Распакуйте патч и переименуйте его по схеме CentOS, затем внесите изменения в SPECS/php.spec так, чтобы rpmbuild включал патч при пересборке PHP:
gunzip suhosin-patch-5.1.6-0.9.6.patch.gz
mv suhosin-patch-5.1.6-0.9.6.patch php-5.1.6-suhosin.patch
cd /usr/src/redhat/SPECS/
vi php.specДобавьте строку Patch106: php-5.1.6-suhosin.patch в блок с перечислением патчей. Закомментируйте конфликтующий патч ecalloc (Patch14) и добавьте вызов %patch106 в секцию %prep, закомментировав %patch14. В файле должно получиться примерно так:
[...]
Source51: php.ini
Patch1: php-5.1.4-gnusrc.patch
Patch2: php-5.1.4-warnings.patch
Patch5: php-4.3.3-install.patch
Patch6: php-5.0.4-norpath.patch
Patch7: php-4.3.2-libtool15.patch
Patch13: php-5.0.2-phpize64.patch
#Patch14: php-5.1.6-ecalloc.patch
Patch15: php-5.2.0-includedir.patch
Patch16: php-5.1.6-bug38534.patch
Patch17: php-5.1.6-umask.patch
Patch18: php-4.3.9-metaphone.patch
Patch19: php-5.1.6-zendecase.patch
Patch20: php-5.1.6-zendhash.patch
[...]
Patch99: php-5.1.6-CVE-2008-3658.patch
Patch100: php-5.1.6-CVE-2008-3660.patch
Patch101: php-5.1.6-CVE-2008-5498.patch
Patch102: php-5.1.6-CVE-2008-5557.patch
Patch103: php-5.1.6-CVE-2008-5814.patch
Patch104: php-5.1.6-mbstring-overload-func.patch
Patch105: php-5.1.6-gdoverflow.patch
Patch106: php-5.1.6-suhosin.patch
[...]
%prep
%setup -q
%patch1 -p1 -b .gnusrc
%patch2 -p1 -b .warnings
%patch5 -p1 -b .install
%patch6 -p1 -b .norpath
%patch7 -p1 -b .libtool15
%patch13 -p1 -b .phpize64
#%patch14 -p1 -b .ecalloc
%patch15 -p1 -b .includedir
%patch16 -p1 -b .bug38534
%patch17 -p1 -b .umask
%patch18 -p1 -b .metaphone
%patch19 -p1 -b .zendecase
%patch20 -p1 -b .zendhash
[...]
%patch99 -p1 -b .cve3658
%patch100 -p1 -b .cve3660
%patch101 -p1 -b .cve5498
%patch102 -p1 -b .cve5557
%patch103 -p1 -b .cve5814
%patch104 -p1 -b .mbstring-overload-func
%patch106 -p1 -b .suhosin
[...]Особенности для x86_64
На системе x86_64 установите apr-devel.x86_64, если он ещё не установлен. Не делайте этого на i386:
yum install apr-devel.x86_64Без этого вы можете получить ошибку при использовании apxs:
cannot open /httpd/build/config_vars.mk: No such file or directory at /usr/sbin/apxs line 201.Пересборка PHP5 с патчем
Запустите сборку RPM-пакетов:
rpmbuild -ba php.specrpmbuild может жаловаться на отсутствующие dev-пакеты, необходимые для сборки дополнительных модулей. Пример вывода и список пакетов-зависимостей:
[root@server1 SPECS]# rpmbuild -ba php.spec
cat: /usr/include/httpd/.mmn: No such file or directory
error: Failed build dependencies:
aspell-devel >= 0.50.0 is needed by php-5.1.6-23.2.x86_64
httpd-devel >= 2.0.46-1 is needed by php-5.1.6-23.2.x86_64
libjpeg-devel is needed by php-5.1.6-23.2.x86_64
libpng-devel is needed by php-5.1.6-23.2.x86_64
pcre-devel >= 4.5 is needed by php-5.1.6-23.2.x86_64
libc-client-devel is needed by php-5.1.6-23.2.x86_64
mysql-devel >= 4.1.0 is needed by php-5.1.6-23.2.x86_64
postgresql-devel is needed by php-5.1.6-23.2.x86_64
unixODBC-devel is needed by php-5.1.6-23.2.x86_64
net-snmp-devel is needed by php-5.1.6-23.2.x86_64
gd-devel is needed by php-5.1.6-23.2.x86_64
freetype-devel is needed by php-5.1.6-23.2.x86_64
[root@server1 SPECS]#Установите недостающие пакеты и повторите сборку:
yum install aspell-devel httpd-devel libjpeg-devel libpng-devel pcre-devel libc-client-devel mysql-devel postgresql-devel unixODBC-devel net-snmp-devel gd-devel freetype-devel
rpmbuild -ba php.specСборка создаст RPM-пакеты в каталоге /usr/src/redhat/RPMS/i386 или /usr/src/redhat/RPMS/x86_64 в зависимости от архитектуры. Процесс может занять продолжительное время.
Установка собранных пакетов
После успешной сборки установите новые пакеты:
i386:
cd /usr/src/redhat/RPMS/i386
rpm -Uvh --force php-*x86_64:
cd /usr/src/redhat/RPMS/x86_64
rpm -Uvh --force php-*Готово — патч Suhosin применён к PHP.
Сборка и установка расширения Suhosin
Скачайте исходники расширения в /usr/src:
cd /usr/src
wget http://download.suhosin.org/suhosin-0.9.27.tgzПроверьте MD5 и подпись:
md5sum suhosin-0.9.27.tgz
wget http://download.suhosin.org/suhosin-0.9.27.tgz.sig
gpg suhosin-0.9.27.tgz.sigРаспакуйте и соберите расширение:
tar xvfz suhosin-0.9.27.tgz
cd suhosin-0.9.27
phpize
./configure
make
make installЧтобы включить расширение, создайте файл конфигурации /etc/php.d/suhosin.ini и добавьте туда строку extension=suhosin.so:
vi /etc/php.d/suhosin.iniextension=suhosin.soПерезапустите Apache:
/etc/init.d/httpd restartТеперь откройте вашу страницу info.php (например, http://192.168.0.100/info.php). Если всё прошло успешно, вы увидите Suhosin в phpinfo в двух местах:


Suhosin работает и может быть дополнительно настроен на странице конфигурации проекта: http://www.hardened-php.net/suhosin/configuration.html. По умолчанию Suhosin уже обеспечивает базовую защиту.
Критерии приёмки
- phpinfo показывает Suhosin в списке расширений и в разделе конфигурации.
- Пересобранные RPM установлены и PHP запускается без ошибок.
- Расширение suhosin.so загружено и активировано.
Чеклист администратора
- Сохранить резервную копию конфигураций и данных перед сборкой.
- Скачан и импортирован GPG-ключ Hardened-PHP.
- Проверены MD5 и GPG-подпись патча и исходников.
- Внесены изменения в php.spec и добавлен Patch106.
- Установлены все dev-зависимости для rpmbuild.
- Собраны и установлены RPM-пакеты.
- Скомпилировано и подключено расширение Suhosin.
- Apache перезапущен и phpinfo проверен.
Советы по совместимости и миграции
- Если вы используете другую версию PHP, найдите соответствующую пару php.src.rpm и suhosin-патч. Имена файлов должны совпадать с версией.
- На x86_64 обязательно установить apr-devel.x86_64 и другие 64-битные dev-пакеты.
- Для минимизации рисков сначала выполняйте все шаги на тестовой машине и контролируйте поведение приложений после обновления PHP.
Быстрая методология проверки целостности
- Проверка MD5 для скачанного архива.
- Проверка GPG-подписи архива.
- Внесение патча в php.spec.
- Сборка RPM и проверка зависимостей.
- Установка и проверка phpinfo.
Небольшая модель зрелости безопасности
- Базовая: использовать расширение Suhosin без патча (только .so).
- Средняя: применять патч Suhosin в PHP и собирать RPM.
- Продвинутая: настроить политики Suhosin под приложение и внедрить мониторинг/ALERT на изменения конфигурации.
Решение: патчать или только подключить расширение
flowchart TD
A[Нужна ли защита сверху PHP?] -->|Да| B{Вы хотите менять PHP?}
B -->|Да| C[Патч + пересборка RPM]
B -->|Нет| D[Только расширение suhosin.so]
A -->|Нет| E[Оставить как есть]Короткий глоссарий
- rpmbuild — инструмент для сборки RPM-пакетов.
- php.spec — спецификация сборки пакета PHP для RPM.
- phpize — утилита для подготовки сборки PHP-расширений.
Когда Suhosin может не подойти
- Очень старые приложения, завязанные на специфичное поведение интерпретатора PHP — патч может менять поведение.
- Если нет возможности тестировать и быстро откатиться, пересборка production-PHP рискованна.
Резюме
- Suhosin можно установить двумя путями: патч исходников и пересборка RPM, и/или установка расширения suhosin.so.
- Всегда проверяйте MD5 и GPG-подпись.
- Тестируйте изменения на отдельной среде.
Ссылки
- Suhosin: http://www.hardened-php.net/suhosin/index.html
- PHP: http://www.php.net
- CentOS: http://www.centos.org
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента