apache
21.01.2010
сайт автора: http://webi.ru
публикация данной статьи разрешена только со ссылкой на сайт автора статьи
Внимание!
Настройки apache установленного под windows или под другой операционной системой одинаковые. Отличие только в путях к файлам и в некоторых специфических настройках.
Поэтому эти настройки подойдут для апача установленного под freebsd, linux, и т.д.
В этой статье я затрону не все, а наиболее важные настройки apache установленного под windows. Это минимум, который необходим для запуска нового сервера.
В предыдущей статье я рассказал как быстро установить apache на windows с помощью xampp и эта статья является ее продолжением.
Если вы устанавливали apache по другой схеме, то у вас могут отличаться пути к файлам настроек, но сами настройки будут такие же.
Если вы еще не установили apache, советую вам установить его как рассказано в этой статье (Как установить сервер apache дома под windows).
Все настройки apache как правило сконцентрированы в одном файле httpd.conf, но в случае установки с помощью xampp, конфигов становится больше, где они лежат я буду указывать.
1. Скрываем лишнюю информацию.
По умолчанию сервер выдает слишком много информации, просто сливает нужную информацию хаккерам.
Например в заголовках сервера, а так же при выводе стандартных служебных страниц типа 404 можно видеть подобное
Apache/2.2.12 (Win32) DAV/2 mod_ssl/2.2.12 OpenSSL/0.9.8k mod_autoindex_color PHP/5.3.0 mod_perl/2.0.4 Perl/v5.10.0
То есть абсолютно любой прохожий знает какой версии стоит апач, какая операционка, какие модули и т.д.
Всю эту информацию не стоит всем светить, особенно когда сервер стоит под windows.
Если вы устанавливали apache с помощью xampp, тогда открывайте файл конфига
/xampp/apache/conf/extra/httpd-default.conf
(если нет такого файла, открывайте файл httpd.conf)
здесь находите команду «ServerTokens«, это и есть объем показываемой информации о сервере.
Меняем значение на такое ServerTokens Prod.
В этом случае светится будет только название сервера.
Кроме этого заголовка сервер выдает еще один не приятный заголовок
X-Powered-By:
Этот заголовок появляется когда информация выводится с помощью PHP скрипта.
Если запросить статический html документ, то этого заголовка не будет, но если информацию на страницу выведет PHP скрипт, то в этом заголовке будет подобное
X-Powered-By: PHP/5.2.5
То есть заголовок объясняет всем, что страница создана с помощью PHP и показывает версию PHP.
Даже если вы используете mod rewrite и обращаетесь к страницам как к статическим документам, то этот заголовок все равно расскажет всем, что страница создана с помощью PHP.
Лучше всего убрать этот заголовок. Полезно, если вы хотите замаскировать свой сайт под полностью статический, ну и хулиганы лишний раз не узнают версию PHP.
Для этого потребуется конфиг php.ini
Обычно он лежит в папке php, но может быть и в других местах, да еще и в нескольких экземплярах.
Чтобы точно найти нужный php.ini, выполните phpinfo(); в скрипте и найдите параметр Loaded Configuration File, тут и будет путь до конфига php.
Открываем php.ini и находим
expose_php = on
меняйте значение на off
2. Листинг директории.
Если в директории нет индексного файла, то по умолчанию сервер покажет список всех файлов и директорий.
Во многих случаях этого делать не нужно, зачем всем показывать, что лежит в вашей папке.
Чтобы запретить листинг директорий открываем файл
/xampp/apache/conf/httpd.conf
Внутри тега <Directory «/xampp/htdocs»> должен быть Options с различными параметрами. Среди этих параметров должен быть Indexes, вот именно Indexes удалите.
Теперь при попытке просмотреть директорию без индексного файла будет получена ошибка 403.
3. Типы файлов (MIME types)
Когда с сервера запрашивается какой-либо файл, apache прежде выясняет какой тип имеет этот файл (картинка, текстовый файл, архив, и т.д.). После этого сервер посылает заголовок, в котором указано какой тип файла сейчас будет отдан. Браузер получает этот заголовок и на основании него решает, что делать с этим файлом.
До недавнего времени по умолчанию в apache отсутствовал тип файлов RAR, всем известный архив. И если вы разместите на своем сайте файл rar, то например браузер OPERA вместо скачивания этого файла начнет открывать его в браузере как текстовый файл и будут видны непонятные символы. Чтобы этого не было, нужно добавить на сервер тип файлов RAR.
Если установку делали через XAMPP, то настройки типов файлов тут
/xampp/apache/conf/mime.types
Нужно добавить строку
application/x-rar-compressed rar
Но прежде убедитесь, что этот тип еще не прописан, так как в последней версии XAMPP он уже присутствует.
4. Виртуальные хосты, дополнительные домены.
После установки сервера вам доступен только один локальный домен localhost.
С помощью настройки виртуальных хостов можно разместить на вашем сервере сколько угодно сайтов с разными доменами или поддоменами, все зависит от ресурсов вашего компьютера.
Вам потребуется файл
/xampp/apache/conf/extra/httpd-vhosts.conf
У кого нет этого файла, можно редактировать в основном конфиге.
Начало работы с виртуальными хостами начинается так
NameVirtualHost *:80
После этого можно указывать параметры хостов(сайтов)
<VirtualHost *:80>
# настройки первого сайта
</VirtualHost>
<VirtualHost *:80>
# настройки второго сайта
</VirtualHost>
<VirtualHost *:80>
#настройки третьего сайта
</VirtualHost>
Обязательно, первый описанный хост должен быть localhost, после него можно начинать указывать настройки других хостов, иначе при определенных настройках сервера ваши виртуальные хосты могут не правильно обрабатываться и возникнет путаница между ними.
Вот пример минимальных настроек на примере организации трех хостов
NameVirtualHost *:80
<VirtualHost *:80>
ServerName localhost
DocumentRoot c:/xampp/htdocs/localhost/www
ServerAdmin adm@webi.ru
</VirtualHost>
<VirtualHost *:80>
ServerName webi.ru
ServerAlias www.webi.ru
DocumentRoot c:/xampp/htdocs/webi.ru/www
ServerAdmin adm@webi.ru
</VirtualHost>
<VirtualHost *:80>
ServerName php-manual.webi.ru
ServerAlias www.php-manual.webi.ru
DocumentRoot c:/xampp/htdocs/php-manual.webi.ru/www
ServerAdmin adm@webi.ru
</VirtualHost>
ServerName localhost
Указывает, что название домена localhost
DocumentRoot c:/xampp/htdocs/localhost/www
Указывает на место в котором хранятся файлы сайта.
Можно указывать без использование буквы диска /xampp/htdocs/localhost/www
Хранить файлы сайта можно в любом месте, но для удобства, лучше хранить их там же, где установлен сервер.
ServerAdmin adm@webi.ru
Указывает email админа этого сайта.
Например при определенных настройках этот email может быть виден при возникновении ошибок сервера или сайта.
Во втором хосте все тоже самое, только добавлен еще один параметр
ServerAlias www.webi.ru
Это хост, являющийся зеркалом основного хоста.
Можно перечислить несколько зеркал, и все они будут иметь такие же параметры как основной хост и в конкретном случае при наборе адреса сайта хоть с www, хоть без wwww, будет обработан основной хост webi.ru.
А третий хост, это пример настроек поддомена от домена webi.ru.
Как видно, настройки поддомена ничем не отличаются от настроек доменов.
Этих настроек хостов вполне хватит, чтобы домены и сайты нормально функционировали, но можно это все не много улучшить.
Например, скрипты любого из этих сайтов имеют доступ ко всем файлам и папкам всего компьютера.
Любой скрипт может случайно или намеренно удалить любые файлы с вашего компьютера, т.к. ничто не ограничивает зону действия этого скрипта.
Чтобы дать ограничение существует такая команда
<Directory c:/xampp/htdocs/webi.ru> # директория из которой работает скрипт
php_admin_value open_basedir "c:/xampp/htdocs/webi.ru/" # доступ скриптов к папке
</Directory>
В данном примере PHP скрипты не будут выходить за пределы указанной директории.
Если хотите указать несколько директорий, к которым могут получать доступ скрипты из указанной директории, разделяйте их ‘;‘, например
php_admin_value open_basedir «c:/xampp/htdocs/webi.ru/;c:/xampp/htdocs/asd/»
Обратите внимание, пробела между путями нет, все пути перечисляются слитно, разделяются лишь точкой с запятой (;).
А можете даже запретить использование PHP скриптов в определенной директории таким образом
<Directory c:/xampp/htdocs/webi.ru>
php_admin_value engine off
</Directory>
Можете еще указать место хранения логов, чтобы логи каждого сайта хранились в своем месте.
Лог ошибок и лог доступа к сайту
ErrorLog «c:/xampp/htdocs/webi.ru/log/error_log.txt»
CustomLog «c:/xampp/htdocs/webi.ru/log/access_log.txt» combined
И вот пример виртуального хоста из всех вышеперечисленных пунктов
<VirtualHost *:80>
ServerName webi.ru
ServerAlias www.webi.ru
DocumentRoot c:/xampp/htdocs/webi.ru/www
ServerAdmin adm@webi.ru
<Directory c:/xampp/htdocs/webi.ru>
php_admin_value open_basedir "c:/xampp/htdocs/webi.ru/"
</Directory>
ErrorLog "c:/xampp/htdocs/webi.ru/log/error_log.txt"
CustomLog "c:/xampp/htdocs/webi.ru/log/access_log.txt" combined
</VirtualHost>
После
настройки своих хостов вам нужно будет прописать в зонах ДНС эти домены и направить их все на ip вашего сервера.
Если не знаете как настроить ДНС, читайте о настройке бесплатного ДНС сервера.
5. Как создавать локальные поддомены.
Если вы используете сервер для тестирования и вам нужно создавать локальные домены или поддомены, то после настройки виртуального хоста нужно прописать этот домен локальным в файле
C:/WINDOWS/system32/drivers/etc/hosts
В этом файле прописывайте нужный домен на локальный IP
По умолчанию там прописано 127.0.0.1 localhost
Добавьте к этой записе еще нужные домены, например
127.0.0.1 localhost
127.0.0.1 asd.ru
127.0.0.1 asd.localhost
Если вы прописали эти домены в виртуальных хостах, то теперь при посещении этих сайтов вы будете попадать на свой сервер, даже если пропишите любые домены.
6. Псевдонимы.
По умолчанию, после установки сервера с помощью xampp установлены некоторые стандартные псевдонимы.
Например, если набрать в браузере http://localhost/phpmyadmin, то вы попадете в phpmyadmin, не смотря на то, что в папке отведенной для скриптов нет phpmyadmin.
phpmyadmin будет доступен из под любого домена http://домен/phpmyadmin
Такая опция задается с помощью псевдонимов в настройке apache.
Для xampp это находится в файле /xampp/apache/conf/extra/httpd-xampp.conf,
если устанавливали сервер иначе, то редактировать можно основной конфиг apache.
В этом файле можно видеть такие строки
Alias /phpmyadmin «/xampp/phpMyAdmin/»
или
Alias /webalizer «/xampp/webalizer/»
Это и есть псевдонимы. Именно эти команды указывают серверу обрабатывать запросы и перенаправлять их в другие директории.
Например если запрашивается http://localhost/phpmyadmin, то в данном примере запрос к phpmyadmin будет перенаправлен в директорию /xampp/phpMyAdmin/, которая находится за пределами директории со скриптами.
И срабатывать это будет для любого домена.
Так как подобные псевдонимы используются всегда и всеми, то их естественно знают все хулиганы и когда вы откроете сервер для всех, то все эти псевдонимы будут щупать на уязвимости.
Поэтому, как минимум, лучше переименовать их, а как максимум вообще удалить и псевдонимы прописать в виртуальных хостах, для каждого хоста свой псевдоним.
Например так
<VirtualHost *:80>
ServerAdmin adm@webi.ru
DocumentRoot C:/xampp/htdocs/localhost/www
ServerName localhost
ServerAlias www.localhost
Alias /phpmyadmin123 "C:/xampp/phpMyAdmin/"
<Directory C:/xampp/htdocs/localhost>
php_admin_value open_basedir "C:/xampp/htdocs/localhost/;C:/xampp/phpmyadmin/"
</Directory>
</VirtualHost>
Обратите внимание, защита выхода скриптов за пределы директории php_admin_value open_basedir содержит еще путь до папки phpmyadmin, иначе если к нему не будет доступа, то он и работать не будет.
И еще можете заметить, что вызов phpmyadmin происходит через phpmyadmin123, чтобы не сразу могли найти.
В последних версиях xampp доступ к административным скриптам возможен только при локальном входе, внешний доступ закрыт, phpmyadmin тоже доступен только локально.
Если хотите открыть внешний доступ для phpmyadmin или другим стандартным скриптам, опять смотрим файл
/xampp/apache/conf/extra/httpd-xampp.conf
Тут есть подобная конструкция
<LocationMatch "^/(?i:(?:xampp|security|licenses|phpmyadmin|webalizer|server-status|server-info))">
.....
</LocationMatch>
Эта конструкция и запрещает доступ снаружи, конечно сам запрет находится внутри этой конструкции, но если вам нужно открыть внешний доступ например для phpmyadmin, то просто удалите его из этого списка.
Комментарии
RSS комментарии
20.12.2010 Денис
Спасибо большое!!!
Мучался неделю с denwerom не мо вывести в интернет, а с вашими статьями вывел серв в интернет да еще и настроил! Спасибо большое!
Еслу у вас есть вебмони скажите свой WMR
Мой icq: <удалено>
20.12.2010 админ
Денис, спасибо за предложение, но для подобных благодарностей я планирую предусмотреть специальный раздел, в котором будут все мои реквизиты и любой желающий сможет поблагодарить любым удобным для себя способом.
Будьте внимательны, я не даю вам свой WMR, поэтому если кто-то здесь напишет свой WMR, это не я.
По этой же причине я удалил ваш номер аськи, чтобы никто не выдал себя за меня.
03.01.2011 Алексей
Спасибо за статью!
Очень все понятно и доходчиво объяснили.
Будут вопросы-первым делом загляну сюда!
28.01.2011 Никита
Не подскажете пожалуйста как настроить апач. Ситуация такая.
Нужно при обращении к серверу по ip 192.168.0.1/images
Сделать так чтобы апач выдавал картинки с сетевого диска, так как хранилище картинок расположено на другом сервере.
ОС Windows
28.01.2011 сергей
Никита, ну а в виртуальных серверах если добавить алиас?
Alias /images «F:/ase/kkfd/»
В данном случае при обращении к папке images будет обращение к F:/ase/kkfd/
30.01.2011 Никита
Проблема в том что нужно чтобы папка была доступна всем ПК в сети
31.01.2011 сергей
Никита, ну так а почему она не доступна то?
она вроде бы и будет доступна, если алиас прописать.
разве нет?
06.02.2011 Никита
Проблему решил так.
Немного перенастроил DNS сервер в сети — Добавил запись CNAME.
Была еще проблема Apache не стартовал когда был указан сетевой диск. Проблему решал подключением сетевого диска под учетной записью system.
Осталась одна проблемка. Сетевой диск по видимому подключается после запуска службы Apache. Поэтому приходится стартовать Apache вручную. Пробовал ставить запуск bat-ника при неудачном запуске Apachа а потом перезапуск службы. Не помогает.
Может быть есть еще какое решение.
07.02.2011 Сергей
Никита, а не пробовал запускать апача не как службу? Например просто кинуть его в автозагрузку, в этом случае он должен стартануть позже.
17.02.2011 олег
БОЛЬШОЕ спасибо за статью. Как для начинающего, для меня она важна. Думаю злодеям теперь не так легко будет. Такую информацию вообще надо на подобных сайты на главных страницах размещать.
27.02.2011 Виталий
после записи в файл конфигурации хостов
NameVirtualHost *:80
<VirtualHost *:80>
ServerName localhost
DocumentRoot c:/xampp/htdocs/localhost/www
ServerAdmin adm@baby48.ru
</VirtualHost>
<VirtualHost *:80>
ServerName baby48.ru
ServerAlias www.baby48.ru
DocumentRoot c:/xampp/htdocs/baby48.ru/www
ServerAdmin adm@baby48.ru
</VirtualHost>
при попытке войти на сервер выдает ошибку Access forbidden!Error 403
помогите разобраться что я делаю не так . заранее спасибо
27.02.2011 админ
Виталий, может у вас в папке нет индексного файла? (index.php, index.html)
28.02.2011 Виталий
у меня получилась конструкция без NameVirtualHost *:80
во всем остальном вам спасибо все работает .Да и еще вот в файле hosts сделал запись
127.0.0.1 www.domen.ru
127.0.0.1 www.forum.domen.ru
будем следить за новостями на webi.ru
01.03.2011 Ruby
в файле httpd.conf я нигде не мог найти это словосочетание- ServerTokens, теперь думаю как всё будет «высвечиватся»…
02.03.2011 Саня
админ респект те большой за твои статьи!
Но я столкнулся с такой проблемкой листинга: удаляю Indexes а он востанавливается после перезапуска серва! сам я лол в етой теме и ето мой первый серв.
Решил проблему пока так: создал фаил .htaccess с содержимым: Options -Indexes
02.03.2011 админ
Ruby, проверьте все конфиги, возможно в каком то другом файле есть ServerTokens.
если не найдете, добавьте сами.
02.03.2011 админ
Саня, попробуйте поискать Indexes в других конфигах, может где то еще упоминается.
Однажды у меня была проблема с одной программой, которая при старте сбрасывала конфиг и переписывала его параметрами по умолчанию.
Ничего не мог сделать, тогда я просто выставил на файл конфига разрешения только на чтение, после этого конфиг не перезаписывался, может вам так же попробовать?
03.03.2011 Саня
в процесе прогулки по сайтам наткнулся на такой вот блок:
Программа: XAMPP for Windows
Уязвимость позволяет локальному злоумышленнику выполнить вредоносные действия с повышенными привилегиями на целевой системе. Уязвимость существует из-за ошибки в проверке входных данных. Атакующий может передать специально сформированные данные, что приведет к выполнению произвольного кода с привилегиями администратора.
и как ето устранить?
зарание спасибо
03.03.2011 админ
Саня, но тут говорится что то про локального злоумышленника, возможно про того, кто входит в ваш компьютер под другим юзером, но не того, кто из инета стучится.
И потом не совсем понятно, что тут имеется в виду, как сам xampp имеет к этому отношение, ведь xampp это только установщик сервера, а после установки xampp уже не работает.
08.03.2011 Сергей
а почему когда я ввожу ip своего компа,ничего не происходит в отличии от 127.0.0.1 ?
Добавить свой комментарий
Введение
Apache — кроссплатформенный HTTP-сервер, который был создан с учетом ошибок старого web-сервера NCSA HTTPd. На данный момент стабильная версия имеет номер 2.4.63. Основные достоинства Apache — кроссплатформенность и модульная система, позволяющая оптимизировать программное обеспечения для нужд конкретной разработки.
В этой статье рассмотрим установку HTTP-сервера Apache на операционную систему (ОС) Ubuntu. В рамках этой публикации используется релиз Ubuntu 20.04 server и web-сервер Apache версии 2. Система развернута в облачной платформе Selectel. Для тестового сервера используется минимальная конфигурация мощностей — 1 ядро и 1 ГБ оперативной памяти. Для запуска простого ненагруженного приложения этого достаточно.
Настроить виртуальный сервер
Откройте панель управления Selectel и перейдите в раздел Облачная платформа. Нажмите Создать сервер.
Используем минимальную конфигурацию. Не забудьте добавить SSH-ключ, для Ubuntu 24.04 это обязательный шаг.
После создания сервера в панели можно будет посмотреть его IP-адрес.
Теперь можем подключиться к нему по SSH.
Самым простым способом подключения является использование утилиты PuTTY. Эта утилита является кроссплатформенной. Скачать ее можно с официального сайта https://www.chiark.greenend.org.uk/~sgtatham/putty/.
Для подключения в поле Host Name (or IP address) вводим полученный ранее ip-адрес, остальные опции оставляем без изменений.
После нажатия кнопки Open эмулятор терминала произведет подключение к серверу. Потребуется ввести комбинацию логин/пароль. На первоначальном этапе используем логин root и пароль, полученные на этапе создания сервера.
login as: root
root@xx.xx.xx.178's password:
Welcome to Ubuntu 24.04.1 LTS (GNU/Linux 6.8.0-51-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
Expanded Security Maintenance for Applications is not enabled.
0 updates can be applied immediately.
Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
root@kassie:~#
Установить Apache
При установке и конфигурации будет использован пользователь, отличный от root, но с правами администратора. Для большинства операций требуются привилегии суперпользователя.
Чтобы повысить привилегии обычного пользователя, используется команда sudo. Первоначально необходимо загрузить информацию об актуальных списках пакетов и зависимостях.
sudo apt update
После этой операции произведем установку пакета Apache2, он располагается в стандартном репозитории, дополнительные добавлять не нужно.
sudo apt install apache2
По окончании демон запускается автоматически, а также попадает в автозагрузку.
Настроить брандмауэр для Apache
Рекомендуем в Ubuntu использовать ufw. Uncomplicated Firewall — утилита для настройки межсетевого экрана. Если настройка происходит на виртуальном сервере, желательно проверить наличие установленной утилиты.
sudo ufw status verbose
В случае отсутствия ее в списке установленных пакетов появится ошибка:
sudo: ufw: command not found
Тогда ее необходимо установить:
sudo apt install ufw
Заново запросим ее статус:
Status: inactive
Это означает, что она деактивирована. Активируем:
sudo ufw enable
Разрешаем HTTP на сервере:
sudo ufw allow http
Очень важно в этом моменте разрешить SSH-доступ. На тестовом сервере SSH на стандартном порту 22.
sudo ufw allow 22/tcp
Обязательно перезапустить процесс:
sudo ufw reload
Проверить базовую настройку Apache
На данный момент сервер доступен из интернета по HTTP. Можно проверить это в браузере по ip-адресу в поисковой строке. Ip-адрес мы уже получили в панели управления сервером.
Появившееся приветствие означает успешную начальную настройку Apache-сервера.
Как запустить Apache и другие полезные команды
В этом разделе будут собраны базовые команды для управления Apache web-сервером. Несмотря на то, что демон запускается самостоятельно, иногда необходимо выключить его или перечитать конфигурацию.
Проверить статуса демона Apache:
sudo systemctl status apache2
В выводе будет указан текущий статус. Возможны два варианта.
Активен:
apache2.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/apache2.service; enabled; preset: enabled)
Active: active (running) since Fri 2025-01-24 10:48:52 UTC; 9min ago
Docs: https://httpd.apache.org/docs/2.4/
Main PID: 1924 (apache2)
Tasks: 55 (limit: 1119)
Memory: 6.3M (peak: 6.5M)
CPU: 66ms
CGroup: /system.slice/apache2.service
├─1924 /usr/sbin/apache2 -k start
├─1927 /usr/sbin/apache2 -k start
└─1928 /usr/sbin/apache2 -k start
Неактивен:
apache2.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/apache2.service; enabled; preset: enabled)
Active: inactive (dead) since Fri 2025-01-24 10:58:38 UTC; 1s ago
Duration: 9min 45.788s
Docs: https://httpd.apache.org/docs/2.4/
Process: 3709 ExecStop=/usr/sbin/apachectl graceful-stop (code=exited, status=0/SUCCESS)
Main PID: 1924 (code=exited, status=0/SUCCESS)
CPU: 83ms
Иногда возникает ошибка.
apache2.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/apache2.service; enabled; preset: enabled)
Active: failed (Result: exit-code) since Fri 2025-01-24 11:01:08 UTC; 2s ago
Duration: 9min 45.788s
Docs: https://httpd.apache.org/docs/2.4/
Process: 3732 ExecStart=/usr/sbin/apachectl start (code=exited, status=1/FAILURE)
CPU: 10ms
Jan 24 11:01:08 kassie systemd[1]: Starting apache2.service - The Apache HTTP Server...
Jan 24 11:01:08 kassie apachectl[3734]: AH00526: Syntax error on line 13 of /etc/apache2/sites-enabled/000-default.conf:
Jan 24 11:01:08 kassie apachectl[3734]: Invalid command 'meow', perhaps misspelled or defined by a module not included in the server configuration
Чтобы выйти в консоль из статуса, необходимо использовать клавишу q или комбинацию клавиш Ctrl+С.
Для деактивации:
sudo systemctl stop apache2
Для активации:
sudo systemctl start apache2
Перезапуск:
sudo systemctl restart apache2
При изменении конфигурации Apache возможно ее перечитать без разрыва текущей сессии с хостов:
sudo systemctl reload apache2
Чтобы деактивировать запуск web-сервера при загрузке:
sudo systemctl disable apache2
Активировать автозагрузку:
sudo systemctl enable apache2
Настроить виртуальные хосты Apache
Можно использовать веб-сервер Apache для поддержки одного web-приложения. Но достаточно часто приходится на одном сервере создавать и обслуживать несколько web-ресурсов. В Apache для этих целей используется модуль виртуальных хостов. Он позволяет развернуть несколько web-приложений на одном сервере с использованием одного ip-адреса, но разных доменных имен. Про теорию доменных имен есть хорошие статьи и книги, например, статья о DNS-сервере BIND и книга Крикета Ли, Пола Альбитц «DNS и BIND». Об управлении доменами и ресурсными записями написали в базе знаний Selectel.
Перейдем к настройке виртуального хоста.
В Ubuntu конфигурации виртуальных хостов расположены в директории /etc/apache2/sites-available. Нам необходимо получить директорию для виртуального хоста по умолчанию. Получим root-директорию из файла дефолтной конфигурации:
grep "DocumentRoot" /etc/apache2/sites-available/000-default.conf
Вывод:
DocumentRoot /var/www/html
Создадим новые необходимые директории, не меняя корневой.
sudo mkdir -p /var/www/example.com/html
В стандартном исполнении Apache ищет документ index.htm или index.html
Создадим простой html5-документ:
sudo touch /var/www/example.com/html/index.html
Добавим небольшую структуру документа, открыв его в текстовом редакторе:
sudo nano /var/www/example.com/html/index.html
Вставляем в файл.
<!DOCTYPE html>
<html>
<head>
<title>Hello</title>
<meta charset="utf-8">
</head>
<body>
<h1>Hello Selectel!</h1>
</body>
</html>
Чтобы оставить дефолтную конфигурацию виртуального хоста неизменной, копируем его в созданную ранее директорию настроек нового виртуального хоста.
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/example.com.conf
Теперь откроем скопированный файл, рассмотрим основные директивы и внесем необходимые правки. На данном этапе нам будет интересна только строка, в которой указан путь к директории виртуального хоста. Меняем его на путь к директории, созданной специально для него. Чтобы при обращении Аpache мог перенаправить запрос именно к созданному нами виртуальному хосту.
sudo nano /etc/apache2/sites-available/example.com.conf
Файл дефолтного виртуального хоста:
<VirtualHost *:80> # The ServerName directive sets the request scheme, hostname and port that # the server uses to identify itself. This is used when creating # redirection URLs. In the context of virtual hosts, the ServerName # specifies what hostname must appear in the request's Host: header to # match this virtual host. For the default virtual host (this file) this # value is not decisive as it is used as a last resort host regardless. # However, you must set it for any further virtual host explicitly. #ServerName www.example.com ServerAdmin webmaster@localhost DocumentRoot /var/www/html # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf</VirtualHost>
<VirtualHost *:80> — в этой строке указываем ip-адрес сервера, а также порт, используемый для этого виртуального хоста. На данный момент мы используем HTTP и один ip-адрес. В связи с этим номер порта 80, адрес не указываем. Настройка HTTPS будет описана ниже.
ServerAdmin webmaster@localhost — строка связи с администратором, необходимо указать активный почтовый адрес отвечающего за обслуживание сервера специалиста. Опционально. Добавим адрес, по которому всегда придут на помощь support@selectel.ru.
DocumentRoot /var/www/html — root-директория или корневой каталог виртуального хоста. Обязательна к применению и настройке. В нашем случае это путь к созданной ранее директории с документом index.html. Вносим изменения:
/var/www/example.com/html
ErrorLog ${APACHE_LOG_DIR}/error.log — путь к файлу с логами сервера. Вносить какие-либо изменения нет необходимости. Здесь будут храниться ошибки запуска демона и ошибки, не относящиеся к клиентам.
CustomLog ${APACHE_LOG_DIR}/access.log combined — это директива для хранения логов клиентского доступа.
Редактирование файла на этом завершается. Это минимальная конфигурация для запуска виртуального хоста на Apache web-сервере. Изменять конфигурацию далее на данном этапе нет необходимости.
Сохраняем и выходим из редактора. Для сохранения используется комбинация Ctrl+o, для выхода Ctrl+x.
Файл с готовой конфигурацией:
<VirtualHost *:80> # The ServerName directive sets the request scheme, hostname and port that # the server uses to identify itself. This is used when creating # redirection URLs. In the context of virtual hosts, the ServerName # specifies what hostname must appear in the request's Host: header to # match this virtual host. For the default virtual host (this file) this # value is not decisive as it is used as a last resort host regardless. # However, you must set it for any further virtual host explicitly. #ServerName www.example.com ServerAdmin support@selectel.ru DocumentRoot /var/www/example.com/html # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf</VirtualHost>
Для подключения виртуальных хостов, а также модулей в Apache HTTP-сервере используется набор команд:
a2enmod {модуль} — подключение модуля;
a2dismod {модуль} — отключение модуля;
a2ensite {конфиг виртуального хоста} — подключает виртуальный хост;
a2dissite {конфиг виртуального хоста} — отключает виртуальный хост.
Нам потребуется a2ensite для активации созданного хоста:
sudo a2ensite example.com.conf
И a2dissite для деактивации дефолтного:
sudo a2dissite 000-default.conf
После внесенных изменений требуется перечитать конфигурацию сервера:
sudo systemctl reload apache2
Теперь мы можем обратиться с созданному виртуальному хосту по доменному имени.
В этой инструкции мы не используем dns, поэтому для разрешения имени используем файл hosts.
В windows этот файл расположен здесь: C:\Windows\System32\drivers\etc\hosts.
А в linux/mac: /etc/hosts.
Добавим строчку: 94.0.0.0 example.com.
Где 94.0.0.0 — ранее полученный ip-адрес сервера, а example.com — доменное имя виртуального хоста.
Теперь перейдем в браузер и в адресной строке наберем: example.com.
Получим созданное web-приложение:
SSL для Apache
TLS (transport layer security — протокол защиты транспортного уровня) и предыдущая версия защиты SSL (secure sockets layer — слой защищенных сокетов). Это все протоколы криптографии, созданные для защиты передачи данных между узлами в информационной сети.
Оба протокола используют асимметричное шифрование для аутентификации, симметричное шифрование для конфиденциальности и коды аутентичности сообщений. Подробно останавливаться на теории сейчас нет необходимости. На первоначальном этапе достаточно быть в курсе, что эти протоколы отвечают за сохранность конфиденциальности данных в момент обмена данными между клиентом и сервером. Ключи могут быть самозаверяющими, т.е. созданными и подписанными самим web-сервером.
Такие ключи подходят для использования протокола HTTPS и шифрования данных, но не являются доверенными для сети интернет. Также сертификаты бывают выданными центрами сертификации. Они не только шифруют данные, но также web-браузер знает о таком ключе и доверяет ему по-умолчанию. В таком случае сертификаты платные, но имеется возможность использования бесплатного сервиса Let`s encrypt. С использованием сервиса можно создать и заверить ключ.
В этом случае сертификат будет действительным для сети интернет, но бесплатным. В этой инструкции будет настроено простое шифрование с использованием самозаверяющего ключа, созданного на сервере Apache.
Создать SSL-сертификат на сервере
Чтобы создать и подписать сертификат, потребуется пакет OpenSSL. Он есть в системе, не нужно устанавливать. Сейчас будет создан и подписан сертификат, а также закрытый и открытый ключи будут перемещены в необходимые директории.
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/server-example.key -out /etc/ssl/certs/server-example.crt
Расшифровка опций из команды:
req -x509 — опция определения стандарта сертификата (-x509 стандарт инфраструктуры открытого ключа).
-nodes — отказаться от защиты сертификата паролем. Если убрать эту опцию, произойдет запрос пароля для ключа, который необходимо вводить при каждом запуске web-сервера (желательно использовать в продакшене).
-days 365 — срок действия сертификата. Обычно срок устанавливается более длительный, но для тестового сервера достаточно. Также необходимо учитывать, что на web-сервере время и дата должны быть верными.
-newkey rsa:2048 — опция указывает на создание нового сертификата и ключа единовременно. Часть rsa:2048 обозначает размер ключа.
-keyout /etc/ssl/private/server-sample.key — обозначает директорию, в которую необходимо поместить закрытый ключ.
-out /etc/ssl/certs/server-sample.crt- — директория местоположения сертификата.
server-sample.key и server-sample.crt — имена ключа и сертификата.
После ввода команды потребуется ответить на некоторые вопросы, разберем список директив:
Country Name (2 letter code) [AU]:RU — указываем страну.
State or Province Name (full name) [Some-State]:LIP — область.
Locality Name (eg, city) []:Lipetsk — город.
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Sel — организацию.
Organizational Unit Name (eg, section) []:Sel — отдел.
Common Name (e.g. server FQDN or YOUR name) []:94.255.255.255 — вводим доменное имя или белый адрес сервера.
Email Address []: — адрес для связи с владельцем ключа. Можно оставить пустым или заполнить почту, аналогичную ServerAdmin в конфигурации веб-сервера.
После выполнения операции требуется подключение модуля SSL для Apache HTTP-сервера. Ранее были разобраны команды для этого действия. Вот так выглядит необходимая:
sudo a2enmod ssl
После включения модуля необходимо перезапустить демона Apache.
Переходим к настройке HTTPS для виртуального хоста. Вносим изменения в файл его настройки.
sudo nano /etc/apache2/sites-available/example.com.conf
Во-первых, меняем директиву <VirtualHost *:80>.
Порт изменится на 443 (порт для протокола HTTPS по умолчанию).
Добавляем директиву SSLEngine on после строки DocumentRoot для включения поддержки SSL на web-сервере.
После этого еще две строки, в которых указан путь к ключу и сертификату:
SSLCertificateFile /etc/ssl/certs/server-example.crt
SSLCertificateKeyFile /etc/ssl/private/server-example.key
Теперь файл конфигурации виртуального хоста выглядит следующим образом:
<VirtualHost *:443> # The ServerName directive sets the request scheme, hostname and port that # the server uses to identify itself. This is used when creating # redirection URLs. In the context of virtual hosts, the ServerName # specifies what hostname must appear in the request's Host: header to # match this virtual host. For the default virtual host (this file) this # value is not decisive as it is used as a last resort host regardless. # However, you must set it for any further virtual host explicitly. #ServerName www.example.com ServerAdmin support@selectel.ru DocumentRoot /var/www/example.com/html SSLEngine on SSLCertificateFile /etc/ssl/certs/server-example.crt SSLCertificateKeyFile /etc/ssl/private/server-example.key # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf</VirtualHost>
Перед проверкой по web добавим разрешающее правило безопасности:
sudo ufw allow https
А также перечитаем конфигурацию web-сервера Apache:
sudo systemctl reload apache2
Теперь при запросе сервера по HTTPS:example.com браузер выдаст оповещение о небезопасном сертификате. Проигнорировав его, будет отображено созданное ранее web-приложение.
На этом настройка SSL закончена.
Конфигурационные файлы и директории web-сервера Apache
Приведенные файлы и директории используются для настройки Apache-сервера. В данном документе уникальных настроек не приводится. Этот раздел создан для ознакомительных целей.
/etc/apache2 — директория конфигурационных файлов Apache.
/etc/apache2/apache2.conf — основной файл конфигурации сервера. Он отвечает за множество настроек сервера. Например, включить чтение файла .htaccess необходимо именно здесь.
/etc/apache2/envvars — файл значения переменных среды для Apache.
/etc/apache2/magic — отображает инструкции для определения типа файла на сервере и клиенте.
/etc/apache2/ports.conf — настройка слушающих портов по умолчанию.
/etc/apache2/sites-available/ — директория конфигураций виртуальных хостов.
/etc/apache2/sites-enabled/ — здесь хранится информация об активных виртуальных хостах.
/etc/apache2/conf-available/ — директория настроек хостов, не относящихся к виртуальным.
/etc/apache2/conf-enabled/ — ссылки на включенные хосты, не относящиеся к виртуальным.
/etc/apache2/mods-available/ и /etc/apache2/mods-enabled/ — директории модулей. Модули, а также их настройки расположены здесь.
/var/www — директория для хранения web-приложений. Обычно виртуальные хосты тоже хранят здесь. Может быть изменена.
/var/log/apache2 — директория файлов логирования, содержит в себе два файла, ранее в этой инструкции было описано какой из них за что отвечает.
Безопасность web-сервера Apache
Сервер, который смотрит в интернет, вне зависимости от задач на него возложенных, находится в опасности. Он может быть атакован злоумышленниками с последующим вмешательством в его функциональность. Рассмотрим защиту от доступа неблагонадежных пользователей к серверу по протоколу SSH.
В Linux-системах отличным решением является утилита Fail2ban. Принцип ее работы основан на отслеживании файлов логирования доступа к серверу. По заданному количеству попыток обращений создается правило блокировки ip-адреса, с которого предположительно происходит вторжение.
Установка и настройка Fail2ban
sudo apt-get install fail2ban -y
Утилита из коробки включает защиту от перебора паролей. Но в нашем случае перед включением будут внесены несколько изменений.
/etc/fail2ban/jail.conf — отвечает за настройки безопасности конкретных сервисов.
Вносить изменения в него не рекомендуется, поэтому создадим новый файл с расширением .local. Эти файлы имеют приоритет выше, чем файл .conf для Fail2ban.
sudo nano /etc/fail2ban/jail.local
Внесем настройки для защиты SSH:
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
bantime = 60
Построчно:
Директива [sshd] отвечает за защиту доступа по SSH при отказе в авторизации;
enabled = true — состояние;
port = 22 — номер порта;
filter = sshd — имя, по которому идет поиск в логах сервиса;
logpath = /var/log/auth.log — файл журнала, из которого будут взяты результаты поиска по фильтру;
maxretry = 4 — количество неудачных попыток;
bantime = 60 — время блокировки в секундах. Сейчас эта секция добавлена для тестовой инструкции, в продакшене обычно время блокировки больше.
С настройкой закончили, добавим демона fail2ban в загрузку и запустим, а потом проверим его работу.
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Как мы видим, доступ заблокирован после превышения попыток авторизации.
Через 60 секунд доступ появится.
Для того, чтобы разблокировать доступ, принудительно используется команда:
sudo fail2ban-client set sshd unbanip ip_add
ip_add — заблокированный адрес.
Установка и настройка Apache на Windows Server
Рассмотрим также установку HTTP-сервера Apache на операционную систему Windows. В примере будем использовать Microsoft® Windows Server 2019 Standard.
Подготовка системы
Предположим, что операционная система уже установлена на сервер, а также имеется общедоступный IP‑адрес.
Для работы веб-сервера Apache в системе должен быть установлен пакет Microsoft Visual C++ Redistributable, который необходим для запуска приложений, созданных в Microsoft Visual Studio. Подробная информация и ссылки для скачивания различных версий можно найти на странице Microsoft. Мы воспользуемся последним выпуском для платформы x64, ссылку на который копируем в буфер обмена.
Переходим к работе с сервером. В нашем случае он называется Wendy.
Почти вся дальнейшая работа будет выполняться в консоли панели управления. Взаимодействие с операционной системой Windows Server осуществляется через графический интерфейс. Наиболее удобный способ дистанционно работать с ОС Windows — воспользоваться одной из программ, предназначенных для обмена данными по протоколу RDP.
RDP (Remote Desktop Protocol) — это протокол удаленного доступа, разработанный Microsoft. Он позволяет подключаться к другому компьютеру через сетевое соединение, видеть его экран и взаимодействовать с ним через интерфейс программы.
В операционных системах от Microsoft уже встроена утилита «Подключение к удаленному рабочему столу». Также существуют RDP-клиенты для macOS, Linux, Android и iOS.
Использование дополнительного необязательного ПО выходит за рамки данной инструкции, поэтому мы прибегнем к минималистичному, хоть и не самому удобному способу — будем взаимодействовать с сервером через браузер. Для удобства его рабочий стол можно развернуть во весь экран.
Запускаем Internet Explorer и вставляем в адресную строку скопированную ранее ссылку на последнюю версию Visual C++ Redistributable, сохраняем пакет и запускаем установщик.
Установка Apache
На официальной странице веб‑сервера Apache сказано, что для систем Microsoft готовые сборки не поддерживаются. Однако предоставляется список доверенных сайтов, где готовую сборку можно взять. Мы воспользуемся самым первым — apachelounge.com.
Выбирая место на диске для размещения Apache, следует иметь в виду один нюанс. Пакет сконфигурирован так, что без дополнительных действий он будет работать только при установке в корневую папку директории C:\, то есть главный исполняемый файл httpd.exe оказывается в каталоге C:\Apache24\bin. В противном случае, в файле Apache24\conf\httpd.conf необходимо переопределить переменную SRVROOT: изменить значение по умолчанию «c:/Apache24» на актуальный путь файлов веб‑сервера.
Define SRVROOT "c:/Apache24"
Обратите внимание, что для обозначения пути используется слэш, а не обратный слэш!
Мы не рассматриваем в статье глубокую настройку Apache, такую как разрешение выполнять скрипты Perl и CGI. Необходимую информацию можно найти в документации.
Продолжим работу в консоли. Проверим работоспособность веб-сервера. Перейдем в каталог, где находится файлы Apache (по умолчанию, это C: \Apache24) и запустим приложение:
> cd C:\Apache24
> .\httpd.exe
Обратите внимание на точку в начале команды — она задает текущий каталог явно!
Открываем Internet Explorer и ввводим в адресную строку localhost. Должна отобразиться надпись It works.
Покинем временно консоль в панели управления и воспользуемся браузером, который используем в повседневные жизни. Введем в его адресную строку IP-адрес хоста, на котором запущен Apache. В нашем случае — это 5.159.102.111. Страница окажется недоступной — брандмауэр Windows блокирует доступ к серверу.
Настройка правил брандмауэра
Чтобы к Apache можно было достучаться из публичной сети, необходимо добавить правило для межсетевого экрана. Открываем меню Пуск и в строке поиска вводим firewall:
Переходим в раздел углубленных настроек:
Далее в разделе входящих соединений создаем правило для программы, где указываем путь к исполняемого файлу Apache — httpd.exe:
Путь к файлу программы удобнее всего задать, воспользовавшись кнопкой Browse:
На следующем шаге разрешаем соединения:
Убеждаемся, что все галочки выставлены:
Скриншот последнего шага приводить не будем — он очень прост: необходимо придумать произвольное имя для созданного правила.
Вновь покидаем панель управления и возвращаемся к обычному браузеру. Видим, что наш веб-сервер работает и доступен из интернета:
Способы запуска
Обычно сервер выполняется в системе в качестве службы. Для этого можно использовать следующие команды, открыв ту же консоль CMD или powershell:
- httpd.exe -k start — для запуска,
- httpd.exe -k stop — для остановки,
- httpd.exe -k restart — для перезапуска.
Обратите внимание, консоль должна открываться от имени администратора — в противном случае для управления процессом не хватит прав.
Заключение
На этом инструкция по настройке web-сервера Apache завершена. Подведем итог: мы настроили один из самых популярных web-серверов и доступ к нему по протоколу HTTPS , изучили возможность настройки виртуальных хостов и обезопасили сервер от злоумышленников. На данном этапе администратор может самостоятельно обслуживать и настраивать Apache web-сервер на linux.
Другие материалы по работе с Apache
modsecurity is web application firewall. it’s a custom module that can be installed for web server under windows or linux to secure your server, if you want install it under windows you need to compile it, and of course compile it not easy because you need to do many change to adapt your server environment so we will try to find a ready compiled modsecurity project for windows let’s see.
Install Modsecurity Apache Windows
Before you even install mod_security module in your server, you have to download a compiled and compatible mod_security project and not the open source project available at modsecurity official website, so you cant get compiled modsecurity version from official website that’s why you need to get it from a partner website, below links is where to get mod_security compiled project. you will not get last version from those website fast because it will take time to change and compile the project, so until now the available modsecurity version in official website is mod_security3 but in partner website is mod_security 2.9.3.
Before you start download you have to choose between mod_security version 64bits or 32bits depending your apache version, to check what is your current apache platform 64 bit or 32 bit you have to use one of below php function apache_get_modules or phpinfo.
echo apache_get_modules();
echo phpinfo();
- Apache Haus
- Apache Lounge
After you download the mod_security-x.x.x.zip extract it and search for the .so file inside the extracted folder, it may mod_security1.so mod_security2.so mod_security3.so we only need that file to install and activate mode security
Install modsecurity Wamp Xampp Easyphp Windows
To install modsecurity in wamp or xampp or easyphp is the same thing, you only need to copy mod_security.so file inside your apache module folder next load the mod_security module from apache configuration httpd.conf let’s see them step by step.
- Copy mod_security.so inside apache module folder
- Copy yajl.dll inside apache bin folder
- Add mod_security.so to httpd.conf
- restart
Copy mod_security.so inside apache module folder
Locate where your apache folder module is, for xampp is something like C:/xampp/apache/modules for easyphp is something like C:/EasyPHP/eds-binaries/httpserver/apache/modules and for wamp is something like D:/wamp/bin/apache/apache/modules just copy mod_security.so file inside that module folder.
Copy yajl.dll inside apache bin folder
There is a few dll files come with the modsecurity archive like yajl.dll copy those files to apache/bin
Add mod_security.so to httpd.conf
Next you have to add or call or load the mod_security.so file from the httpd.conf… the httpd.conf file for wamp xampp easyphp is inside apache/conf/httpd.conf the name of the module is so much important, the module file must be like this mod_something and the reference name of module inside httpd.conf must be reversed like this something_module, like below:
LoadModule security2_module modules/mod_security2.so
Restart Server
After you installed the mod_security and you changed in httpd.conf you have to restart your server whatever it was under xampp wamp or easyphp
Test mod_security module
To test if modsecurity module installed or no you can use phpinfo and search for mod_security availability in the phpinfo interface. you can also check using htaccess file like below write anything wrong inside the <IfModule mod_security2.so></IfModule> if you get server error that mean the mod_security installed otherwise if there is no error, that mean modsecurity not installed and it’s not working…
<IfModule mod_security2.so>
This line is wrong and it must throw error
</IfModule>
Although Apache server has a good reputation for its embedded security, it still has optional default functionalities, that if not correctly configured, can put your server at risk. So, it is vital to follow specific security practices that will improve the security standpoint of your server.
In this step-by-step guide to securing your Apache web server, we’ll go through some of these best practices, including updates, backups, installing and removing unnecessary modules, setting up a WAF, and more. To demonstrate step-by-step, we’ll use the Apache server installed on Ubuntu 20.04.2 LTS running on an AWS EC2.
Table of Contents
- First things, first, Backup, Update, and Upgrade
- Back up your Apache configuration file.
- Add an updated Apache2 repository.
- Upgrade your Apache server.
- Avoid sensitive information from displaying publicly.
- Disable ServerSignature and set ServerTokens to Prod.
- Disable mod_info and mod_status.
- Disable Directory Listing.
- Disable Unnecessary Modules and Services.
- Disable some services, including CGI execution, symbolic links, and server-side includes.
- Create Appropriate User and Group
- Specify user and group.
- Let’s create a new user and group.
- Enable the Security and Evasive Modules.
- Install and configure the Security Module.
- Enable and Add the Core Rule Set.
- Installing and Configuring Mod_evasive.
- Enable logging.
- Edit logs
1. First things, first, Backup, Update, and Upgrade!
One of the most critical security measurements for any server is updates. When you update and upgrade your Apache server regularly with the latest version, you’re ensuring the latest features and security fixes (patches).
Updating your Apache web server is straightforward. All you need to do is backup, install prerequisites, add a repository, and update.
- To see what is your current Apache version. For example, use the command: “apache2 -version”.
a. Back up your Apache configuration file
Before updating and tweaking the security settings of your Apache server it is of paramount importance to backup up your Apache’s configuration file. Depending on the Apache installation and distribution, your “httpd.conf or apache2.conf” might be located on paths like:
- /etc/apache2/httpd.conf
- /etc/apache2/apache2.conf
- /etc/httpd/httpd.conf
- /etc/httpd/conf/httpd.conf
Run the following command to create a backup of your configuration file.
This command will create an “apache2.conf.bak” and save it under the same folder as “apache2.conf”
- $ sudo cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf.bak
b. Add an updated Apache2 repository.
Run the following commands to add and update the Apache2 PPA repository. The first command (software-properties-common) is a prerequisite package. It provides useful scripts for adding or removing PPAs.
- $ sudo apt-get install software-properties-common
- $ sudo add-apt-repository ppa:ondrej/apache2
- $ sudo apt-get update
Bear in mind that updating is not enough. The update command keeps the package list up to date with the latest available versions, but it does not install (upgrades) the package.
So to make your update take effect, you’ll need to upgrade.
c. Upgrade your Apache server
Running the (apt-get update) followed by the (upgrade) commands is relatively a safe operation. This is because these commands only download and install bug fixes and security patches.
BUT WAIT! Before upgrading, especially if you are upgrading a web server in production, keep in mind the following:
- Always upgrade to a stable version. Unstable versions can be risky for your website.
- According to Apache’s upgrade policy: The upgrades are backward compatible. Therefore, updating shouldn’t cause issues with at least 3 “earlier” releases.
- If you are upgrading an old live server and unsure if the upgrade will come out successful, try running the upgrade to a sandbox (test server). Create an image of the whole system (Apache server) and run it within a virtual box. Then test the apt update/upgrade and see the behavior.
To upgrade, run the following command:
- $ sudo apt-get upgrade
2. Avoid sensitive information from displaying publicly.
By default, your Apache web server responds to specific requests made by clients. Some of these responses contain sensitive information, such as web server version number, server’s OS details, the Apache modules, and more.
While gathering intelligence, a hacker can gain a good deal of fingerprint information by simply getting the webserver itself to provide server-generated documents. Attackers can then exploit vulnerabilities on these systems and try to gain access.
a. Disable ServerSignature and set ServerTokens to Prod
The ServerSignature allows adding a footer line to the server-generated documents. This line shows the Apache webserver name, OS, and version number under server-generated documents like errors. For example, the ServerSignature might have three possible values: On, Off, or E-Mail.
The ServerTokens, on the other hand, determines the type of information sent back in the Apache Server’s response header field. This Apache directive can be set to Full, Prod, Major, Minor, Min, or OS. In this case, the directive should be set to “Prod” to ensure the server returns “Apache” in the server response header.
Changing these directives.
To turn off the ServerSignature Directive , and ServerTokens you’ll need to access and edit the Apache configuration file. Use Vi (or Vim) to edit your configuration file:
- $ sudo vi /etc/apache2/apache2.conf
Add (or modify) the two lines below the configuration file.
- ServerSignature Off
- ServerTokens Prod
Restart the Apache service, and check whether it is enabled.
- $sudo service apache2 restart
- $service –status-all
b. Disable mod_info and mod_status
The mod_status provides useful /server-status information while the mod_info provides the /server-info.
By default, these modules are enabled. With the mod_info module, the entire system’s configuration information may be visible from the “/server-info” page. This page exposes sensitive information such as server version, database names, system paths, and more. The mod_file is configured and viewed under the <Location /server-info>, (example.com/server-info, for example).
These two (mod_info and mod_status) modules are beneficial for administration and monitoring. However, if you need to use them, you can secure them by using the HTTP Basic Auth or make them only accessible from localhost (127.0.0.1).
To disable the server-info directive
you’ll need to comment out (#) the mod_info module found in Apache’s configuration file.
And also, comment out configuration related to server-info.
The status module (mod_status) helps an Apache server admin know the performance and health of the server. When this module is enabled, the directive <Location /server-status> shows an HTML page with information such as server uptime, load, current HTTP request, and client’s IP addresses. If a hacker has access to this information, they can craft an attack like a DDoS and bring the website’s service down.
To disable the server-status directive
you’ll also need to comment the LoadModule on mod_status and comment out the configuration on the “httpd.conf” or “apache2.conf” file.
c. Disable Directory Listing
By default, the Apache server will list all the contents of the root directory. If this directive is enabled, an attacker could find and view any file and reverse-engineer an application to get its source code.
To turn off this directory listing for a specific directory, for example, within your website/directory, you would need to modify the “Options” directive in the configuration (httpd.conf or apache2.conf) file.,
- Set the Options to -Indexes:
3. Disable Unnecessary Modules and Services
By default, the Apache server comes with many pre-installed and enabled modules (as mod_status and mod_info). If you are not using a specific module, it is better to disable it. Leaving all modules enabled might make everything work smoothly, but it also opens many doors for security vulnerabilities.
Use Apache’s official module index to learn about all the available modules. To get a list of all currently loaded modules in your Apache server and which ones you are not currently using, use the following command:
- $ apache2ctl -M
In addition, Debian and Ubuntu come with two features that help you enable or disable modules faster, in the case of Apache2. These two scripts modify the mods-enabled file in “/etc/apache2/mods-enabled”.
- $ a2enmod [name]: Enable a specific module in the Apache2 configuration. You can also use this script to display a list of all available modules.
- $ a2dismod [name]: Disable a specific module in the Apache2 configuration
To disable an Apache module in other Linux distributions such as CentOS, Fedora, or Redhat (RHEL), you’ll need to modify Apache’s module configuration (.conf) file stored under the /etc/httpd/conf.d/ directory. First, back up the modulename.conf to modulename.bak, and restart the httpd service.
a. Disable some services, including CGI execution, symbolic links, and server-side includes
If you are not using CGI execution, symbolic links, and server-side includes services, you may want to disable them. However, if not configured properly, these services may put your web server at risk. To disable them from your server’s root directory and its sub-directories, open the Apache configuration file and find the “Options” directive.
- Change Options to -ExecCGI -FollowSymLinks -Includes
4. Create Appropriate User and Group
By default, for security reasons, the new Apache installations do not give access to run system commands; it only provides access to the DocumentRoot directory. So, the Apache process would typically run with an unprivileged user and group.
The default user and group names given to the Apache process will vary from every distribution. For example, in Debian and Ubuntu, Apache runs user and group: “www-data” by default, and in CentOS, Apache uses “apache.”
Although the security is already enforced, when different processes within the server, like Apache, MySQL, PHP, etc., use the same user/group name, a security issue in one process might lead to exploits in these other processes.
So, as a best security practice, create a brand new user.
a. Specify user and group
There are various methods to determine the user and group in Apache. The easiest way is to take a look at your Apache’s configuration file. Find the User and Group directives and set the name that you want the Apache process to run with.
Avoid running Apache as “Root,” as an exploited script can grant full access to the server.
- For Ubuntu and Debian, you might not find the specific user/group but an environment variable specified under the “envvars” file.
To see the user and group use the same method Apache does to set them; display the line of text of both variables like:
In addition, you can also use the “$apachectl -S” command to show general information on your Apache server, including User and Group.
b. Let’s create a new user and group
Use the following commands to create a new user and group.
- $ sudo groupadd pcwdld
- $ sudo useradd -g pcwdld pcwdld
Ensure the new user and group have the correct permission to the folder.
- $ sudo chown -R pcwdld:pcwdld /var/www/html/
Modify the configuration file with the new User and Group, with:
- $ sudo vi apache2.conf
Restart the Apache2 service.
- $ sudo service apache2 restart
Verify if the Apache process is using the new user, using the command:
- $ apachectl -S
5. Enable the Security and Evasive Modules
There are two popular modules “mod_security” and “mod_evasive” that will help improve Apache’s server security standpoint. These two modules are used to protect a web server against potential DDoS, brute-force, and SQL injection attacks.
- ModSecurity is an open-source Web Application Firewall (WAF) engine for Apache, IIS, and Nginx. It provides key security functionalities, such as filtering, intrusion detection and prevention, identity masking, null-byte attack prevention, and real-time traffic monitoring.
- Mod_evasive is an open-source module for Apache designed to evade DoS, DDoS, and brute force attacks. To evade potential DoS/DDoS attacks, Mod_evasive can be used as a detection-filtering tool for IP addresses that send too many concurrent requests or are blacklisted.
Do you need both? Mod_security and Mod_evasive?
By itself, ModSecurity takes care of a wide range of security tasks, including protection from DDoS and Brute force, which is exactly what mod_evasive does. Still, mod_evasive is useful for dealing with DDoS’s floods of unnecessary requests that can bring a server down.
a. Install and configure the Security Module.
To install mod_security in Apache (for Ubuntu or Debian), use the following commands:
- Update your repositories: $sudo apt update -y
- Install the ModSecurity: $sudo apt install libapache2-mod-security2
- Enable the module: $sudo a2enmod security2
- Ensure the module is on: $sudo apachectl -M | grep security
- Restart the service: $sudo service apache2 restart
- Show the configuration output with: $apt-cache show libapache2-mod-security2
As you can see, from the above screenshot, by default, helpful in there are no security rules configured. Create a backup of the mod_security configuration file and then open it with the vi editor.
- $sudo cp /etc/modsecurity/modsecurity.conf{-recommended,}
- $sudo vi /etc/modsecurity/modsecurity.conf
- Then change the “SecRuleEngine” to “On” (as shown in the screenshot below)
b. Enable and Add the Core Rule Set
To enable the recommended Open Web Application Security Project (OWASP) core rule set, use the following commands:
- $sudo apt-get install git
- $sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git
- $sudo mv /usr/share/modsecurity-crs /usr/share/modsecurity-crs.bak
- $sudo mv owasp-modsecurity-crs /usr/share/modsecurity-crs
- $sudo mv /usr/share/modsecurity-crs/crs-setup.conf.example /usr/share/modsecurity-crs/crs-setup.conf
Now, to include the OWASP’s core rule set into the security module, you’ll need to edit the ModSecurity’ configuration file.
- $sudo vi /etc/apache2/mods-enabled/security2.conf
- Include the following at the bottom of the configuration file.
- IncludeOptional “/usr/share/modsecurity-crs/*.conf
- IncludeOptional “/usr/share/modsecurity-crs/rules/*.conf
Now, restart the Apache server:
- $systemctl restart apache2
b. Installing and Configuring Mod_evasive.
To use Mod_evasive would require you to update iptables.
To install mod_evasive, use the following commands:
- Install mod_evasive:
$sudo apt-get install libapache2-mod-evasive - Enable mod_evasive:
$sudo a2enmod evasive - Ensure the module is on:
$ sudo apachectl -M | grep evasive
To get some help on the correct parameters for mod_evasive, refer to the Mod_evasive README file.
- Open and edit the evasive configuration file:
$sudo vi /etc/apache2/mods-available/evasive.conf - Edit the file by removing comments (#) and set the recommended values for Apache 2.0:
- DOSHashTableSize 3097
- DOSPageCount 2
- DOSSiteCount 50
- DOSPageInterval 1
- DOSSiteInterval 1
- DOSBlockingPeriod 10
- In addition, don’t forget to configure your email for notification and the directory for the logs.
6. Enable Logging
Apache is capable of logging events that were handled by the Apache server. All the activity happening in and around your Apache server, from login attempts, client requests, responses sent, and internal actions of the webserver, are considered security events.
Therefore, most of these events should be logged so that you are aware of the current state of affairs around your Apache server.
To make Apache start logging (independent from your OS logs), you’ll need to use the mod_log_config module (log_config_module). This module is static, which means that it is compiled by default into the configuration file. This module creates log files using three different directives:
- TransferLog, to create the log.
- LogFormat, to specify a log format
- CustomLog, to create and format the log.
a. Edit Logs.
These directives are specified under the Apache configuration file. To see them and edit, you’ll need to use the vi editor.
- sudo vi /etc/apache2/apache2.conf
Use the following source to learn how to configure the Apache Logging Basics.
In addition, you can use third-party tools like SolarWinds Loggly to centralize, manage, and analyze all logs not only from the Apache server but from your entire environment.