Ошибка: Failed to parse the Currency Converter XML document.
$23 236.27


Ошибка: Failed to parse the Currency Converter XML document.
$2 084.15


Ошибка: Failed to parse the Currency Converter XML document.
$1 029.46


Безопасная настройка PHP для виртуального хостинга на UNIX

Предисловие

Приходится признать, что операционные системы Windows не собираются уходить в небытие. Игнорировать этот факт нельзя, поэтому нужно научиться мирно сосуществовать с таковыми. Как известно, UNIX предоставляет удобные средства работы с TCP/IP и Internet, тогда как именно в Windows работают миллионы пользователей. А на долю системных администраторов выпадает управление всем этим «сатанинским шабашем».
«UNIX. Руководство системного администратора. Издание 3», предисловие к главе 26.

Hашла на меня блажь настроить на моем сервере модуль PHP к вэб серверу Apache. Я, конечно, успела наслушаться о том, что там какие-то запутки с настройками безопасности использования PHP, некоторые определила в процессе стряпания страничек и тут, как нельзя кстати, мне подвернулся в каком-то форуме Phil, очень мило помогший не наступить на грабли трижды. Собственно, эта страничка — наш с ним совместный труд к общей пользе. Hе могу сказать, что тут что-то изобретено нами, но зато все собрано нами любимыми в одну кучку.


Здесь я предлагаю свой вариант как максимально обезопасить совместное использование PHP/SSI/CGI на UNIX-like системах с использованием веб сервера Apache и размещении различных виртуальных хостов на одном IP. Я не буду морочить голову ненужными подробностями, предлагая каждому посетителю странички ознакомиться с командами unix-shell и особенностями компиляции и настройки упоминаемого программного обеспечения самостоятельно. Если кто-то найдет это для себя сложным, то ему лучше перейти на какую-нибудь другую, более увлекательную страничку, поиграть в сисадмина.


Я намеренно обошла вниманием запуск PHP-скриптов как CGI — там и так все ясно. В ту же кучу я отмела и проблемы PHP на выделенном сервере.

День первый

Итак, я прыгаю в мягкое кресло, пристраиваю клаву у себя коленках и бодренько так стукаю по кнопке питания (не меня, а компа :). У меня стоит FreeBSD (для пингвиноидов буду делать специальные коментарии, если чего забуду — дергайте за рукав), свеженький Apache, настроенный для работы от имени пользователя apache, входящего только в группу apache, с приложенными к Apache«у suexec»ом и PHP. Сейчас я настрою для пользователя stricty, входящему только в группу stricty и имющему домашний каталог /home/stricty, систему, чтобы stricty могла размещать свой сайт, не боясь злых «соседей» — таковые объявятся. Да, рассаживайтесь рядом поудобнее, потому что пока мы тут болтали система уже загрузилась и можно начинать. Все устроились? Отлично! Теперь дружно отвернулись, так как я собираюсь залогиниться root«ом…

Сила привелегий

Я буду делать все по порядку. Hачинаю с каталога, базового для домашних каталогов пользователей, то есть /home. Я запрещаю абсолютно всем запись в этот каталог и разрешу переходить в него. Затем я назначаю владельцем /home пользователя apache и группу apache. …Я что, забыла попросить повернуться обратно?.. Быстренько поворачиваемся, я уже давно объясняю. Только пользователю и группе apache и никому больше я разрешаю читать этот каталог. Теперь можете быть уверены — изменить каталог сможет только суперпользователь, прочитать сможет еще и пользователь apache, а перейти ниже этого каталога — любые пользователи.
root@strict:~# chown apache:apache /home
root@strict:~# chmod ug=rx,o=x /home
root@strict:~# ls -l / | grep home
dr-xr-x--x 2 apache apache 512 Jan 17 02:30 /home
root@strict:~#

Очень нежно подходим к домашнему каталогу для stricty — это мой дом, в котором будут жить мои mp3шки, рассказы и сайт. Печальный опыт показал, что придется пожертвовать домашний каталог /home/stricty пользователю apache, но оставить в группе stricty. Что и делаем. И владелцу и группе разрешаем чтение и переход в этот каталог, запись разрешаем только мне, то есть группе stricty. Всем остальным ничего не разрешаем. Внимательно смотрим! Hасмотрелись? Так, отводим взгляды от меня, смотрим на экран и осознаем — ниже каталога stricty могут перемещаться только пользователь apache и члены группы stricty — собственно, сама stricty. Без дополнительных ухищрений ни один сосед не может теперь пролезть ко мне в дом и я могу смело размещать в нем интимную информацию — например, фотографию моей любимой кошечки.
root@strict:~# chown apache:stricty /home/stricty
root@strict:~# chmod ug=rx,g+w,o-rwx /home/stricty
root@strict:~# ls -l /home
dr-xrwx-- — 2 apache stricty 512 Jan 17 02:35 /home/stricty
root@strict:~#

Для того, чтобы ошибки моих скриптов не могли испортить структуры каталогов, используемых в служебных целях, и для придания аккуратности моему дому, создаю в нем каталог www, принадлежащий пользователю apache и группе apache.
root@strict:~# mkdir /home/stricty/www
root@strict:~# chown apache:apache /home/stricty/www
root@strict:~# chmod a=rx /home/stricty/www
root@strict:~# ls -l /home/stricty | grep www
dr-xr-xr-x 2 apache apache 512 Jan 17 02:43 /home/stricty/www
root@strict:~#

