Использование amon для дополнительной защиты PHP-интерпретатора от выполнения внешних программ |
[исправить] |
Для экспресс-блокировки выполняемых при работе определенного PHP-скрипта
внешних программ удобно использовать библиотеку amon.so
(http://www.lucaercoli.it/amon.html), которая подменяет своим обработчиком
системный вызов execve() и контролирует его выполнение. Библиотека amon.so
рассчитана на тесное взаимодействие с PHP и учитывает особенности его работы,
позволяя защититься от простейших атак и блокировать работу бэкдоров, подобных r57shell.
Так как библиотека amon пока отсутствует в стандартных пакетах, загрузим и
соберем её вручную (пример для Debian/Ubuntu).
Устанавливаем необходимые для сборки компоненты:
apt-get install build-essential
Загружаем amon:
wget http://www.lucaercoli.it/amon/amon.c
Открываем файл amon.c и находим в верхней части строку "char * cmds []", в
которой определен список допустимых команд. При необходимости правим список на
своё усмотрение.
По умолчанию список разрешенных программ выглядит следующим образом:
"/usr/sbin/sendmail"
"/usr/lib/sendmail"
"/etc/alternatives/lib.sendmail"
"/usr/lib/sm.bin/sendmail"
"/usr/bin/mail"
"/bin/mv"
"/bin/rm"
"/usr/bin/unlink"
"/bin/rmdir"
"/bin/cp"
"/bin/date"
"/bin/bzip2"
"/bin/gunzip"
"/bin/gzip"
"/usr/bin/unzip"
"/bin/tar"
"/usr/bin/host"
"/usr/bin/file"
"/usr/bin/uptime"
"/bin/grep"
"/usr/bin/diff3"
"/bin/pwd"
Компилируем amon
gcc -fPIC -shared -ldl -o amon.so amon.c
Копируем amon.so в директорию /lib:
mv ./amon.so /lib/
В простейшем случае для защиты php-скрипта, запущенного в командной строке или
в режиме CGI можно использовать следующий скрипт (php5-cgi-wrapper):
#!/bin/sh
export LD_PRELOAD=amon.so
exec /path/del/vero/php5-cgi "$@"
При использовании механизма suEXEC, этот скрипт можно прописать вместо вызова
php, например, указать в конфигурации apache:
ScriptAlias /php_amon/ "/usr/local/bin/"
AddHandler php-script .php
Action php-script /php_amon/php5-cgi-wrapper
В случае необходимости работы php в виде модуля (libapache2-mod-php5),
работающего внутри Apache, добавляем в /etc/apache2/envvars:
export LD_PRELOAD=amon.so
и перезапускаем apache:
/etc/init.d/apache2 restart
Для проверки загрузилась ли библиотека создадим и запустим простейший скрипт, в
выводе которого должно быть упоминание amon.so:
<?php
phpinfo();
?>
Для php-скриптов, работающих в режиме FastCGI через mod_fcgid, достаточно
написать промежуточный shell-скрипт, который использовать для запуска основного php-скрипта:
#!/bin/sh
export PHPRC=/etc/php5/cgi
export LD_PRELOAD = amon.so
exec /usr/lib/cgi-bin/php
В ситуации, когда php-скрипт попытается запустить, допустим, /bin/sh, операция
будет блокирована, а в error.log будет оставлена запись:
sh: command_name: command not found
|
|
|
|
Раздел: Корень / Администратору / Сетевые сервисы / WWW, Apache httpd / Ограничение доступа и ресурсов, безопасность |
|
2.2, mma (?), 06:13, 26/04/2011 [^] [^^] [^^^] [ответить]
| +/– |
тсссс, не мешай людям изобретать велосипед. Еще чуть-чуть и selinux уже начнут изучать
| |
|
3.7, sa10 (ok), 17:41, 27/04/2011 [^] [^^] [^^^] [ответить]
| +/– |
> Еще чуть-чуть и selinux уже начнут изучать
А не подскажете где изучить selinux который внутри контейнера openvz работает?
| |
|
4.10, mma (?), 07:02, 28/04/2011 [^] [^^] [^^^] [ответить]
| +/– |
ну это надо спрашивать с разработчиков openvz
LXC дружит с selinux.
| |
|
|
|
1.4, WbxC (?), 21:34, 26/04/2011 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
А что, красиво придумано: хакерскими методами - против самих же хакеров. Клин клином вышибают.
| |
1.11, Василий (??), 17:26, 20/11/2017 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
Подскажите пожалуйста, а как его собрать на 8 дебиане 64 бит
на команду
gcc -fPIC -shared -ldl -o amon.so amon.c
сыпет кучу ошибок вроде:
/usr/include/x86_64-linux-gnu/bits/fcntl.h:40:5: error: unknown type name ‘__off_t’
| |
|