Обезопасим Web-server Apache2, PHP, MySQL

Скрываем информацию об операционной системе, версии apache, php на страницах 404, 500, 403 и т.д.
В /etc/apache2/conf.d/security
ServerSignature Off
ServerTokens Off  (Отвечает за отображение информации о сервере в http заголовках)
ServerTokens Prod
Редактирем файл php.ini:
expose_php = Off  (Отвечает за показ версии интерпретатора php. Может принимать значения Off/On. Его тоже убираем с глаз долой)

Защита через ограничение ряда функций в PHP.
В конфигурационном файле /etc/php5/apache2/php.ini, и редактируем следующие переменные:
safe_mode_exec_dir=/home/http — разрешаем запуск программ только из специального каталога.

disable_functions = phpinfo,exec,ini_get_all,parse_ini_file,passthru,php_uname,popen,proc_open,shell_exec,show_source,system

Описание функций в disable_functions:

exec — вызов внешней программы
ini_get — получает значение опции конфигурации
ini_get_all — получает все опции конфигурации
parse_ini_file — разбирает файл конфигурации
passthru — вызов внешней программы и вывод «сырых» результата на дисплей
php_uname — возвращает информацию об ОС, на которой php был построен
popen — открывает файловый указатель процесса
proc_open — выполняет команду и открывает файловый указатель для ввода/вывода
shell_exec — выполняет команду в оболочке/shell и возвращает полный вывод в виде строки
show_source — вывод исходного текста текущей веб страницы
system — вызов внешней программы и вывод результата на дисплей
diskfreespace — псевдоним функции disk_free_space
disk_free_space - получить размер доступного пространства в каталоге
disk_total_space - возвращает общий размер диска
eval — вычисляет строку, заданную в code_str, как код PHP (eval ( string code_str))
fileperms — получить информацию о правах на файл
fopen — открывает файл или URL
opendir — возвращает дескриптор каталога для последующего использования с функциями closedir (), readdir () и rewinddir ()
phpinfo — выводит всю информацию об php, Ос
phpversion — выводит версию php
posix_getpwuid — возвращает информацию о пользователе по его user id
posix_getgrgid — возвращает информацию о группе по её group id
posix_uname — получает системное имя, возвращает хэш строк с информацией о системе

safe_mode on — запретить выполнять команды на сервере с помощью php, но мы все равно сможем просматривать и редактировать шеллом файлы на которые у нас есть доступ. А доступ у нас есть на все файлы на которые есть доступ у Apache. В Ubuntu и в Debian Apache работает от имени пользователя www-data и группы www-data.Так что мы имеем доступ на чтение на все файлы c правами 644, даже если они пренадлежат другим пользователям и полный доступ на файлы и директории, принадлежащие www-data.

Защита через ограничение ряда функций в Apache.
Hахожу файл конфигурации виртуального хоста, и внутри директивы VirtualHost добавляю разрешение обработки скриптов 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 /srv/~
php_admin_value include_path .:/srv/~
php_admin_value upload_tmp_dir /srv/~/www/tmp
php_admin_value safe_mode_include_dir /srv/~/www/tmp

Запуск виртуальных хостов от разных учетных записей
Необходимо разграничить доступ на уровне apache. По сути, нужно, что бы Apache запускался для каждого пользователя под своим логино, для чего это нужно? Ситуация: У нас есть сервер, где много разных хостов и нужно разграничить доступ.

Установка apache2-mpm-itk может удалить apache2 и apache2-mpm-prefork

Устанавливаем:
$ sudo apt-get install apache2-mpm-itk

Далее, прописываем к каждому виртуальному хосту следующее:

<IfModule mpm_itk_module>
AssignUserId USER GROUP
</IfModule>

Создаем новую группу:
$sudo groupadd friend

Создаем пользователя vasya в группе friend:
$sudo useradd -s /bin/false -d /home/vasya -m -g friend vasya

Далее, необходимо установить права владения файлов у виртуальных хостов:
$sudo chown MYUSER:MYGROUP /var/www/my-virtualhost/ -R

Активировать этот модуль через a2enmod НЕ нужно.

Перезапускаем Apache2:

$ sudo /etc/init.d/apache2 reloadВот и все! По крайней мере от дурака мы с вами защитились =)

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

This blog is kept spam free by WP-SpamFree.