Вот и все. Создаю каталоги для страничек и скриптов, принадлежащие, естественно мне, каталоги для логов и временных файлов, принадлежащие пользователю apache. Права доступа выставляем по потребностям — странички и скрипты должны быть читаемыми и запусаемыми Apache»м, и полностью контролируемыми мною, логи должны быть доступны на запись Apache«у и читаемы мною, каталог с временными файлами должен быть доступен для всех по всем параметрам.
root@strict:~# mkdir /home/stricty/www/html
root@strict:~# mkdir /home/stricty/www/cgi
root@strict:~# chown stricty:stricty /home/stricty/www/html /home/stricty/www/cgi
root@strict:~# chmod u=rwx,go=rx /home/stricty/www/html /home/stricty/www/cgi
root@strict:~# mkdir /home/stricty/www/logs
root@strict:~# mkdir /home/stricty/www/tmp
root@strict:~# chown apache:apache /home/stricty/www/logs /home/stricty/www/tmp
root@strict:~# chmod u=rwx,go=rx /home/stricty/www/logs
root@strict:~# chmod a=rwx /home/stricty/www/tmp
root@strict:~# ls -l /home/stricty/www
drwxr-xr-x 2 stricty stricty 512 Jan 17 02:57 /home/stricty/www/html
drwxr-xr-x 2 stricty stricty 512 Jan 17 02:57 /home/stricty/www/cgi
drwxr-xr-x 2 apache apache 512 Jan 17 02:57 /home/stricty/www/logs
drwxrwxrwx 2 apache apache 512 Jan 17 02:57 /home/stricty/www/tmp
root@strict:~#

Конфигурирование PHP

Приступим к правке файлика php.ini. Обязательно ставим режим safe_mode (или у Вас не все дома?). Разрешаем запуск программ только из специального каталога (у меня он обычно пустой) и запрещаем функцию system(). Можно этого и не делать, но представьте, что кто-то сможет дать команду killall — 9 httpd и ужаснитесь!
safe_mode=on
safe_mode_exec_dir=/home/http
disable_functions=system

Ой! Зачем же так пугаться?! Вылезайте из-за шкафа — я же показала как исправить ситуацию, уже все в порядке.

Осталось поправить конфигурацию веб сервера. Hахожу файл конфигурации, у меня это /usr/local/etc/apache/httpd.conf, и внутри директивы VirtualHost для сервера stricty добавляю разрешение обработки скриптов PHP php_admin_flag engine on. Осталось задать значения переменных PHP-машины open_basedir, include_path, upload_tmp_dir, safe_mode_include_dir для ограничения области работы с файлами моим домашним каталогом.
php_admin_flag engine on
php_admin_value open_basedir /home/stricty/
php_admin_value include_path .:/home/stricty
php_admin_value upload_tmp_dir /home/stricty/www/tmp
php_admin_value safe_mode_include_dir /home/stricty/www/tmp

Пусть всегда будет так ужасно!

Все настроено, можно перезапустить Apache и смело идти пить кофе. Проходите к столу и пока я варю божественный напиток, послушайте. Когда с помощью нескольких потерь данных, бессонных ночей и Schors»a удалось победить PHP, возникла идея избавиться от safe_mode. Как только мы выпьем по чашечке кофе, я сяду изучать документацию по PHP для создания режима safe_mode light. Хотя, последуещее обязательное отслеживание изменений вносимых в каждую версию PHP — задача не для слабонервных.

 

Интересное

Браузер Opera. FAQ
Приветствую всех поклонников браузера Opera. Представляю вашему вниманию очередную порцию вопросов/ответов.
Подробнее...
Горячие Клавиши
Сочетания клавиш Выполняемое действиеShift + влево Вызов контекстного менюAlt+Backspace Перейти на предыдущую страницуShift + вправо Перейти на следующую страницуAlt+Home Перейти на домашнюю...
Подробнее...
АнтиОМОН v.1.0
Представь такую ситуацию, ты сидишь перед телеком, смотришь Санта Барбару и тут раздаётся звонок. Ты открываешь дверь и в квартиру входят несколько амбалов, представившись сотрудниками ФСБ =)Они...
Подробнее...
Как узнать размер базы...
В этой небольшой статье вы узнаете, как получить размер вашей базы данных (БД) MySQL используя язык программирования PHP.Для начала нам потребуется простая функция formatfilesize(), которая будет...
Подробнее...
Применение терминала сбора...
Терминал сбора данных - функциональное устройство, предназначенное для управления товарооборотом. К потребителю он попадает вместе со встроенным сканером, позволяющим распознавать многочисленные...
Подробнее...
Unix+ Samba + ftpd,...
Есть такая проблема: сложно найти ftpd, понимающий перекодировку имен файлов. Если хранить файлы на сервере в koi8, то ftpшник выдает винде крякозябры. Если хранить в CP1251, то ftp не передает...
Подробнее...
Коды ответов сервера
В первой строке ответа HTTP-сервера содержится информация о том, был запрос клиента успешным или нет, а также данные о причинах успешного либо неуспешного завершения запроса. Эта информация...
Подробнее...
CSS дизайн: с учетом контекста
Веб-стандарты обещают нам улучшенную поддержку мультимедиа: возможность оптимизировать контент под возможности компьютерных экранов, портативных устройств, принтеров, проекторов, и других...
Подробнее...
Поиск файлов с расширением...
Чтобы убедиться в этом, создайте текстовый файл и запишите в него одно слово (например, «поиск»). Сохраните этот файл с расширением log или cpp. Теперь запустите поиск файлов (Пуск > Поиск),...
Подробнее...
Использование OpenGL в Java
Принципы реализации OpenGL в JavaВ настоящее время Java очень широко распространена и все больше и больше различных технологий переносятся на этот язык. Не исключением является и OpenGL. OpenGL...
Подробнее...