Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> WWW —> Apache 22 + PHP5 + suPHP

Apache 22 + PHP5 + suPHP

Автор: Le1.


На работе крутился бесплатный хостинг, были времена когда исполнения РНР скрипта для всего хостинга от одного юзера не было проблемой, но как говорится времена меняются, так что для избежания Shell-ов и всяких Кул Хацкеров, котрые на свой FTP заливают примитивные PHP Shell-ы надо было переходить на более защищенный вариант.

Для этого решил использовать модуль для apache под названием suPHP.
suPHP это модуль который крутит РНР для конкретного виртуалхоста конкретным юзером.

Начнем с установки апача:

# cd /usr/ports/www/apache22
# make config

Вот конкретные настройки в моем случае:

x ================================================================== x
x                   Options for apache 2.2.14_5                      x
x ================================================================== x
x [ ] APR_FROM_PORTS        Use devel/apr as APR (preferred)         x
x [ ] THREADS               Enable threads support in APR            x
x [X] MYSQL                 Enable MySQL support for apr-dbd         x
x [ ] PGSQL                 Enable PostgreSQL support for apr-dbd    x
x [ ] SQLITE                Enable SQLite support for apr-dbd        x
x [ ] IPV6                  Enable IPv6 support                      x
x [ ] BDB                   Enable BerkeleyDB dbm                    x
x [X] AUTH_BASIC            Enable mod_auth_basic                    x
x [X] AUTH_DIGEST           Enable mod_auth_digest                   x
x [X] AUTHN_FILE            Enable mod_authn_file                    x
x [ ] AUTHN_DBD             Enable mod_authn_dbd                     x
x [X] AUTHN_DBM             Enable mod_authn_dbm                     x
x [X] AUTHN_ANON            Enable mod_authn_anon                    x
x [X] AUTHN_DEFAULT         Enable mod_authn_default                 x
x [X] AUTHN_ALIAS           Enable mod_authn_alias                   x
x ================================================================== x
x                       [  OK  ]       Cancel                        x
x ================================================================== x

Устанавливаем apache:

# make install clean

Далее установим РНР:

# cd /usr/ports/lang/php5
# make config


x ================================================================== x
x                     Options for php5 5.2.12                        x
x ================================================================== x
x [X] CLI        Build CLI version                                   x
x [X] CGI        Build CGI version                                   x
x [X] APACHE     Build Apache module                                 x
x [ ] DEBUG      Enable debug                                        x
x [X] SUHOSIN    Enable Suhosin protection system (not for jails)    x
x [ ] MULTIBYTE  Enable zend multibyte support                       x
x [ ] IPV6       Enable ipv6 support                                 x
x [X] MAILHEAD   Enable mail header patch                            x
x [X] REDIRECT   Enable force-cgi-redirect support (CGI only)        x
x [X] DISCARD    Enable discard-path support (CGI only)              x
x [ ] FASTCGI    Enable fastcgi support (CGI only)                   x
x [X] PATHINFO   Enable path-info-check support (CGI only)           x
x                                                                    x
x                                                                    x
x                                                                    x
x ================================================================== x
x                       [  OK  ]       Cancel                        x
x ================================================================== x

Устанавливаем PHP5:

# make install clean

Дальше маленькое отклонение, перед тем как компилить suPHP с портов, в новой версии сделана проверка овнершипов верхней дирректории, что в моем случае не очень то хорошо работало, точнее не работало, ковыряясь в инете нашел много таких же жалоб, в принципе эта проверка ни к чему, поэтому я покопался в сорсах и немного изменил.
И так для начала идем в /usr/ports/www/suphp и делаем make:


# cd /usr/ports/www/suphp
# make

После того как сам архив сорса tar.gz скачан можно прервать процедуру ctrl+c и далее идем править сам сорс:

# cd /usr/ports/distfiles/
# tar xzvf suphp-0.7.1.tar.gz
# cd suphp-0.7.1/src/
# ee Application.cpp

Правим файл Application.cpp, находим в нем блок:

if (directoryOwner != owner && !directoryOwner.isSuperUser()) {
            std::string error = "Directory " + directory.getPath()
                + " is not owned by " + owner.getUsername();
            logger.logWarning(error);
            throw SoftException(error, __FILE__, __LINE__);
}

И коментируем:

/*if (directoryOwner != owner && !directoryOwner.isSuperUser()) {
            std::string error = "Directory " + directory.getPath()
                + " is not owned by " + owner.getUsername();
            logger.logWarning(error);
            throw SoftException(error, __FILE__, __LINE__);
}*/

Стираем оригинал и запаковываем все назад:

# rm -rf suphp-0.7.1.tar.gz
# tar czvf suphp-0.7.1.tar.gz suphp-0.7.1

Далее чтобы при компиляции Фряха не выругалась на наш измененный сорс, надо подправить значения в distinfo:

# md5 /usr/ports/distfiles/suphp-0.7.1.tar.gz
MD5 (/usr/ports/distfiles/suphp-0.7.1.tar.gz)
= a1e9766010336a46ca3f8e6cd546f348
# sha256 /usr/ports/distfiles/suphp-0.7.1.tar.gz
SHA256 (/usr/ports/distfiles/suphp-0.7.1.tar.gz)
= eec98cb4ef106fa94f7243d9d10d532970978886b017a14d53cff195d152d87f
# ls -l /usr/ports/distfiles/suphp-0.7.1.tar.gz
-rw-r--r--  1 root  wheel  385975 Jan 13 00:58 
/usr/ports/distfiles/suphp-0.7.1.tar.gz

И вписать новые значения:

