Повышаем безопасность стека web-приложений (виртуализация LAMP, шаг 4/6)

в 5:02, , рубрики: Apache, CentOS, lamp, nfs, nfsv4, Веб-разработка, Серверная оптимизация, Серверное администрирование

Настройка web-сервера Apache на работу с HTML+PHP5 файлами сетевой файловой системы (NFS)

В четвертом уроке цикла статей о настройке стека web-приложений мы поговорим о сервере Apache.

Web-сервер Apache отвечает за предоставление доступа к динамическому контенту по HTTP или HTTPS протоколу. В этом примере мы установим и будем использовать web-сервер Apache2 + php5, а так же установим DocumentRoot на vm05:/exports/html, смонтировав его в /var/www/html. Для этого мы введем следующие команды на нашем виртуальном сервере vm02 с IP-адресом 192.168.1.11.

Настройка NFS- клиента

С помощью yum-менеджера установим пакеты NFS-клиента:

# yum groupinstall "Network file system client"

Или чуть проще:

# yum install nfs-utils nfs4-acl-tools

Включим службы NFSv4-клиента:

# chkconfig rpcbind on
# chkconfig rpcidmapd on
# chkconfig nfslock on

/etc/idmapd.conf настройки nfs-клиента

Отредактируем файл конфигурации nfs-клиента

# vi /etc/idmapd.conf

Убедитесь, что параметры выставлены ​​в соответствии с доменным именем NFS-сервера:

Domain = cyberciti.biz
 
[Mapping]
 
Nobody-User = nobody
Nobody-Group = nobody

Сохраните и закройте файл. Запустим все службы NFS-клиента:

# /sbin/service rpcbind start
# /sbin/service rpcidmapd start
# /sbin/service nfslock start

Монтирование файловой системы

Введите следующую команду

# showmout -e vm05

Или:

# showmout -e 192.168.1.14

Пример вывода команды:

Export list for v.txvip1:
/exports/html     192.168.1.10,192.168.1.11
/exports/static   192.168.1.10,192.168.1.11

Смонтируем /exports/html файловую систему в /var/www/html, введя следующую команду:

# /bin/mount -t nfs4 -orsize=32768,wsize=32768,intr,hard,proto=tcp,sync vm05:/exports/html /var/www/html/

Или:

# /bin/mount -t nfs4 -orsize=32768,wsize=32768,intr,hard,proto=tcp,sync 192.168.1.14:/exports/html /var/www/html/

Монтирование файловой системы через /etc/fstab

Отредактируем /etc/fstab:

# vi /etc/fstab

Добавим следующую строку:

vm05:/exports/html /var/www/html nfs4 orsize=32768,wsize=32768,intr,hard,proto=tcp,sync

Сохраним и закроем файл. Убедимся, что netfs-служба включена:

# chkconfig netfs on

Убедимся, что пользователь apache видит наши файлы

# su - apache
$ ls /var/www/html/
$ exit
#

Обратите внимание, что root-пользователь или любой другой пользователь не видит /var/www/html  из-за установленной нами политики безопасности. Только apache-пользователь должен получить доступ к DocumentRoot. Это наши настройки по умолчанию.

Установка программного обеспечения Apache

Установим пакеты Apache2 через yum-менеджер:

# yum install httpd

Установка php5 и необходимые модули

Введите следующие команды, что бы установить php5, модули, предоставляющие доступ к mysql, модули работы с графическими файлами и все остальные, необходимы в работе вашего приложения модули:
 

# yum install -y php-pear php-common php-bcmath php-mbstring php-cli php-pdo php-php-gettext php-mcrypt php-gd php-xml php-pecl-apc php php-mysql php-xmlrpc

Установка поддержки memcached для php5

Для того чтобы получить доступ к memcached-серверу, установленному на vm03 необходимо установить php  кэш- сервер:

# yum install -y php-pecl-memcache

Настройка Apache

Отредактируем файл конфигурации сервера Apache /etc/httpd/conf/httpd.conf:

# vi /etc/httpd/conf/httpd.conf

Добавьте или отредактируйте следующие настройки (DocumentRoot должен указывать на nfs-раздел, смонтированный в /var/www/html):

