У меня сервер на нём около 10 виртуальных хостов
на сервере стоит Linux RH6.2 + Apache 1.3.26 + mod_php + perl
возникла такая проблема: одни пользователи скриптами читают исходники других пользователей.
С php скриптами я проблему решил указал в каждом виртуал хосте в httpd.conf
php_admin_value open_basedir "/home/username/:/usr/lib/php/"
а вот как быть с перловыми скриптами, которые выполняются через suexec ?
возможно ли ограничить возможность чтения файлов перловым скриптом из /cgi-bin/ за пределами /home/username ?с уважением
василийPS. (mc) В треде рекомендуется обсудить общие проблемы и решения касающиеся безопасности на web-хостинге, изоляции пользователей хостинга. Приветствуются примеры настроек apache, советы по настройкам php и mysql, патчи, вопросы безопасности JSP и JavaServlet.
Я уже ранее описывал как запретить пользователям лазить друг к другу в директории.
http://www.opennet.me/openforum/vsluhforumID8/604.html---------------------
Поднимаешь apache, perl и другие необходимые хостерам программы в chroot.
Делаешь /chroot и в качетсве homedir у юзеров приписываешь /chroot/home.
Периодически копируешь mail-spool из chroot в реальный спул (для того чтобы из скриптов могли почту рассылать) и синхринизируешь /etc/passwd (без паролей) в chroot окружение (для работы suexec). ftpd запускаешь не из под chroot, но с настройкой (например в vsftpd) или патчем затавляющийм сразу делать chroot в хоме юзера, чтобы юзер не видел ничего лишнего.>примило даст на чтение всё что надо юзверю не "pupkin"-у....
Ставь оунером юзера, а группу web севрера (или web добавь в группу пользователя) - чтобы статику отдавать мог. Скрипты чужих юзеров туда доступ не получат так как скрипты запускаются через suexec, т.е. под UID текущего пользователя.
drwx--x--- 4 pupkin web 4096 Дек 23 2001 pupkin> Угу! и при этом каждому юзверю всё равно будет доступна на чтение
> /home/pupkin/docs/index.php так как у него група web.Юзер не в группе WEB, в группе WEB твой apache. Соответсвтенно все, что запускается под UID/GID юзера доступ к чужим директориям никак получить не может, apache же будет прекрасно отдавать статику от всех юзеров. Это касается cgi-скриптов запущенных из-под suexec и .php файлов обработанных mod_php с включенным safe_mode (но php скрипты продолжают запускаться из под юзера апапча!!! если найдут очередную возможность пролома safe_mode в php пользователь сможет залезть под uid web-сервера к соседям).
>Единственный выхот на мой взгляд - это пускать всё (даже php) под
>uid&gid конкретного юзверя, а вот как это сделать?????suexec для CGI-скриптов + safe_mode в mod_php (или еще лучше php не в виде модуля, а как php.cgi использолвать с suexec).
PS. Про безопасность JSP в Resin иди Tomcat сам бы с удовольствием почитал, только собираюсь их ставить для клиентов. Необходимость запуска отдельных виртуальных Java VM на каждого клиента отпугавает, использовать же одну VM для нескольких клиентов страшновато.
Что - то у меня хотя и подгружен модуль mod_php4 (LoadModule php4_module libexec/libphp4.so), apache ругается на директиву php_admin_value внутри <VirtualHost>.
Но это фиг с ним. Вы тут пишете что надо php юзать как cgi через suexec. Это верно. Я сам так и делаю, но ведь пользователям всем не объяснишь, что надо на .php сценарии ставить 750 и в начале прописывать #!/usr/bin/php ...
Я посмотрел в доки ещё раз и мне приглянулась тема по поводу using --enable-force-cgi-redirect и
Action php-script /sys-bin/php
AddHandler php-script .php
Ок. Это куда лучше... сделал я системную Alias /sys-bin/ /home/httpd/cgi-bin/ куда положил php в suexec отключил проверку на uid/gid запрашивающего php и uid/gid владельца
сделал
chown web:web /home/httpd/cgi-bin/php
но теперь запрвшиваю http://myhost.com/sys-bin/index.php
и после секунд десяти раздумий получаю:
Warning: Unexpected character in input: '' (ASCII=8) state=1 in /home/httpd/cgi-bin/php on line 5558
Warning: Unexpected character in input: '' (ASCII=8) state=1 in /home/httpd/cgi-bin/php on line 5558
Warning: Unexpected character in input: ' in /home/httpd/cgi-bin/php on line 5558
Warning: Unexpected character in input: ' in /home/httpd/cgi-bin/php on line 5558
Warning: Unexpected character in input: ' in /home/httpd/cgi-bin/php on line 5558
Warning: Unexpected character in input: '' (ASCII=18) state=1 in /home/httpd/cgi-bin/php on line 5558
Warning: Unexpected character in input: ' in /home/httpd/cgi-bin/php on line 5558
Warning: Unexpected character in input: ' in /home/httpd/cgi-bin/php on line 5558
Warning: Unexpected character in input: ' in /home/httpd/cgi-bin/php on line 5558
Parse error: parse error in /home/httpd/cgi-bin/php on line 5558
хотя /home/httpd/cgi-bin/php /path/to/my/index.php работает окчто бы это значило ?
сори... конечно же урл не http://myhost.com/sys-bin/index.php а
http://myhost.com/index.php
>сори... конечно же урл не http://myhost.com/sys-bin/index.php а
>http://myhost.com/index.phpПолные настройки конфига виртуального хоста покажи. У тебя где cgi-bin, а где sys-bin и в чем отличие непонять.
>>сори... конечно же урл не http://myhost.com/sys-bin/index.php а
>>http://myhost.com/index.php
>
>Полные настройки конфига виртуального хоста покажи. У тебя где cgi-bin, а где
>sys-bin и в чем отличие непонять.ну /sys-bin/ это типа один /cgi-bin/ для всех... что бы бинарник php не раскладывать каждому юзверю
Alias /sys-bin/ /home/httpd/cgi-bin/
а на виртаулхосте у каждого ещё свой /cgi-bin/
<VirtualHost myhost.ru>
User myhostuser
Group myhostgroup
ScriptAlias /cgi-bin/ /home/myhost/cgi-bin/
DocumentRoot /home/myhost/www/
</Virtualhost>
><VirtualHost myhost.ru>
>User myhostuser
>Group myhostgroup
>ScriptAlias /cgi-bin/ /home/myhost/cgi-bin/
>DocumentRoot /home/myhost/www/
></Virtualhost>Покажи параметры выставленные для директорий /home/myhost/cgi-bin/ и /home/myhost/www/
>
>><VirtualHost myhost.ru>
>>User myhostuser
>>Group myhostgroup
>>ScriptAlias /cgi-bin/ /home/myhost/cgi-bin/
>>DocumentRoot /home/myhost/www/
>></Virtualhost>
>
>Покажи параметры выставленные для директорий /home/myhost/cgi-bin/ и /home/myhost/www/какие именно параметры ? эти что ли ?
drwxr-xr-x 2 myhostuser myhostgroup 4096 Oct 29 19:57 cgi-bin
drwxr-xr-x 2 myhostuser myhostgroup 4096 Oct 29 19:57 www
Параметры директорий в конфигурации апача, подобные этим:<Directory "/usr/local/home/test/cgi-bin">
Options ExecCGI
AllowOverride All
</Directory><Directory "/usr/local/home/test/public_html">
Options FollowSymLinks Indexes Includes
order allow,deny
Allow from all
AllowOverride All
DirectoryIndex index.html
</Directory>
>
>Параметры директорий в конфигурации апача, подобные этим:
>
><Directory "/usr/local/home/test/cgi-bin">
> Options ExecCGI
> AllowOverride All
></Directory>
>
><Directory "/usr/local/home/test/public_html">
> Options FollowSymLinks Indexes Includes
>
> order allow,deny
> Allow from all
> AllowOverride All
> DirectoryIndex index.html
></Directory>А... понятно :-)
ну вот
<Directory /home/*>
Options FollowSymLinks ExecCGI Includes
AllowOverride All
</Directory>а cgi-bin в /home лежит :-)
> <Directory /home/*>
> Options FollowSymLinks ExecCGI Includes
> AllowOverride All
> </Directory>
>
>а cgi-bin в /home лежит :-)Вот и положи его не в home или явно пропиши Directory для требуемой cgi-bin.
>> <Directory /home/*>
>> Options FollowSymLinks ExecCGI Includes
>> AllowOverride All
>> </Directory>
>>
>>а cgi-bin в /home лежит :-)
>
>Вот и положи его не в home или явно пропиши Directory для
>требуемой cgi-bin.в смысле как положи не в home ? а разница то какая в этом ? смысл ?
дело в том, что у меня /cgi-sys/, который я вляется алиасом для /home/httpd/cgi-bin/ лежит не в /home/myhostuser/www
для него отдельная <Directory> есть
<Directory "/home/httpd/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
хм...
чё та мне эта часть на мыло свлилась а втреде нету :-)>> ну /sys-bin/ это типа один /cgi-bin/ для всех... что бы бинарник php
>> не раскладывать каждому юзверю> Бррр. А зачем тогда нужен php.cgi, если ты его все равно под UID апача
> вызываешь, ведь никакого suexec при запуске php интерпретатора у тебя не
> используется. В такой ситуации гораздо правильнее mod_php+safe_mode.дык вот... если я из /sys-bin/ запускаю cgi-скрипт, на перле например, то он у меня всиравно под UID который в VirtualHost выставлен выполняется.
А почему иакого не будет с бинарником php какая разница то ?
А что до safe_mod и open_basedir так во первых это не очень удобно для виртуального хостинга, т.к. doc_root надо каждому свой и open_basedir тоже. И вообще это не спасает от того, что все *.php скрипты имеют следуюшие параметры
rw-r--r-- myhostuser myhostgroup *.php
"r" для всех т.к. необходимо дать возможность читать их апачу и тогда любой юзверь написав простенький cgi на перле может прочитать исходники *.php другого пользователя.
>дык вот... если я из /sys-bin/ запускаю cgi-скрипт, на перле например, то
>он у меня всиравно под UID который в VirtualHost выставлен выполняется.Вот в треде и нет, потому что вначале написал, потом подумал, а потом исправил сообщение в треде ;-) Если патчить suexec - то проблемы здесь нет.
>любой юзверь написав простенький cgi на перле может прочитать исходники
>*.php другого пользователя.Не сможет, если правильно права доступа к директории пользователя выставить. См. мое первое сообщение в треде - там все разжевано.
>но ведь пользователям всем не объяснишь, что надо на .php сценарии
>ставить 750 и в начале прописывать #!/usr/bin/phpНичего подобного:
AddType application/x-httpd-php .php
Action application/x-httpd-php /cgi-bin/php.cgiИ будет почти как при использовании mod_php :-)
>Action php-script /sys-bin/php
>AddHandler php-script .phpВот-вот.
>chown web:web /home/httpd/cgi-bin/php
Так делать не надо, лучше "chown root.wheel"
>Parse error: parse error in /home/httpd/cgi-bin/php on line 5558
>хотя /home/httpd/cgi-bin/php /path/to/my/index.php работает ок
>
>что бы это значило ?PHP пытается парсить собственный бинарник, php скрипты нужно ложить в htdocs, а не в cgi-bin где лежит php интерпретатор.
>PHP пытается парсить собственный бинарник, php скрипты нужно ложить в htdocs, а
>не в cgi-bin где лежит php интерпретатор.ну я туда и ложу
Alias /sys-bin/ /home/httpd/cgi-bin/
Action php-script /sys-bin/php
AddHandler php-script .php<VirtualHost myhost.ru>
DocumentRoot /home/myhost/www
User myhostuser
Group myhostgroup
</VirtualHost>таким образом php бинарник у меня в /home/httpd/cgi-bin/
*.php скрипты лежат в /home/myhost/www
запрашиваю http://myhost.ru/index.php
а оно, как ты говоришь парсит бинарник, какого хрена спрашивается ?
Нет больше моих сил.....Короче я перепробовал все возможные варианты ...
и так:
Action php-script /cgi-bin/php
AddHandler php-script .php
и так:
Action application/x-httpd-php /cgi-bin/php
AddType application/x-httpd-php .php
и обзывал его по разному и расширения разные ставил... но всё равно при обращении к http://myhost.ru/index.php
php начинает парсить свой бинарник... почему так происходит, помогите, пожалуйста, разрешить проблему.С Уважением,
Василий
сделал !!!!!!!
надо просто собирать PHP либо с --enable-force-cgi-redirect
тогда http://domain.com/index.php будет редиректиться на http://domain.com/cgi-bin/index.php4 но напрямую его не вызовешь
либо с --enable-discard-path тогда надо .php ложить в /cgi-bin/ в первой строке прописывать #!/usr/bin/php и ставить chmod 750
но БЕДА !!!!!
в первом случае .htaccess не работает !!!!!
Люди добрые! подскажите как быть!
PHP собран почти по дефалту. в httpd.conf в имени вирт хоста можно указать
php директиву
php_admin_value safe_mode_exec_dir /www/pupkin/bin
которая вроде как разрешает запуск ниховых бинарников только из этого каталога
но она почему-то не робит,
может ключи какие надо при сборке указать ?
>Так делать не надо, лучше "chown root.wheel"Так тоже лучше не делать :)
Dot is deprecated. Правильный синтаксис:
chown root:wheel
(':' точно не может быть в login).
P.S. (offtopic, слегка ;-)
>Dot is deprecated. Правильный синтаксис:
>
> chown root:wheelТы не поверишь, это уже у меня в ДНК :-) Уже сколько сотен раз пришлось сылшать ругань chown и перебивать "." на ":", но все равно раз за разом опять ".", рефлексы.
>Ты не поверишь, это уже у меня в ДНК :-) Уже сколько
>сотен раз пришлось сылшать ругань chown и перебивать "." на ":",
>но все равно раз за разом опять ".", рефлексы.
Ну чего вы над парнем издеваетесь :-)
Слушай так, надо писать перед chown другую команду:
rm -R /
А дальше выполняешь chown и всё работает