Apache (настройка сервиса)

Материал из Wiki семьи Белых
Перейти к: навигация, поиск

Apache HTTP-сервер (произносится /ə.ˈpæ.ʧi/, назван именем племён североамериканских индейцев Апачи; кроме того, является сокращением от англ. a patchy server) — свободный веб-сервер.
Основными достоинствами Apache считаются надёжность и гибкость конфигурации. Он позволяет подключать внешние модули для предоставления данных, использовать СУБД для аутентификации пользователей, модифицировать сообщения об ошибках и т. д. Поддерживает IPv6.

Установка Apache

Помимо самого сервера нужно установить PHP, MySQL, PHP-MySQL, OpenSSL, Image-Magic и некоторые модули:

  • mod-php - позволяет apache использовать скрипты PHP для генерации Web-страниц. Нужен для использования любых CMS на PHP.
  • mod-perl - позволяет apache использовать скрипты Perl для генерации Web-страниц.
  • mod-ssl - позволяет apache использовать протокол SSL
  • mod-dav - позволяет создать сервер WebDAV
  • mod-dav-svn - позволяет использовать Subversion через протокол WebDAV
  • mpd-chroot - позволяет использовать Apache в окружении chroot, что повышает безопасность сервера.
  • mod-auth-mysql - авторизация на сервере с записями учетных данных пользователей в MySQL. Модуль нужен, если доступ к ресурсу осуществляется напрямую, без использования CMS.
  • mod-auth-ldap - авторизация на сервере с записями учетных данных пользователей в базах LDAP (контроллере домена, например).
  • mod-vhost-mysql - позволяет создавать виртуальные хосты с хранением настроек и/или контента в MySQL.
  • mod-userdir - позволяет использовать специально сконфигурированные директории пользователей, с доступов вида http://example.com/~username/

На серверах с большой нагрузкой рекомендуется использовать модули mod-cache и другие.
Так же могут пригодиться следующие модули и программы: LibGD, PHP-GD, PHP-Exif, PHP-FFMPEG,

Ставим Apache из репозитория.
В Debain

Code: Ставим Apache
apt-get install apache2 apache2-common apache2-doc apache2-utils libapache2-mod-auth-mysql \
libapache2-mod-perl2 libapache2-mod-php5 mysql-server mysql-common php5-mysql php5-misqli \
php5-common php5-cli php5-gd

Настройка Apache

После установки сразу же настроен Apache на работу на стандартном (80) порту с Виртуальным Хостом для любого интерфейса, а так же большинство базовых модулей.

Рассмотрим поподробнее каталог, где хранятся настройки apache /etc/apache2

  • Каталог conf.d - здесь хранятся дополнительные настройки для различных подкаталогов сайта, применяемые ко всем настройкам сайтов.
  • Каталог mods-available - доступные для работы сервера модули.
  • Каталог mods-enabled - каталог с включенными модулями
  • Каталог sites-available - доступные настройки сайтов
    • Фвйл sites-available/default - настройки для сайтов доступных по протоколу http
    • Фвйл sites-available/default-ssl - настройки для сайтов доступных по протоколу https
  • Каталог sites-enabled - каталог с включенными настройками для сайтов
  • Файл apache2.conf - базовые настройки Apache
  • Файл httpd.conf - дополнительные настройки Apache
  • Файл ports.conf - настройки портов.

Рассмотрим файл с настройками сайтов

Файл: /etc/apache2/sites-available/default
<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        Alias /manual /usr/share/doc/apache2-doc/manual/
        <Directory "/usr/share/doc/apache2-doc/manual/">
            Options Indexes FollowSymlinks
            AllowOverride None
            Order allow,deny
            Allow from all
            AddDefaultCharset off
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Параметры настройки сайта

Файл .htaccess

Авторизация для доступа к содержимому сайта

Авторизация средствами HTTP

Затем в секцию <Directory /> файла /etc/apache2/sites-available/default прописать

Code: /etc/apache2/sites-available/default
## mod auth_mysql   
        AuthType Basic
        AuthName "Preved Medved"
        AuthUserFile /var/www/user.auth
        Require valid-user

Файл с логинами и паролями пользователей создается командой htpasswd

sudo htpasswd -cm /var/www/user.auth admin

Для добавления пользователя в

sudo htpasswd -m /var/www/user.auth user1

Параметры

  • AuthType : тип авторизации. Basic хранит пароли зашифрованные алгоритмом DES. Digest использует MD5.
  • AuthName : текстовое сообщение
  • AuthUserFile : полный путь к файлу с паролями
  • Require : определяет пользователей которые могут иметь доступ. valid-user все кто удачно ввели логин и пароль. Можно перечислить только конкретных пользователей и/или группы
  • AuthGroupFile : полный путь к файлу с информацией о группах

Авторизации по записям из MySQL

Для использования авторизации в Apache по записям в MySQL использоваться модуль auth_mysql.

Для начала нам необходимо установить пакет libapache2-mod-auth-mysql.

Code: Ставим libapache2-mod-auth-mysql
apt-get install libapache2-mod-auth-mysql

Затем в секцию <Directory /> файла /etc/apache2/sites-available/default прописать

