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

Original author: Vivek Gite
  • Translation

Настройка 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;


Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 7

    0
    Оттягиваю момент публикации последних двух частей перевода до споров, рекеомендаций и прочего самого главного в таких статьях — до ваших комментариев.
      +1
      «Options Indexes» и «AllowOverride All» — какое же это повышение безопасности?
        0
        Запретить .htaccess в папках? На сколько и зачем? All, None, AuthConfig, FileInfo, Indexes, Limit, Options?
        А вот на счет Options Indexes — нужно не лениться класть во все папки index-файлы. Хотя, Options Indexes можно переопределить в .htaccess. По какой-то причине, обычно, хостинги этого не делают. Хотя, вот именно во втором случае я с вами соглашусь.

        — Пасаны, пишем «Options -Indexes».
          +2
          При данной конифгурации апача и запросе например your-domain/index.php, апач будет искать .htaccess во всех 3 папках. Т.е /var/.htaccess, /var/www/.htaccess и /var/www/html/.htaccess

            +1
            Да, вы чертовский правы. Это чуть ли не правило №2 оптимизации производительности apache.
            Запрещаем использование .htaccess во всех папках.

            DocumentRoot /var/www/html
            <Directory />
                AllowOverride None
            </Directory>
            


            Разрешаем его использование в /var/www/html/ и ниже
            <Directory /var/www/html/>
                AllowOverride all
            </Directory>
            

        +1
        В большинстве случаев это плохое решение:
        AddHandler php5-script .php
        AddType text/html .php
        


        Правильней было бы сделать как-то так:
        <FilesMatch "\.ph(p?|tml)$">
        AddHandler php5-script .php
        AddType text/html .php
        </FilesMatch>
        

        Имхо в 99% случаев выполнение файлов file.php.jpg как php не требуется.
          +1
          Чёрт, писать комменты с утра — зло:)
          Естественно должно быть так:
          <FilesMatch "\.php$">
          AddHandler php5-script .php
          AddType text/html .php
          </FilesMatch>
          


          и не забыть вычистить php из типов (зависит от ОСи):
          root@AKrasichkov:/etc# cat mime.types | grep php
          application/x-httpd-php				phtml pht php
          application/x-httpd-php-source			phps
          application/x-httpd-php3			php3
          application/x-httpd-php3-preprocessed		php3p
          application/x-httpd-php4			php4
          application/x-httpd-php5			php5
          

          Это во-первых не даст выполнять pht файлы как php, о которых разработчики обычно не догадываются. Во-вторых это не позволит дергать php на файлах вида file.php.any

        Only users with full accounts can post comments. Log in, please.