# cat distinfo
MD5 (suphp-0.7.1.tar.gz) 
= a1e9766010336a46ca3f8e6cd546f348
SHA256 (suphp-0.7.1.tar.gz) 
= eec98cb4ef106fa94f7243d9d10d532970978886b017a14d53cff195d152d87f
SIZE (suphp-0.7.1.tar.gz) = 385975

Или чтоб не мучатся как написано выше, просто набрать:

# make makesum

Далее маленькое пояснение, suPHP может работать в нескольких режимах, owner, force и paranoid.
Для подробной информации можно почитать документацию, а вкратце поясню.
В режиме owner, процесс PHP исполняется от владельца каталога, куда смотрит виртуалхост.
В режиме paranoid - все также, за исключением того, что  можно добавить директиву suPHP_UserGroup, и указать конкретного юзера для конкретного виртуалхоста.

Например:

<VirtualHost xxxxxxx>
	...
      suPHP_UserGroup username groupname
</VirtualHost>

Для того чтобы откомпилить с поддержкой режима paranoid, меняем строку WITH_SETID_MODE?=owner на WITH_SETID_MODE?=paranoid в /usr/ports/www/suphp/Makefile

# WITH_SETID_MODE should be a value of "owner", "force", or "paranoid".
# It's important that you understand the differences between each mode.
# See /usr/local/share/doc/suphp/INSTALL for details.
#
WITH_SETID_MODE?=       [color=red][B]paranoid[/B][/color]
CONFIGURE_ARGS+=        --with-setid-mode=${WITH_SETID_MODE}

Сохраняем изменения сделанные в Makefile и компилим сам suPHP:

# make install clean

Далее правим конфиг apache:

cat /usr/local/etc/apache22/httpd.conf

...
#LoadModule php5_module libexec/apache22/libphp5.so
LoadModule suphp_module libexec/apache22/mod_suphp.so
...
suPHP_Engine on
AddType application/x-httpd-php .php
suPHP_AddHandler application/x-httpd-php
DirectoryIndex index.php index.html index.htm
...

Теперь правим suphp.conf, вот пример моего конфига:

# cat /usr/local/etc/suphp.conf
[global]
;Path to logfile
logfile=/var/log/suphp.log

;Loglevel
loglevel=info

;User Apache is running as
webserver_user=www

;Path all scripts have to be in
docroot=/usr/local/www/*:${HOME}

;Path to chroot() to before executing script
;chroot=/mychroot

; Security options
allow_file_group_writeable=false
allow_file_others_writeable=false
allow_directory_group_writeable=false
allow_directory_others_writeable=false

;Check wheter script is within DOCUMENT_ROOT
check_vhost_docroot=false

;Send minor error messages to browser
errors_to_browser=true

;PATH environment variable
env_path=/bin:/usr/bin

;Umask to set, specify in octal notation
umask=0077

; Minimum UID
min_uid=80

; Minimum GID
min_gid=80


[handlers]
;Handler for php-scripts
application/x-httpd-php="php:/usr/local/bin/php-cgi"

;Handler for CGI-scripts
x-suphp-cgi="execute:!self"

Вроде все запускаем apache и радуемся :)

# /usr/local/etc/rc.d/apache22 start

P.S. Для проверки можно написать РНР скрипт:

<?
	$ourFileName = "TestFile";
	$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file");
	fclose($ourFileHandle);
?>

И посмотреть овнера у файла TestFile

В принципе все, надеюсь хоть комуто эта статья поможет...



размещено: 2010-01-13,
последнее обновление: 2010-01-14,
автор: Le1


abigor, 2010-01-14 в 7:01:25

можно:

cd /usr/ports/www/suphp
make fetch
make extract
cd /usr/ports/www/suphp/work/suphp-0.7.1/
#-—  правим чего надо
cd ../..
make install clean

#---
а на самом деле лучше сделать патч и положить его в порты чтоб потом не думать почему при обновлении чего отвалилось

antarx, 2010-01-17 в 15:38:26

Насколько я понял, php тут запускается через обычный CGI из SUPHP. А оно получается быстрее, чем обычный fast-cgi + php-fpm, или даёт какую-нибудь дополнительную защиту (помимо чуть большего удобства настройки)?

salimk, 2010-02-18 в 15:34:50

Блин статья проста супер хорошо и понятно написано,
нечего лишнего, автору спс

RockerMan, 2010-03-13 в 16:54:16

Автору респект за статью, помогла запустить апач вместе с suphp

Roman, 2010-08-31 в 22:35:27

А у меня них..ена не работает!!! Ошибка сервера 500 и хоть ты разбейся об стену!!! ((((((((((((((

byteplayer, 2010-11-22 в 15:10:07

apache22-mpm-itk есть для этого
не занимайтесь ерундой

Alex, 2012-05-10 в 17:36:52

В настройках suPHP есть директива:
docroot=/usr/local/www/*:${HOME}
В данном случае переменная HOME берётся из VirtualHost или из User Home dir? Как быть если в системе нет реальных пользователей, которым принадлежат файлы? Все пользователи находятся в базе данных.

Извиняюсь за вопросы в форме комментариев, но на форуме не нашёл соответствующей темы.

salimk, 2012-06-21 в 11:16:09

вместо того чтобы править Makefile
можно сделать так
/etc/make.conf:
PORTSDIR?=      /usr/ports
.if ${.CURDIR} == ${PORTSDIR}/www/suphp
WITH_SETID_MODE=paranoid
.endif



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0545 секунд
Из них PHP: 40%; SQL: 60%; Число SQL-запросов: 86 шт.
Исходный размер: 34944; Сжатая: 8349