# Разрешить прокси-серверу коммуникации по локальной сети
Listen 192.168.1.11:80
# Безопасности по умолчанию во избежание утечки информации
ServerTokens Prod
ServerSignature Off
 
# Установка DocumentRoot
DocumentRoot "/var/www/html"
<Directory "/var/www/html">
   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
   Options Indexes FollowSymLinks
   AllowOverride All
   Order allow,deny
   Allow from all
</Directory>

Сохраните и закройте файл.

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

PHP is a widely used server-side scripting language («Москва, столица нашей родины» прим.пер.)
Отредактируем файл /etc/httpd/conf.d/php.conf следующей командой:

# cat /etc/httpd/conf.d/php.conf

Приблизительный вывод команды:

# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.<br />
 
<IfModule prefork.c>
  LoadModule php5_module modules/libphp5.so
</IfModule>
<IfModule worker.c>
  LoadModule php5_module modules/libphp5-zts.so
</IfModule>
 
# Присобачиваем PHP-интерпретатор к файлам с расширением .php
AddHandler php5-script .php
AddType text/html .php
 
# Add index.php to the list of files that will be served as directory
# indexes.
DirectoryIndex index.php
 
# Uncomment the following line to allow PHP to pretty-print .phps
# files as PHP source code:
#
#AddType application/x-httpd-php-source .phps

Смотрите и читайте о том, как защитить и оптимизировать PHP5 в дополнительной статье по теме (или просите перевод, — прим.пер.)

Извлечение реальных IP для перенаправленных HTTP-запросов

Установим пакет mod_extract_forwarded, чтобы получить реальный IP источника направленного HTTP-запроса (подключаем EPEL-репозиторий):

# yum -y install mod_extract_forwarded package

Редактируем /etc/httpd/conf.d/mod_extract_forwarded.conf:

# vi /etc/httpd/conf.d/mod_extract_forwarded.conf

Добавим или изменим настройку следующим образом:

## Accept real ip from our nginx reverse proxy  at 192.168.1.1 ##
MEFaccept 192.168.1.1

Сохраним/закроем файл и перезапустим web-сервер:

# service httpd reload

Настройка iptables для доступа к web-серверу

Отредактируйте файл /etc/sysconfig/Iptables, добавив следующие параметры (убедитесь, что они прописаны до окончательных LOG и DROP настроек INPUT-цепочки):

## разрешить доступ только из локальной сети ##
-A INPUT -m state --state NEW -p tcp -s 192.168.1.0/24 --dport 80 -j ACCEPT

Сохраняем, закрываем. Перезапускаем iptables:

# /sbin/service iptables restart
# /sbin/iptables -L -v -n

Включаем Apache

Запускам Apache2 web-сервер следующей командой:

# chkconfig httpd on
# service httpd start

Врубаем браузер и ломимся на наш сервер:

http://192.168.1.11/

Применчание к MySQL и Memcached серверу

Если вам нужно использовать mysql в вашем приложении – IP-адрес 192.168.1.13 и tcp-порт 3306:

/* Пример php-конфигурации приложения */
/* Имя БД для WordPress */
define('DB_NAME', 'foo');
 
/* MySQL database username */
define('DB_USER', 'bar');
 
/* MySQL database password */
define('DB_PASSWORD', 'mypassword');
 
/* MySQL hostname */
define('DB_HOST', '192.168.1.13');

Если вам нужен memcached-сервер – IP-адрес 192.168.1.12 и tcp-порт 11211:

/* пример php-кода */
                if ( isset($memcached_servers) )
                        $buckets = $memcached_servers;
                else
                        $buckets = array('default' => array('192.168.1.12:11211'));

Или:

$config['Datastore']['class'] = 'myApp_MemCached;
$i = 0;
$i++;
$config['Misc']['memcacheserver'][$i]           = '192.168.1.12';
$config['Misc']['memcacheport'][$i]             = 11211;
$config['Misc']['memcachepersistent'][$i]       = true;
$config['Misc']['memcacheweight'][$i]           = 1;
$config['Misc']['memcachetimeout'][$i]          = 1;
$config['Misc']['memcacheretry_interval'][$i]   = 15;

Автор: danielnewman

* - обязательные к заполнению поля