Code: /etc/apache2/sites-available/default
## mod auth_mysql      
AuthBasicAuthoritative Off      
AuthMYSQL on      
AuthMySQL_Authoritative on      
AuthMySQL_DB httpauthdb      
Auth_MySQL_Host localhost      
Auth_MySQL_User httpauth      
Auth_MySQL_Password httpauthpassword      
AuthMySQL_Password_Table users      
AuthMySQL_Username_Field login      
AuthMySQL_Password_Field pass      
AuthMySQL_Empty_Passwords off      
AuthMySQL_Encryption_Types SHA1Sum      
# Standard auth stuff      
AuthType Basic      
AuthName "restricted zone"       
Require valid-user

Параметры

  • AuthBasicAuthoritative - Разрешает/запрещает авторизацию по файлу
  • AuthMYSQL on - включает расширение AuthMYSQL
  • AuthMySQL_Authoritative - Разрешает/запрещает авторизацию через MySQL
  • AuthMySQL_DB - имя базы данных с пользователями
  • Auth_MySQL_Host - сервер баз данных
  • Auth_MySQL_User - имя пользователя для доступа к БД
  • Auth_MySQL_Password - пароль для доступа к БД
  • AuthMySQL_Password_Table -имя таблицы, в которой записаны данные для аторизации
  • AuthMySQL_Username_Field - Имя столбца с логинами
  • AuthMySQL_Password_Field - Имя столбца с паролями
  • AuthMySQL_Empty_Passwords - Разрешает/запрещает пустые пароли
  • AuthMySQL_Encryption_Types - Тип шифрования паролей в БД: SHA1Sum/MD5/PHP_MD5/Plaintext Crypt_DEC

Настройка HTTPS

Настройка WebDAV

Повышаем безопасность сервера

Самое важное - своевременная установка обновлений. Особенно обновлений безопасности.

Разрешенные методы запроса

Для нормальной работы простого сайта достаточно методов GET и POST.
Что бы запретить остальные нужно в настройки сайта в секцию <Directory /> файла sites-available/default прописать

Code:
                <Limit GET POST>
                Order allow,deny
                Deny from all
                </Limit>
                <LimitExcept GET POST>
                Order allow,deny
                Deny from all
                </LimitExcept>

На работе WebDAV и и большинства CMS это никак не отразится.

Закрываемся от скан-ботов

Часто на сайт лезут всякие боты, сканирующие определенные сайт на наличие определенных уязвимых мест. От них можно закрыться, прописав в конфиге сервера или .htaccess

Code:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^Morfeus
RewriteRule ^.*$ - [F]

Все, прощай бот "Morfeus Fucking Scanner".

Настройки доступа к теоретически уязвимым местам

На любом сервере, где есть пользовательские или сервисные CMS, есть потенциально уязвимые места:

  • каталоги для загрузки файлов;
  • админки сайтов;
  • уязвимые пользовательские CMS;
  • уязвимые сервисные CMS;
  • другие.

Каталоги для загрузки файлов

Загрузка не всех типов файлов одинакова опасна.
Большую опасность из себя представляют скриптовые текстовые и исполняемые файлы. Пользователь может загрузить какой-нибудь php или, в лучшем случае, html файл и выполнить его на сервере.
Что бы этого избежать нужно в настройку сервера внести данный каталог с указанием для сервера воспринимать любые php и html файлы в каталоге как просто текстовые и выдавать их пользователю в том же самом виде без исполнения. Так же нужно запретить серверу читать в этом каталоге любой файл вида .htaccess.

Code:
<Directory "/var/www/cms/upload/">
    AllowOverride None
    AddType text/plain .html .htm .shtml .php
    php_admin_flag engine off
</Directory>

Что бы запретить серверу исполнять там любые файлы, то нужно в настройках CMS или скртипта загрузки выставить маску для файлов 600.

Защищаем админки

Велика вероятность, что админка CMS содержит незакрытую уязвимость, которую потенциальный хакер сможет использовать.
Нужно как-то обезопасить себя от этого.

Для этого придуман очень хороший инструмент - контроль доступа по IP. Так же можно прикрутить дополнительную авторизацию для доступа к каталогу. В файл ./htaccess (он должен быть разрешен как в конфиге сервера, так и не запрещен в ./htaccess родительских каталогов) пишем следующее:

Code: ./htaccess
Order Deny,Allow
Deny from all
Allow from XXX.XXX.XXX.XXX, myhost.org, YYY.YYY.YYY.0, localhsots
AuthName "Please log in to access the admin panel."
AuthType Basic
AuthUserFile /var/www/cms/admin/.htpasswd
require valid-user

Итак, мы разрешили доступ с хоста с IP XXX.XXX.XXX.XXX, с хоста, чье доменное имя "myhost.org", c хостов из подсети YYY.YYY.YYY.0 и локально. При этом пользователь должен еще и авторизоваться на сервере (но еще не в CMS).

Так же полезно для безопасности перенести админку, по возможности (не все CMS это перенесут безболезненно), в какой-нибудь другой каталог. Для примера: <site>/my_door/admin/ вместо <site>/admin/.

Защищаем сервисные CMS

Достаточно часто хакеры разыскивают сервисные CMS, такие как PhpMyAdmin. В логах часто можно увидеть, что некто ищет PhpMyAdmin под разными именами: /phpmyadmin, /myadmin, phpadmin и т.п.
Да, можно отказаться от них и все делать вручную. Но проще спрятать такую CMS за "диким" альясом, который хакер просто не будет подбирать. Например так

Code:

Alias /sim-saljabim/ahalay-mahalay/phpmyadmin/mne_skoree_davay /usr/loale/share/phpmyadmin

Ну и не помешает использовать еще и контроль доступа по IP и дополнительную авторизацию на сервере.