Установка Suhosin
Suhosin — это набор исправлений и расширение для повышения безопасности PHP. Руководство описывает, как применить патч Suhosin к исходникам PHP, собрать RPM-пакеты на CentOS 5.4 (PHP 5.1.6), собрать и установить расширение suhosin.so, а также проверить результат и решить типичные проблемы.
Краткое определение
Suhosin — расширение и патч для PHP, направленные на повышение безопасности исполняемой среды. Оно помогает ограничивать опасные вызовы, предотвращать утечки данных и уменьшать влияние уязвимостей в скриптах.
Что понадобится
- Сервер CentOS 5.4 с установленным PHP 5.1.6 (пример в руководстве).
- Права root или sudo.
- Утилиты: wget, gpg, md5sum, rpm, rpmbuild, phpize, make, gcc, yum.
Важно: инструкции ориентированы на CentOS 5.4 и PHP 5.1.6. При использовании других версий корректируйте имена пакетов и патчей соответствующим образом.
Подготовка: импорт ключа подписи
Сначала загрузим и импортируем ключ подписи Hardened-PHP в хранилище GPG:
wget http://www.hardened-php.net/hardened-php-signature-key.asc
gpg --import < hardened-php-signature-key.ascПолучение исходников PHP (src.rpm)
Скачиваем подходящий php.src.rpm в /usr/src и устанавливаем его:
cd /usr/src
wget http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/5.4/updates/SRPMS/php-5.1.6-24.el5_4.5.src.rpm
rpm -ivh php-5.1.6-24.el5_4.5.src.rpmЕсли появятся предупреждения вида:
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using rootих можно игнорировать.
Загрузка и проверка патча Suhosin
Скачиваем патч, проверяем контрольную сумму и подпись:
cd /usr/src/redhat/SOURCES
wget http://www.hardened-php.net/suhosin/_media/suhosin-patch-5.1.6-0.9.6.patch.gz
md5sum suhosin-patch-5.1.6-0.9.6.patch.gz
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 и пропишите его в специ-файле для rpmbuild:
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Добавьте строку Patch112: php-5.1.6-suhosin.patch в раздел перечисления патчей и закомментируйте конфликтующий патч ecalloc. Затем в разделе %setup -q добавьте %patch112 -p1 -b .suhosin и закомментируйте %patch14 -p1 -b .ecalloc.
Пример фрагмента php.spec:
[...]
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
[...]
Patch104: php-5.1.6-mbstring-overload-func.patch
Patch105: php-5.1.6-gdoverflow.patch
Patch106: php-5.1.6-CVE-2009-3546.patch
Patch107: php-5.1.6-CVE-2009-3291.patch
Patch108: php-5.1.6-CVE-2009-3292.patch
Patch109: php-5.1.6-CVE-2009-4017.patch
Patch110: php-5.1.6-CVE-2009-2687.patch
Patch111: php-5.1.6-CVE-2009-4142.patch
Patch112: php-5.1.6-suhosin.patch
[...]
%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
[...]
%patch104 -p1 -b .mbstring-overload-func
%patch106 -p1 -b .cve3546
%patch107 -p1 -b .cve3291
%patch108 -p1 -b .cve3292
%patch109 -p1 -b .cve4017
%patch110 -p1 -b .cve2687
%patch111 -p1 -b .cve4142
%patch112 -p1 -b .suhosin
[...]Зависимости и отличия архитектур
Если система x86_64, установите apr-devel.x86_64 (не для i386):
yum install apr-devel.x86_64Без этого при сборке возможна ошибка вида:
cannot open /httpd/build/config_vars.mk: No such file or directory at /usr/sbin/apxs line 201.Сборка RPM-пакетов PHP с патчем
Запустите сборку:
rpmbuild -ba php.specЕсли rpmbuild сообщит об отсутствии пакетов-зависимостей, установите их через yum. Пример возможной ошибки и требуемых пакетов:
[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-24.5.x86_64
httpd-devel >= 2.0.46-1 is needed by php-5.1.6-24.5.x86_64
libjpeg-devel is needed by php-5.1.6-24.5.x86_64
libpng-devel is needed by php-5.1.6-24.5.x86_64
pcre-devel >= 4.5 is needed by php-5.1.6-24.5.x86_64
libc-client-devel is needed by php-5.1.6-24.5.x86_64
mysql-devel >= 4.1.0 is needed by php-5.1.6-24.5.x86_64
postgresql-devel is needed by php-5.1.6-24.5.x86_64
unixODBC-devel is needed by php-5.1.6-24.5.x86_64
net-snmp-devel is needed by php-5.1.6-24.5.x86_64
gd-devel is needed by php-5.1.6-24.5.x86_64
freetype-devel is needed by php-5.1.6-24.5.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 снова. В результате в /usr/src/redhat/RPMS/i386 или /usr/src/redhat/RPMS/x86_64 появятся готовые RPM-пакеты.
Установка сгенерированных RPM
Для 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
Скачиваем исходники расширения, проверяем MD5 и подпись, затем собираем и устанавливаем:
cd /usr/src
wget http://download.suhosin.org/suhosin-0.9.29.tgz
md5sum suhosin-0.9.29.tgz
wget http://download.suhosin.org/suhosin-0.9.29.tgz.sig
gpg suhosin-0.9.29.tgz.sigРаспакуйте и соберите расширение:
tar xvfz suhosin-0.9.29.tgz
cd suhosin-0.9.29
phpize
./configure
make
make installПосле make install файл suhosin.so обычно устанавливается в папку расширений PHP (путь покажет make install).
Включение расширения
Создайте файл /etc/php.d/suhosin.ini с содержимым:
extension=suhosin.soЗатем перезапустите Apache:
/etc/init.d/httpd restartПроверка результата
Откройте страницу info.php в браузере, например http://192.168.0.100/info.php. Suhosin должен отображаться в phpinfo в двух местах.


Критерии приёмки
- Патч успешно встроен в сборку PHP и пакеты установлены.
- Расширение suhosin.so доступно и загружается (extension в php.d).
- phpinfo показывает Suhosin в выводе.
Частые ошибки и способы их исправления
- Предупреждения про mockbuild можно игнорировать.
- Ошибка с apxs/config_vars.mk решается установкой apr-devel.x86_64 на x86_64-системах.
- rpmbuild может потребовать множество -devel пакетов — ставьте их через yum согласно сообщению об ошибке.
- Если подпись GPG не проходит, проверьте корректность скачанного файла и ключа, повторно скачайте файл и подпись.
Роли и контрольный список по ролям
- Системный администратор:
- Проверить версию PHP и соответствие src.rpm.
- Установить недостающие -devel пакеты.
- Собрать RPM и установить их.
- DevOps/релиз-инженер:
- Автоматизировать сборку через kickstart или CI.
- Протестировать сборку в тестовой среде.
- Аудитор по безопасности:
- Проверить, что включены требуемые параметры Suhosin.
- Провести регрессионное тестирование приложения.
Рекомендации по конфигурации и безопасности
- По умолчанию Suhosin работает с безопасными настройками, но вы можете подстроить параметры под окружение. Документация конфигурации: http://www.hardened-php.net/suhosin/configuration.html
- Тестируйте настройки на стейджинге, так как строгие ограничения могут сломать совместимость приложений.
Альтернативы и дополнения
- Используйте модуль web-аппликационного фаервола (например, mod_security) для защиты на уровне веб-сервера.
- Ограничение функций в php.ini (disable_functions) — простая мера, но менее гибкая, чем Suhosin.
Мини-методология обновления (SOP)
- Сохранить текущие конфигурации и бэкапы.
- Собрать и установить патч/расширение в тестовой среде.
- Прогнать набор smoke-тестов и критичных сценариев.
- Перенести на прод через контролируемое окно обслуживания.
Резюме
Suhosin повышает стойкость PHP-приложений к ряду векторов атак. На CentOS сборка включает применение патча к php.src.rpm, исправление зависимостей, сборку RPM и установку расширения suhosin.so. Всегда проверяйте подписи и тестируйте конфигурации прежде чем внедрять в прод.
Ссылки
- 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: персонализированная новостная лента